Kif tiddetermina l-indirizz ta 'kuntratt intelliġenti qabel l-iskjerament: billi tuża CREATE2 għal skambju kripto

Is-suġġett ta 'blockchain qatt ma jieqaf milli jkun sors ta' mhux biss kull xorta ta 'hype, iżda wkoll ideat li huma siewja ħafna mil-lat teknoloġiku. Għalhekk, ma bypass ir-residenti tal-belt xemxija. In-nies qed iħarsu mill-qrib, jistudjaw, jippruvaw jittrasferixxu l-kompetenza tagħhom fis-sigurtà tal-informazzjoni tradizzjonali għal sistemi blockchain. S'issa, huwa fil-post: wieħed mill-iżviluppi ta 'Rostelecom-Solar jista' jiċċekkja s-sigurtà ta 'softwer ibbażat fuq blockchain. U tul it-triq, iqumu xi ħsibijiet dwar is-soluzzjoni ta 'problemi applikati tal-komunità blockchain. Wieħed minn dawn il-hacks tal-ħajja - kif tiddetermina l-indirizz ta 'kuntratt intelliġenti qabel l-iskjerament billi tuża CREATE2 - illum nixtieq naqsam miegħek taħt il-qatgħa.

Kif tiddetermina l-indirizz ta 'kuntratt intelliġenti qabel l-iskjerament: billi tuża CREATE2 għal skambju kripto
L-opcode CREATE2 ġie miżjud fil-furketta iebes ta 'Kostantinopli fit-28 ta' Frar ta 'din is-sena. Kif iddikjarat fl-EIP, dan l-opcode ġie introdott primarjament għall-kanali statali. Madankollu, użajna biex insolvu problema differenti.

Hemm utenti b'bilanċi fuq l-iskambju. Irridu nipprovdu lil kull utent indirizz ta 'Ethereum li fih kulħadd jista' jibgħat tokens, u b'hekk jimlew il-kont tiegħu. Ejja nsejħu dawn l-indirizzi "kartieri". Meta tokens jaslu f'kartieri, irridu nibagħtuhom f'kartiera waħda (hotwallet).

Fis-sezzjonijiet li ġejjin, jien nanalizza l-għażliet biex issolvi din il-problema mingħajr CREATE2 u ngħidlek għaliex abbandunajnahom. Jekk inti interessat biss fir-riżultat finali, tista 'ssibha fit-taqsima "Soluzzjoni Finali".

Indirizzi Ethereum

L-aktar soluzzjoni sempliċi hija li tiġġenera indirizzi Ethereum ġodda għal utenti ġodda. Dawn l-indirizzi se jkunu l-kartieri. Biex tittrasferixxi tokens minn kartiera għal hotwallet, trid tiffirma t-tranżazzjoni billi ċċempel il-funzjoni trasferiment () biċ-ċavetta privata tal-kartiera mill-backend.

Dan l-approċċ għandu l-vantaġġi li ġejjin:

  • huwa sempliċi
  • l-ispiża tat-trasferiment tat-tokens minn kartiera għal hotwallet hija ugwali għall-ispiża ta 'sejħa ta' funzjoni trasferiment ()

Madankollu, iddeċidejna kontra dan l-approċċ minħabba li għandu żvantaġġ wieħed ewlieni: għandek bżonn taħżen iċ-ċwievet privati ​​x'imkien. Mhux biss jistgħu jintilfu, imma trid ukoll timmaniġġja bir-reqqa l-aċċess għal dawn iċ-ċwievet. Jekk mill-inqas wieħed minnhom ikun kompromess, allura t-tokens ta 'utent partikolari ma jilħqux il-kartiera sħuna.

Kif tiddetermina l-indirizz ta 'kuntratt intelliġenti qabel l-iskjerament: billi tuża CREATE2 għal skambju kripto

Oħloq kuntratt intelliġenti separat għal kull utent

L-użu ta 'kuntratt intelliġenti separat għal kull utent jippermettilek tevita li taħżen ċwievet privati ​​għall-kartieri fuq is-server. L-iskambju se jsejjaħ dan il-kuntratt intelliġenti biex jittrasferixxi t-tokens għall-hotwallet.

