Jinsi ya kuamua anwani ya mkataba mzuri kabla ya kupelekwa: kwa kutumia CREATE2 kwa kubadilishana kwa crypto

Mada ya blockchain haachi kamwe kuwa chanzo cha sio tu kila aina ya hype, lakini pia mawazo ambayo ni ya thamani sana kutoka kwa mtazamo wa teknolojia. Kwa hivyo, haikuwapita wakaazi wa jiji lenye jua. Watu wanaangalia kwa karibu, kusoma, kujaribu kuhamisha utaalamu wao katika usalama wa habari wa jadi kwa mifumo ya blockchain. Kufikia sasa, iko wazi: moja ya maendeleo ya Rostelecom-Solar inaweza kuangalia usalama wa programu ya msingi wa blockchain. Na njiani, mawazo kadhaa huibuka juu ya kutatua shida zilizotumika za jamii ya blockchain. Mojawapo ya hitilafu hizi za maisha - jinsi ya kubaini anwani ya mkataba mahiri kabla ya kupelekwa kwa kutumia CREATE2 - leo ninataka kushiriki nawe chini ya mkato.

Jinsi ya kuamua anwani ya mkataba mzuri kabla ya kupelekwa: kwa kutumia CREATE2 kwa kubadilishana kwa crypto
Opcode CREATE2 iliongezwa kwenye uma gumu wa Constantinople mnamo Februari 28 mwaka huu. Kama ilivyoelezwa katika EIP, opcode hii ilianzishwa kwa ajili ya vituo vya serikali. Walakini, tuliitumia kutatua shida tofauti.

Kuna watumiaji walio na mizani kwenye ubadilishaji. Ni lazima tumpe kila mtumiaji anwani ya Ethereum ambayo mtu yeyote anaweza kutuma tokeni, na hivyo kujaza akaunti yake tena. Wacha tuite anwani hizi "pochi". Wakati ishara zinafika kwenye pochi, lazima tuzipeleke kwa mkoba mmoja (hotwallet).

Katika sehemu zifuatazo, ninachambua chaguzi za kutatua tatizo hili bila CREATE2 na kukuambia kwa nini tuliziacha. Ikiwa una nia tu ya matokeo ya mwisho, unaweza kuipata katika sehemu ya "Suluhisho la Mwisho".

Anwani za Ethereum

Suluhisho rahisi ni kuzalisha anwani mpya za Ethereum kwa watumiaji wapya. Anwani hizi zitakuwa pochi. Ili kuhamisha ishara kutoka kwa mkoba hadi hotwallet, unahitaji kusaini shughuli kwa kupiga kazi uhamisho() na ufunguo wa kibinafsi wa mkoba kutoka nyuma.

Mbinu hii ina faida zifuatazo:

  • ni rahisi
  • gharama ya kuhamisha ishara kutoka kwa mkoba hadi hotwallet ni sawa na gharama ya simu ya kazi uhamisho()

Hata hivyo, tuliamua dhidi ya njia hii kwa sababu ina drawback moja kubwa: unahitaji kuhifadhi funguo za faragha mahali fulani. Sio tu wanaweza kupotea, lakini pia unahitaji kudhibiti kwa uangalifu ufikiaji wa funguo hizi. Ikiwa angalau mmoja wao ameathiriwa, basi ishara za mtumiaji fulani hazitafikia mkoba wa moto.

Jinsi ya kuamua anwani ya mkataba mzuri kabla ya kupelekwa: kwa kutumia CREATE2 kwa kubadilishana kwa crypto

Unda mkataba mahiri tofauti kwa kila mtumiaji

Kutuma mkataba tofauti mahiri kwa kila mtumiaji hukuruhusu kuzuia kuhifadhi funguo za kibinafsi za pochi kwenye seva. Kubadilishana kutaita mkataba huu mzuri wa kuhamisha tokeni kwenye hotwallet.

Pia tuliacha suluhisho hili, kwani mtumiaji hawezi kuonyeshwa anwani yake ya mkoba bila kupeleka mkataba mzuri (hii inawezekana, lakini kwa njia ngumu na hasara zingine ambazo hatutajadili hapa). Katika kubadilishana, mtumiaji anaweza kuunda akaunti nyingi anazohitaji, na kila mmoja anahitaji mkoba wake mwenyewe. Hii inamaanisha kuwa tunahitaji kutumia pesa kupeleka mkataba bila hata kuwa na uhakika kwamba mtumiaji atatumia akaunti hii.

Opcode CREATE2

