Kā pirms izvietoÅ”anas noteikt viedā lÄ«guma adresi: izmantojot CREATE2 kriptovalÅ«tu apmaiņai

Blokķēdes tēma nebeidz bÅ«t ne tikai visdažādāko ažiotāžu, bet arÄ« ļoti vērtÄ«gu ideju avots no tehnoloÄ£iskā viedokļa. Tāpēc viņa neapgāja saulainās pilsētas iedzÄ«votājus. Cilvēki rÅ«pÄ«gi pēta, pēta, mēģina novirzÄ«t savas zināŔanas tradicionālajā informācijas bāzē uz blokķēdes sistēmām. Pagaidām precÄ«zāk: viena no Rostelecom-Solar izstrādēm spēj pārbaudÄ«t programmatÅ«ras droŔību, kuras pamatā ir blokķēde. Un pa ceļam rodas domas par blokķēdes kopienas lietiŔķo problēmu risināŔanu. Viens no Å”iem dzÄ«ves hacks ā€” kā noteikt viedā lÄ«guma adresi pirms izvietoÅ”anas, izmantojot CREATE2 ā€” Å”odien es vēlos dalÄ«ties ar jums.

Kā pirms izvietoÅ”anas noteikt viedā lÄ«guma adresi: izmantojot CREATE2 kriptovalÅ«tu apmaiņai
CREATE2 opkods tika pievienots Konstantinopoles cietajā dakŔā Ŕī gada 28. februārÄ«. Kā norādÄ«ts EIP, Å”is operācijas kods tika ieviests galvenokārt valsts kanāliem. Tomēr mēs to izmantojām, lai atrisinātu citu problēmu.

Biržā ir lietotāji ar atlikumiem. Mums ir jānodroÅ”ina katram lietotājam Ethereum adrese, uz kuru ikviens var nosÅ«tÄ«t marÄ·ierus, tādējādi papildinot savu kontu. Sauksim Ŕīs adreses par "makiem". Kad žetoni nonāk makos, mums tie ir jānosÅ«ta uz vienu maku (hotwallet).

Nākamajās sadaļās es analizēju Ŕīs problēmas risināŔanas iespējas bez CREATE2 un paskaidroju, kāpēc mēs no tām atteicāmies. Ja interesē tikai gala rezultāts, to var atrast sadaļā GalÄ«gais risinājums.

Ethereum adreses

VienkārŔākais risinājums ir Ä£enerēt jaunas ethereum adreses jauniem lietotājiem. Å Ä«s adreses bÅ«s maki. Lai pārsÅ«tÄ«tu žetonus no maka uz karsto maku, jāparaksta darÄ«jums, izsaucot funkciju pārsÅ«tÄ«t () ar maka privāto atslēgu no aizmugursistēmas.

Šai pieejai ir Ŕādas priekŔrocības:

  • tas ir vienkārÅ”i
  • žetonu pārsÅ«tÄ«Å”anas izmaksas no seifa uz karsto maku ir vienādas ar funkcijas izsaukÅ”anas izmaksām pārsÅ«tÄ«t ()

Tomēr mēs atteicāmies no Ŕīs pieejas, jo tai ir viens bÅ«tisks trÅ«kums: jums kaut kur jāglabā privātās atslēgas. Un tas ir ne tikai tas, ka tos var pazaudēt, bet arÄ« jums rÅ«pÄ«gi jāpārvalda piekļuve Ŕīm atslēgām. Ja vismaz viens no tiem ir apdraudēts, tad konkrēta lietotāja žetoni nesasniegs karsto maku.

Kā pirms izvietoÅ”anas noteikt viedā lÄ«guma adresi: izmantojot CREATE2 kriptovalÅ«tu apmaiņai

Izveidojiet atseviŔķu viedo līgumu katram lietotājam

AtseviŔķa viedā lÄ«guma izvietoÅ”ana katram lietotājam ļauj serverÄ« neglabāt privātās atslēgas no makiem. Birža izsauks Å”o viedo lÄ«gumu, lai pārsÅ«tÄ«tu marÄ·ierus uz karsto maku.

Mēs arÄ« atteicāmies no Ŕī risinājuma, jo lietotājam nevar parādÄ«t viņa maka adresi, neizvietojot viedo lÄ«gumu (tas faktiski ir iespējams, bet diezgan sarežģītā veidā ar citiem trÅ«kumiem, kurus mēs Å”eit neapspriedÄ«sim). Biržā lietotājs var izveidot tik daudz kontu, cik viņam nepiecieÅ”ams, un katram ir nepiecieÅ”ams savs maks. Tas nozÄ«mē, ka mums ir jātērē nauda lÄ«guma izvietoÅ”anai, pat nepārliecinoties, ka lietotājs izmantos Å”o kontu.

Opkods CREATE2

Lai atrisinātu iepriekŔējās metodes problēmu, mēs nolēmām izmantot operācijas kodu CREATE2. CREATE2 ļauj iepriekÅ” noteikt adresi, kurā tiks izvietots viedais lÄ«gums. Adrese tiek aprēķināta, izmantojot Ŕādu formulu:

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


