Jak určit adresu chytré smlouvy před nasazením: pomocí CREATE2 pro krypto burzu

Téma blockchainu nepřestává být zdrojem nejen všemožného humbuku, ale i z technologického hlediska velmi cenných nápadů. Obyvatele slunného města proto neobešla. Lidé se pozorně dívají, studují a snaží se posunout své odborné znalosti v tradiční informační databázi na blockchainové systémy. Zatím bodově: jeden z vývojů Rostelecom-Solar je schopen zkontrolovat bezpečnost softwaru založeného na blockchainu. A během toho se objevují myšlenky na řešení aplikovaných problémů blockchainové komunity. Jeden z těchto life hacků – jak určit adresu chytré smlouvy před nasazením pomocí CREATE2 – se s vámi dnes chci podělit pod řezem.

Jak určit adresu chytré smlouvy před nasazením: pomocí CREATE2 pro krypto burzu
Operační kód CREATE2 byl přidán do hard forku Konstantinopole 28. února tohoto roku. Jak je uvedeno v EIP, tento operační kód byl zaveden především pro státní kanály. Použili jsme ho však k vyřešení jiného problému.

Na burze jsou uživatelé se zůstatky. Každému uživateli musíme poskytnout Ethereum adresu, na kterou může kdokoli posílat tokeny, čímž si doplní svůj účet. Říkejme těmto adresám „peněženky“. Když tokeny dorazí do peněženek, musíme je poslat do jediné peněženky (hotwallet).

V následujících částech analyzuji možnosti řešení tohoto problému bez CREATE2 a vysvětluji, proč jsme je opustili. Pokud vás zajímá pouze konečný výsledek, najdete jej v sekci Konečné řešení.

Ethereum adresy

Nejjednodušším řešením je vygenerovat nové ethereum adresy pro nové uživatele. Tyto adresy budou peněženky. Chcete-li přenést tokeny z peněženky do hotwallet, musíte transakci podepsat voláním funkce převod() se soukromým klíčem peněženky z backendu.

Tento přístup má následující výhody:

  • je to jen
  • náklady na přenos tokenů z peněženky do hotwallet se rovnají nákladům na volání funkce převod()

Tento přístup jsme však opustili, protože má jednu podstatnou nevýhodu: musíte někde uložit soukromé klíče. A nejde jen o to, že je lze ztratit, ale také o to, že přístup k těmto klíčům musíte pečlivě spravovat. Pokud je alespoň jeden z nich kompromitován, pak se tokeny určitého uživatele do horké peněženky nedostanou.

Jak určit adresu chytré smlouvy před nasazením: pomocí CREATE2 pro krypto burzu

Vytvořte samostatnou smart smlouvu pro každého uživatele

Nasazení samostatné chytré smlouvy pro každého uživatele vám umožní neukládat soukromé klíče z peněženek na server. Burza zavolá tuto inteligentní smlouvu, aby převedla tokeny do hotwallet.

Od tohoto řešení jsme také upustili, jelikož bez nasazení smart kontraktu nelze uživateli zobrazit adresu jeho peněženky (to je skutečně možné, ale poměrně komplikovaným způsobem s dalšími nevýhodami, které zde nebudeme rozebírat). Na burze si uživatel může vytvořit tolik účtů, kolik potřebuje, a každý potřebuje vlastní peněženku. To znamená, že musíme utratit peníze za nasazení smlouvy, aniž bychom si byli jisti, že uživatel tento účet použije.

Operační kód CREATE2

Abychom vyřešili problém předchozí metody, rozhodli jsme se použít operační kód CREATE2. CREATE2 umožňuje předem určit adresu, kde bude smart kontrakt nasazen. Adresa se vypočítá podle následujícího vzorce:

keccak256 (0xff ++ address ++ salt ++ keccak256 (init_code)) [12:]


, kde:

  • adresa — adresa chytré smlouvy, která bude volat CREATE2
  • sůl - náhodná hodnota
  • init_code - bytecode inteligentní smlouvy pro nasazení

Tím je zajištěno, že adresa, kterou uživateli poskytneme, bude skutečně obsahovat požadovaný bajtkód. Tuto chytrou smlouvu lze také nasadit, kdykoli potřebujeme. Například když se uživatel rozhodne poprvé použít svou peněženku.
Jak určit adresu chytré smlouvy před nasazením: pomocí CREATE2 pro krypto burzu
Kromě toho můžete adresu chytré smlouvy pokaždé vypočítat místo jejího ukládání, protože:

  • adresa ve vzorci je konstantní, protože je to adresa naší továrny na peněženky
  • sůl - hash user_id
  • init_code je trvalé, protože používáme stejnou peněženku

Další vylepšení

Předchozí řešení má stále jednu nevýhodu: musíte zaplatit za nasazení smart contractu. Můžete se ho však zbavit. K tomu můžete zavolat funkci převod()a pak sebedestrukce() v konstruktoru peněženky. A pak se plyn na nasazení smart kontraktu vrátí.

Na rozdíl od všeobecného přesvědčení můžete chytrou smlouvu nasadit na stejnou adresu několikrát s operačním kódem CREATE2. CREATE2 totiž kontroluje, že nonce cílové adresy je nulová (na začátku konstruktoru je jí přiřazena hodnota „1“). Zároveň funkce sebedestrukce() pokaždé resetuje adresu nonce. Pokud tedy znovu zavoláte CREATE2 se stejnými argumenty, kontrola nonce projde.

Upozorňujeme, že toto řešení je podobné řešení adresy ethereum, ale bez nutnosti ukládat soukromé klíče. Náklady na převod peněz z peněženky do hotwallet se přibližně rovnají nákladům na volání funkce převod(), jelikož za nasazení smart kontraktu neplatíme.

Konečné rozhodnutí

Jak určit adresu chytré smlouvy před nasazením: pomocí CREATE2 pro krypto burzu

Původně připraveno:

  • funkce pro získání soli user_id
  • inteligentní smlouva, která zavolá operační kód CREATE2 s příslušnou solí (tj. továrna na peněženky)
  • bytecode peněženky odpovídající smlouvě s následujícím konstruktorem:

constructor () {
    address hotWallet = 0x…;
    address token = 0x…;
    token.transfer (hotWallet, token.balanceOf (address (this)));
    selfdestruct (address (0));
}


Každému novému uživateli zobrazíme pomocí výpočtu adresu jeho peněženky

keccak256 (0xff ++ address ++ salt ++ keccak256 (init_code)) [12:]


Když uživatel přenese tokeny na odpovídající adresu peněženky, náš backend uvidí událost Transfer s parametrem _narovná adrese peněženky. V tuto chvíli je již možné navýšit zůstatek uživatele na burze před nasazením peněženky.

Když se na adrese peněženky nashromáždí dostatek tokenů, můžeme je všechny převést najednou do hotwallet. K tomu backend zavolá funkci smart contract factory, která provede následující akce:

function deployWallet (соль uint256) {
    bytes memory walletBytecode =…;
    // invoke CREATE2 with wallet bytecode and salt
}


Zavolá se tedy konstruktor peněženky smart contract, který přenese všechny své tokeny na adresu hotwallet a následně se sám zničí.

Kompletní kód lze nalézt zde. Upozorňujeme, že toto není náš produkční kód, protože jsme se rozhodli optimalizovat bytecode peněženky a zapsat jej do operačních kódů.

Autor Pavel Kondratenkov, specialista na Ethereum

Zdroj: www.habr.com

Přidat komentář