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.
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.
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.
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
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
Awtur Pavel Kondratenkov, speċjalista Ethereum
Sors: www.habr.com