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.
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.
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.
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
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
Autors PÄvels Kondratenkovs, Ethereum speciÄlists
Avots: www.habr.com