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

Izvietojot katram lietotājam atsevišķu viedlīgumu, vairs nav nepieciešams glabāt maku privātās atslēgas. serverisBirža izsauks šo viedlīgumu, lai pārsūtītu žetonus 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

Iegādājieties uzticamu mitināšanu vietnēm ar DDoS aizsardzību, VPS VDS serveriem 🔥 Iegādājieties uzticamu tīmekļa vietņu mitināšanu ar DDoS aizsardzību, VPS VDS serveriem | ProHoster