, kur:

  • adrese ā€” viedā lÄ«guma adrese, kas izsauks CREATE2
  • sāls - nejauÅ”a vērtÄ«ba
  • init_code - viedais lÄ«guma baitu kods izvietoÅ”anai

Tas nodroÅ”ina, ka adrese, kuru mēs sniedzam lietotājam, patieŔām saturēs vēlamo baitu kodu. Turklāt Å”o viedo lÄ«gumu var izmantot, kad vien tas ir nepiecieÅ”ams. Piemēram, kad lietotājs nolemj pirmo reizi izmantot savu maku.
Kā pirms izvietoÅ”anas noteikt viedā lÄ«guma adresi: izmantojot CREATE2 kriptovalÅ«tu apmaiņai
Turklāt jūs varat katru reizi aprēķināt viedā līguma adresi, nevis to saglabāt, jo:

  • adrese formulā ir nemainÄ«ga, jo tā ir mÅ«su maku rÅ«pnÄ«cas adrese
  • sāls - user_id hash
  • init_code ir pastāvÄ«gs, jo mēs izmantojam vienu un to paÅ”u maku

Vairāk uzlabojumu

IepriekŔējam risinājumam joprojām ir viens trÅ«kums: jums ir jāmaksā par viedā lÄ«guma izvietoÅ”anu. Tomēr jÅ«s varat no tā atbrÄ«voties. Å im nolÅ«kam varat izsaukt funkciju pārsÅ«tÄ«t ()un tad paÅ”iznÄ«cināties() maka konstruktorā. Un tad tiks atgriezta gāze viedā lÄ«guma izvietoÅ”anai.

Pretēji izplatÄ«tajam uzskatam, viedo lÄ«gumu var izvietot uz vienu un to paÅ”u adresi vairākas reizes, izmantojot CREATE2 opkodu. Tas ir tāpēc, ka CREATE2 pārbauda, ā€‹ā€‹vai mērÄ·a adreses nonce ir nulle (konstruktora sākumā tam tiek pieŔķirta vērtÄ«ba "1"). Tajā paŔā laikā funkcija paÅ”iznÄ«cināties() katru reizi atiestata nonce adresi. Tādējādi, ja vēlreiz izsaucat CREATE2 ar tiem paÅ”iem argumentiem, pārbaude nonce tiks izturēta.

LÅ«dzu, ņemiet vērā, ka Å”is risinājums ir lÄ«dzÄ«gs ethereum adreses risinājumam, taču bez nepiecieÅ”amÄ«bas uzglabāt privātās atslēgas. Naudas pārsÅ«tÄ«Å”anas izmaksas no maka uz karsto maku ir aptuveni vienādas ar funkcijas izsaukÅ”anas izmaksām pārsÅ«tÄ«t (), jo mēs nemaksājam par viedā lÄ«guma izvietoÅ”anu.

Gala lēmums

Kā pirms izvietoÅ”anas noteikt viedā lÄ«guma adresi: izmantojot CREATE2 kriptovalÅ«tu apmaiņai

Sākotnēji sagatavots:

  • funkcija, lai iegÅ«tu sāli user_id
  • viedais lÄ«gums, kas izsauks CREATE2 operācijas kodu ar atbilstoÅ”o sāli (t.i., seifa rÅ«pnÄ«cu)
  • maka baita kods, kas atbilst lÄ«gumam ar Ŕādu konstruktoru:

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


Katram jaunam lietotājam, aprēķinot, rādām viņa maka adresi

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


Kad lietotājs pārsÅ«ta marÄ·ierus uz atbilstoÅ”o maka adresi, mÅ«su aizmugursistēma redz notikumu Transfer ar parametru _uzvienāda ar maka adresi. Å ajā brÄ«dÄ« jau ir iespējams palielināt lietotāja bilanci biržā pirms maka izvietoÅ”anas.

Kad maka adresē uzkrājas pietiekami daudz žetonu, mēs varam tos visus uzreiz pārsÅ«tÄ«t uz karsto maku. Lai to izdarÄ«tu, aizmugursistēma izsauc viedo lÄ«gumu rÅ«pnÄ«cas funkciju, kas veic Ŕādas darbÄ«bas:

function deployWallet (сŠ¾Š»ŃŒ uint256) {
    bytes memory walletBytecode =ā€¦;
    // invoke CREATE2 with wallet bytecode and salt
}


Tādējādi tiek izsaukts maka viedā lÄ«guma konstruktors, kas visus savus marÄ·ierus pārsÅ«ta uz karstmaka adresi un pēc tam paÅ”iznÄ«cina.

Pilnu kodu var atrast Å”eit. LÅ«dzu, ņemiet vērā, ka Å”is nav mÅ«su ražoÅ”anas kods, jo mēs nolēmām optimizēt seifa baitu kodu un ierakstÄ«t to opkodos.

Autors Pāvels Kondratenkovs, Ethereum speciālists

Avots: www.habr.com

Pievieno komentāru