Nutika lepingu aadressi määramine enne juurutamist: CREATE2 kasutamine krüptovahetuse jaoks

Plokiahela teema ei lakka kunagi olemast mitte ainult kõikvõimaliku hüpe, vaid ka tehnoloogilisest aspektist väga väärtuslike ideede allikas. Seetõttu ei läinud see päikeselise linna elanikest mööda. Inimesed vaatavad tähelepanelikult, õpivad ja püüavad oma traditsioonilise infoturbe alast teadmisi plokiahelasüsteemidesse üle kanda. Siiani on see paigas: üks Rostelecom-Solari arendustest võib kontrollida plokiahelapõhise tarkvara turvalisust. Ja selle käigus tekivad mõned mõtted plokiahela kogukonna rakendusprobleemide lahendamisel. Ühte neist eluhäkkidest – kuidas määrata nutika lepingu aadress enne juurutamist CREATE2 abil – tahan täna teiega jagada.

Nutika lepingu aadressi määramine enne juurutamist: CREATE2 kasutamine krüptovahetuse jaoks
CREATE2 opkood lisati Konstantinoopoli kõvakahvlisse selle aasta 28. veebruaril. Nagu EIP-s öeldud, võeti see opkood kasutusele peamiselt riigikanalite jaoks. Kuid me kasutasime seda teise probleemi lahendamiseks.

Börsil on saldodega kasutajaid. Peame andma igale kasutajale Ethereumi aadressi, millele igaüks saab žetoone saata ja seeläbi oma kontot täiendada. Nimetagem neid aadresse "rahakottideks". Kui märgid saabuvad rahakottidesse, peame need saatma ühte rahakotti (hotwallet).

Järgmistes osades analüüsin võimalusi selle probleemi lahendamiseks ilma CREATE2-ta ja räägin teile, miks me neist loobusime. Kui olete huvitatud ainult lõpptulemusest, leiate selle jaotisest "Lõpplahendus".

Ethereumi aadressid

Lihtsaim lahendus on luua uutele kasutajatele uued Ethereumi aadressid. Need aadressid on rahakotid. Tokenite ülekandmiseks rahakotist hotwalletti tuleb tehing funktsiooni kutsudes allkirjastada ülekandmine () rahakoti privaatvõtmega taustaprogrammist.

Sellel lähenemisviisil on järgmised eelised:

  • see on lihtsalt
  • žetoonide rahakotist hotwalletti ülekandmise hind on võrdne funktsioonikõne maksumusega ülekandmine ()

Siiski otsustasime selle lähenemisviisi vastu, kuna sellel on üks suur puudus: peate privaatvõtmed kuskil salvestama. Neid ei saa mitte ainult kaotada, vaid peate ka nendele võtmetele juurdepääsu hoolikalt haldama. Kui vähemalt üks neist on ohus, siis konkreetse kasutaja märgid kuuma rahakotti ei jõua.

Nutika lepingu aadressi määramine enne juurutamist: CREATE2 kasutamine krüptovahetuse jaoks

Looge iga kasutaja jaoks eraldi nutikas leping

Iga kasutaja jaoks eraldi nutika lepingu juurutamine võimaldab vältida rahakottide privaatvõtmete salvestamist serverisse. Vahetus helistab sellele nutikale lepingule, et kanda žetoonid hotwalletti.

Loobusime ka sellest lahendusest, kuna ilma nutikat lepingut juurutamata ei saa kasutajale rahakoti aadressi näidata (see on tegelikult võimalik, kuid üsna keerulisel viisil koos muude puudustega, mida me siin ei käsitle). Börsil saab kasutaja luua nii palju kontosid, kui tal vaja on ja igaühel on vaja oma rahakotti. See tähendab, et peame kulutama raha lepingu juurutamiseks, olemata isegi kindlad, et kasutaja seda kontot kasutab.

Opkood CREATE2

Eelmise meetodi probleemi lahendamiseks otsustasime kasutada opkoodi CREATE2. CREATE2 võimaldab teil eelnevalt määrata aadressi, kuhu nutikas leping juurutatakse. Aadress arvutatakse järgmise valemi abil:

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


kus:

  • aadress — nutilepingu aadress, mis kutsub CREATE2
  • sool - juhuslik väärtus
  • init_code — nutikas lepingu baitkood juurutamiseks

See tagab, et kasutajale edastatav aadress sisaldab tegelikult soovitud baitkoodi. Lisaks saab seda nutikat lepingut kasutada alati, kui vajame. Näiteks kui kasutaja otsustab oma rahakotti esimest korda kasutada.
Nutika lepingu aadressi määramine enne juurutamist: CREATE2 kasutamine krüptovahetuse jaoks
Lisaks saate nutika lepingu aadressi iga kord selle salvestamise asemel arvutada, kuna:

  • aadress valemis on konstantne, kuna see on meie rahakotitehase aadress
  • sool — user_id hash
  • init_code on konstantne, kuna kasutame sama rahakotti

Rohkem täiustusi

Eelmisel lahendusel on endiselt üks puudus: nutika lepingu juurutamiseks peate maksma. Siiski saate sellest lahti saada. Selleks saate funktsiooni kutsuda ülekandmine ()ja siis enesehäving() rahakoti konstruktoris. Ja siis tagastatakse nutika lepingu juurutamiseks vajalik gaas.

Vastupidiselt levinud arvamusele saate CREATE2 opkoodiga nutika lepingu samale aadressile mitu korda juurutada. Seda seetõttu, et CREATE2 kontrollib, et sihtaadressi nonce on null (sellele omistatakse konstruktori alguses väärtus "1"). Sel juhul funktsioon enesehäving() lähtestab iga kord nonce aadressid. Nii et kui helistate CREATE2 uuesti samade argumentidega, läheb nonce-kontroll läbi.

Pange tähele, et see lahendus sarnaneb Ethereumi aadressi valikuga, kuid ilma privaatvõtmete salvestamise vajaduseta. Rahakotist hotwalletti raha ülekandmise hind on ligikaudu võrdne funktsioonile helistamise kuluga ülekandmine (), kuna me ei maksa nutika lepingu juurutamise eest.

Lõplik otsus

Nutika lepingu aadressi määramine enne juurutamist: CREATE2 kasutamine krüptovahetuse jaoks

Algselt koostas:

  • funktsioon soola kätte saamiseks USER_ID
  • nutikas leping, mis kutsub CREATE2 opkoodi koos sobiva soolaga (st rahakotitehas)
  • rahakoti baidikood, mis vastab järgmise konstruktoriga sõlmitud lepingule:

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


Igale uuele kasutajale näitame arvutuslikult tema rahakoti aadressi

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


Kui kasutaja kannab žetoonid vastavale rahakoti aadressile, näeb meie taustaprogramm parameetriga Transfer sündmust _to, võrdne rahakoti aadressiga. Siinkohal on juba enne rahakoti kasutuselevõttu võimalik börsil kasutaja saldot suurendada.

Kui rahakoti aadressi koguneb piisav arv märke, saame need kõik korraga hotwalletti üle kanda. Selleks kutsub taustaprogramm nutika lepingu tehase funktsiooni, mis teeb järgmised toimingud:

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


Seega kutsutakse välja rahakoti nutika lepingu konstruktor, mis kannab kõik oma märgid hotwalleti aadressile ja seejärel ise hävitab.

Täielik kood on leitav siin. Pange tähele, et see ei ole meie tootmiskood, kuna otsustasime optimeerida rahakoti baitkoodi ja kirjutasime selle opkoodidesse.

Autor Pavel Kondratenkov, Ethereumi spetsialist

Allikas: www.habr.com

Lisa kommentaar