Aħna abbandunajna wkoll din is-soluzzjoni, peress li l-utent ma jistax jintwera l-indirizz tal-kartiera tiegħu mingħajr ma juża kuntratt intelliġenti (dan fil-fatt huwa possibbli, iżda b'mod pjuttost kumpless bi żvantaġġi oħra li mhux se niddiskutu hawn). Fuq l-iskambju, utent jista 'joħloq kontijiet kemm jeħtieġ, u kull wieħed għandu bżonn il-kartiera tiegħu. Dan ifisser li għandna bżonn nonfqu l-flus fuq l-iskjerament ta 'kuntratt mingħajr ma nkunu ċerti li l-utent se juża dan il-kont.

Opcode CREATE2

Biex nirranġaw il-problema tal-metodu preċedenti, iddeċidejna li nużaw l-opcode CREATE2. CREATE2 jippermettilek li tiddetermina minn qabel l-indirizz fejn se jiġi skjerat il-kuntratt intelliġenti. L-indirizz huwa kkalkulat permezz tal-formula li ġejja:

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


, fejn:

  • indirizz — l-indirizz tal-kuntratt intelliġenti li se jsejjaħ CREATE2
  • melħ - valur każwali
  • init_code — bytecode tal-kuntratt intelliġenti għall-iskjerament

Dan jiżgura li l-indirizz li nipprovdu lill-utent fil-fatt ikun fih il-bytecode mixtieq. Barra minn hekk, dan il-kuntratt intelliġenti jista 'jintuża kull meta jkollna bżonn. Pereżempju, meta utent jiddeċiedi li juża l-kartiera tiegħu għall-ewwel darba.
Kif tiddetermina l-indirizz ta 'kuntratt intelliġenti qabel l-iskjerament: billi tuża CREATE2 għal skambju kripto
Barra minn hekk, tista 'tikkalkula l-indirizz tal-kuntratt intelliġenti kull darba minflok taħżen minħabba li:

  • indirizz fil-formula hija kostanti, peress li dan huwa l-indirizz tal-fabbrika tal-kartiera tagħna
  • melħ — user_id hash
  • init_code hija kostanti peress li nużaw l-istess kartiera

Aktar titjib

Is-soluzzjoni preċedenti għad għandha żvantaġġ wieħed: trid tħallas biex tuża l-kuntratt intelliġenti. Madankollu, tista 'teħles minnha. Biex tagħmel dan tista' ċċempel il-funzjoni trasferiment (), imbagħad awtodistruzzjoni () fil-kostruttur tal-kartiera. U mbagħad il-gass għall-iskjerament tal-kuntratt intelliġenti se jiġi rritornat.

Kuntrarjament għat-twemmin popolari, tista' tuża kuntratt intelliġenti fl-istess indirizz diversi drabi bl-opcode CREATE2. Dan għaliex CREATE2 jiċċekkja li n-nonce tal-indirizz fil-mira huwa żero (huwa assenjat il-valur "1" fil-bidu tal-kostruttur). F'dan il-każ, il-funzjoni awtodistruzzjoni () reset indirizzi nonce kull darba. Mela jekk terġa' ċċempel CREATE2 bl-istess argumenti, il-kontroll nonce jgħaddi.

Jekk jogħġbok innota li din is-soluzzjoni hija simili għall-għażla tal-indirizz Ethereum, iżda mingħajr il-ħtieġa li taħżen ċwievet privati. L-ispiża tat-trasferiment tal-flus minn kartiera għal hotwallet hija bejn wieħed u ieħor ugwali għall-ispiża biex issejjaħ funzjoni trasferiment (), peress li aħna ma nħallsux għall-iskjerament tal-kuntratt intelliġenti.

Deċiżjoni finali

Kif tiddetermina l-indirizz ta 'kuntratt intelliġenti qabel l-iskjerament: billi tuża CREATE2 għal skambju kripto

Oriġinarjament ippreparat minn:

  • funzjoni biex tikseb il-melħ minn user_id
  • kuntratt intelliġenti li se jsejjaħ l-opcode CREATE2 bil-melħ xieraq (jiġifieri fabbrika tal-kartiera)
  • wallet bytecode li jikkorrispondi mal-kuntratt mal-kostruttur li ġej:

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


Għal kull utent ġdid nuru l-indirizz tal-kartiera tiegħu/tagħha permezz ta’ kalkolu

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


Meta utent jittrasferixxi tokens lejn l-indirizz tal-kartiera korrispondenti, il-backend tagħna jara avveniment Trasferiment bil-parametru _a, ugwali għall-indirizz tal-kartiera. F'dan il-punt, huwa diġà possibbli li jiżdied il-bilanċ tal-utent fuq l-iskambju qabel ma tuża l-kartiera.

Meta indirizz tal-kartiera jakkumula numru suffiċjenti ta 'tokens, nistgħu nittrasferixxuhom kollha f'daqqa għal hotwallet. Biex tagħmel dan, il-backend isejjaħ il-funzjoni tal-fabbrika tal-kuntratt intelliġenti, li twettaq l-azzjonijiet li ġejjin:

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


Għalhekk, jissejjaħ il-kostruttur tal-kuntratt intelliġenti tal-kartiera, li jittrasferixxi t-tokens kollha tiegħu għall-indirizz tal-hotwallet u mbagħad jeqred lilu nnifsu.

Il-kodiċi sħiħ jista 'jinstab hawn. Jekk jogħġbok innota li dan mhuwiex il-kodiċi tal-produzzjoni tagħna, peress li ddeċidejna li nottimizzaw il-bytecode tal-kartiera u ktibna f'opcodes.

Awtur Pavel Kondratenkov, speċjalista Ethereum

Sors: www.habr.com

Żid kumment