Ili kurekebisha tatizo la njia ya awali, tuliamua kutumia opcode ya CREATE2. CREATE2 hukuruhusu kubainisha mapema anwani ambapo mkataba mahiri utatumwa. Anwani inahesabiwa kwa kutumia fomula ifuatayo:

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


, ambapo:

  • anwani - anwani ya mkataba mzuri ambao utaita CREATE2
  • chumvi - thamani ya nasibu
  • init_code β€” bytecode ya mkataba mahiri kwa kupelekwa

Hii inahakikisha kwamba anwani tunayotoa kwa mtumiaji ina bytecode inayotakiwa. Zaidi ya hayo, mkataba huu mahiri unaweza kutumwa wakati wowote tunapohitaji. Kwa mfano, wakati mtumiaji anaamua kutumia pochi yake kwa mara ya kwanza.
Jinsi ya kuamua anwani ya mkataba mzuri kabla ya kupelekwa: kwa kutumia CREATE2 kwa kubadilishana kwa crypto
Zaidi ya hayo, unaweza kuhesabu anwani ya mkataba mahiri kila wakati badala ya kuihifadhi kwa sababu:

  • anwani katika formula ni mara kwa mara, kwa kuwa hii ndiyo anwani ya kiwanda cha mkoba wetu
  • chumvi - kitambulisho cha mtumiaji
  • init_code ni mara kwa mara kwani tunatumia pochi sawa

Maboresho zaidi

Suluhisho la awali bado lina drawback moja: unahitaji kulipa ili kupeleka mkataba wa smart. Walakini, unaweza kuiondoa. Kwa kufanya hivyo unaweza kupiga simu kazi uhamisho()na kisha kujiharibu() katika mjenzi wa pochi. Na kisha gesi kwa ajili ya kupeleka mkataba wa smart itarudishwa.

Kinyume na imani maarufu, unaweza kupeleka mkataba mahiri kwenye anwani moja mara nyingi kwa kutumia msimbo wa CREATE2. Hii ni kwa sababu CREATE2 hukagua kuwa nonce ya anwani inayolengwa ni sifuri (imepewa thamani "1" mwanzoni mwa mjenzi). Katika kesi hii, kazi kujiharibu() huweka upya anwani zisizo za kawaida kila wakati. Kwa hivyo ukiita CREATE2 tena na hoja zilezile, ukaguzi wa nonce utapita.

Tafadhali kumbuka kuwa suluhisho hili ni sawa na chaguo la anwani ya Ethereum, lakini bila ya haja ya kuhifadhi funguo za kibinafsi. Gharama ya kuhamisha pesa kutoka kwa mkoba hadi hotwallet ni takriban sawa na gharama ya kupiga kazi uhamisho(), kwa kuwa hatulipii upelekaji wa mikataba mahiri.

Uamuzi wa mwisho

Jinsi ya kuamua anwani ya mkataba mzuri kabla ya kupelekwa: kwa kutumia CREATE2 kwa kubadilishana kwa crypto

Hapo awali ilitayarishwa na:

  • kazi ya kupata chumvi mtumiaji_id
  • mkataba mahiri ambao utaita msimbo wa CREATE2 na chumvi inayofaa (yaani kiwanda cha pochi)
  • wallet bytecode inayolingana na mkataba na mjenzi afuatayo:

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


Kwa kila mtumiaji mpya tunaonyesha anwani ya mkoba wake kwa hesabu

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


Mtumiaji anapohamisha tokeni hadi kwa anwani ya pochi inayolingana, mazingira yetu ya nyuma yanaona tukio la Uhamisho lenye kigezo. _kwa, sawa na anwani ya mkoba. Katika hatua hii, tayari inawezekana kuongeza usawa wa mtumiaji kwenye ubadilishanaji kabla ya kupeleka mkoba.

Wakati anwani ya mkoba inakusanya idadi ya kutosha ya ishara, tunaweza kuzihamisha zote mara moja kwenye hotwallet. Ili kufanya hivyo, sehemu ya nyuma huita kazi ya kiwanda cha mkataba mzuri, ambayo hufanya vitendo vifuatavyo:

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


Kwa hivyo, mjenzi wa mkataba mzuri wa mkoba anaitwa, ambayo huhamisha ishara zake zote kwenye anwani ya hotwallet na kisha kujiharibu.

Nambari kamili inaweza kupatikana hapa. Tafadhali kumbuka kuwa hii sio msimbo wetu wa uzalishaji, kwani tuliamua kuboresha msimbo wa pochi na tukaiandika katika opcode.

Mwandishi Pavel Kondratenkov, mtaalamu wa Ethereum

Chanzo: mapenzi.com

Kuongeza maoni