Sut i bennu cyfeiriad contract smart cyn ei ddefnyddio: defnyddio CREATE2 ar gyfer cyfnewidfa crypto

Nid yw pwnc blockchain byth yn peidio â bod yn ffynhonnell nid yn unig o bob math o hype, ond hefyd syniadau sy'n werthfawr iawn o safbwynt technolegol. Felly, nid oedd yn osgoi trigolion y ddinas heulog. Mae pobl yn edrych yn agos, yn astudio, yn ceisio trosglwyddo eu harbenigedd mewn diogelwch gwybodaeth traddodiadol i systemau blockchain. Hyd yn hyn, mae'n amlwg: gall un o ddatblygiadau Rostelecom-Solar wirio diogelwch meddalwedd sy'n seiliedig ar blockchain. Ac ar hyd y ffordd, mae rhai meddyliau'n codi ar ddatrys problemau cymhwysol y gymuned blockchain. Un o'r haciau bywyd hyn - sut i bennu cyfeiriad contract smart cyn ei ddefnyddio gan ddefnyddio CREATE2 - heddiw rwyf am rannu gyda chi o dan y toriad.

Sut i bennu cyfeiriad contract smart cyn ei ddefnyddio: defnyddio CREATE2 ar gyfer cyfnewidfa crypto
Ychwanegwyd yr opcode CREATE2 yn fforch galed Constantinople ar Chwefror 28ain eleni. Fel y nodwyd yn yr EIP, cyflwynwyd yr opcode hwn yn bennaf ar gyfer sianeli'r wladwriaeth. Fodd bynnag, fe wnaethom ei ddefnyddio i ddatrys problem wahanol.

Mae yna ddefnyddwyr â balansau ar y cyfnewid. Rhaid inni roi cyfeiriad Ethereum i bob defnyddiwr y gall unrhyw un anfon tocynnau iddo, a thrwy hynny ailgyflenwi eu cyfrif. Gadewch i ni alw'r cyfeiriadau hyn yn "waledi". Pan fydd tocynnau'n cyrraedd waledi, rhaid inni eu hanfon at un waled (waled poeth).

Yn yr adrannau canlynol, rwy'n dadansoddi opsiynau ar gyfer datrys y broblem hon heb CREATE2 ac yn dweud wrthych pam y gwnaethom eu gadael. Os mai dim ond yn y canlyniad terfynol sydd gennych ddiddordeb, gallwch ddod o hyd iddo yn yr adran “Ateb Terfynol”.

Cyfeiriadau Ethereum

Yr ateb symlaf yw cynhyrchu cyfeiriadau Ethereum newydd ar gyfer defnyddwyr newydd. Y cyfeiriadau hyn fydd y waledi. I drosglwyddo tocynnau o waled i waled poeth, mae angen i chi lofnodi'r trafodiad trwy ffonio'r swyddogaeth trosglwyddo () gydag allwedd breifat y waled o'r cefn.

Mae gan y dull hwn y manteision canlynol:

  • mae'n syml
  • mae cost trosglwyddo tocynnau o waled i waled poeth yn hafal i gost galwad swyddogaeth trosglwyddo ()

Fodd bynnag, penderfynasom yn erbyn y dull hwn oherwydd bod ganddo un anfantais fawr: mae angen i chi storio'r allweddi preifat yn rhywle. Nid yn unig y gellir eu colli, ond mae angen i chi hefyd reoli mynediad at yr allweddi hyn yn ofalus. Os yw o leiaf un ohonynt yn cael ei beryglu, yna ni fydd tocynnau defnyddiwr penodol yn cyrraedd y waled poeth.

Sut i bennu cyfeiriad contract smart cyn ei ddefnyddio: defnyddio CREATE2 ar gyfer cyfnewidfa crypto

Creu contract smart ar wahân ar gyfer pob defnyddiwr

Mae defnyddio contract smart ar wahân ar gyfer pob defnyddiwr yn caniatáu ichi osgoi storio allweddi preifat ar gyfer waledi ar y gweinydd. Bydd y cyfnewid yn galw'r contract smart hwn i drosglwyddo'r tocynnau i'r waled poeth.

Rydym hefyd wedi rhoi'r gorau i'r ateb hwn, gan na ellir dangos ei gyfeiriad waled i'r defnyddiwr heb ddefnyddio contract smart (mae hyn yn bosibl mewn gwirionedd, ond mewn ffordd eithaf cymhleth gydag anfanteision eraill na fyddwn yn eu trafod yma). Ar y cyfnewid, gall defnyddiwr greu cymaint o gyfrifon ag sydd ei angen arno, ac mae angen ei waled ei hun ar bob un. Mae hyn yn golygu bod angen i ni wario arian ar ddefnyddio contract heb hyd yn oed fod yn siŵr y bydd y defnyddiwr yn defnyddio'r cyfrif hwn.

Opcode CREATE2

I ddatrys problem y dull blaenorol, fe wnaethom benderfynu defnyddio'r cod op CREATE2. Mae CREATE2 yn caniatáu ichi rag-benderfynu ar y cyfeiriad lle bydd y contract smart yn cael ei ddefnyddio. Cyfrifir y cyfeiriad gan ddefnyddio'r fformiwla ganlynol:

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


, lle:

  • Cyfeiriad — cyfeiriad y contract smart a fydd yn galw CREATE2
  • halen - gwerth ar hap
  • init_cod — cod beit contract clyfar i'w ddefnyddio

Mae hyn yn sicrhau bod y cyfeiriad rydyn ni'n ei ddarparu i'r defnyddiwr mewn gwirionedd yn cynnwys y cod byte a ddymunir. At hynny, gellir defnyddio'r contract smart hwn pryd bynnag y bydd ei angen arnom. Er enghraifft, pan fydd defnyddiwr yn penderfynu defnyddio eu waled am y tro cyntaf.
Sut i bennu cyfeiriad contract smart cyn ei ddefnyddio: defnyddio CREATE2 ar gyfer cyfnewidfa crypto
Ar ben hynny, gallwch gyfrifo'r cyfeiriad contract smart bob tro yn lle ei storio oherwydd:

  • Cyfeiriad yn y fformiwla yn gyson, gan mai dyma'r cyfeiriad ein ffatri waled
  • halen — hash defnyddiwr_id
  • init_cod yn gyson gan ein bod yn defnyddio'r un waled

Mwy o welliannau

Mae gan yr ateb blaenorol un anfantais o hyd: mae angen i chi dalu i ddefnyddio'r contract smart. Fodd bynnag, gallwch gael gwared arno. I wneud hyn gallwch chi ffonio'r swyddogaeth trosglwyddo ()ac yna hunanddinistriol () yn yr adeiladwr waled. Ac yna bydd y nwy ar gyfer defnyddio'r contract smart yn cael ei ddychwelyd.

Yn groes i'r gred boblogaidd, gallwch chi ddefnyddio contract smart i'r un cyfeiriad sawl gwaith gyda'r cod op CREATE2. Mae hyn oherwydd bod CREATE2 yn gwirio nad yw'r cyfeiriad targed yn uns (mae'n cael y gwerth "1" ar ddechrau'r lluniwr). Yn yr achos hwn, y swyddogaeth hunanddinistriol () yn ailosod cyfeiriadau nonce bob tro. Felly os byddwch chi'n ffonio CREATE2 eto gyda'r un dadleuon, bydd y siec yn mynd heibio.

Sylwch fod yr ateb hwn yn debyg i'r opsiwn cyfeiriad Ethereum, ond heb yr angen i storio allweddi preifat. Mae'r gost o drosglwyddo arian o waled i waled boeth tua'r un faint â chost galw swyddogaeth trosglwyddo (), gan nad ydym yn talu am ddefnyddio contract smart.

Penderfyniad terfynol

Sut i bennu cyfeiriad contract smart cyn ei ddefnyddio: defnyddio CREATE2 ar gyfer cyfnewidfa crypto

Paratowyd yn wreiddiol gan:

  • swyddogaeth i gael halen erbyn ID Defnyddiwr
  • contract clyfar a fydd yn galw’r opcode CREATE2 gyda’r halen priodol (h.y. ffatri waledi)
  • cod byte waled sy'n cyfateb i'r contract gyda'r adeiladwr canlynol:

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


Ar gyfer pob defnyddiwr newydd rydym yn dangos ei gyfeiriad waled trwy gyfrifiad

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


Pan fydd defnyddiwr yn trosglwyddo tocynnau i'r cyfeiriad waled cyfatebol, mae ein backend yn gweld digwyddiad Trosglwyddo gyda'r paramedr _i, yn hafal i gyfeiriad y waled. Ar y pwynt hwn, mae eisoes yn bosibl cynyddu cydbwysedd y defnyddiwr ar y gyfnewidfa cyn defnyddio'r waled.

Pan fydd cyfeiriad waled yn cronni nifer ddigonol o docynnau, gallwn eu trosglwyddo i gyd ar unwaith i waled poeth. I wneud hyn, mae'r backend yn galw swyddogaeth ffatri contract smart, sy'n cyflawni'r camau canlynol:

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


Felly, gelwir yr adeiladwr contract smart waled, sy'n trosglwyddo ei holl docynnau i'r cyfeiriad hotwallet ac yna'n hunan-ddinistrio.

Gellir dod o hyd i'r cod llawn yma. Sylwch nad hwn yw ein cod cynhyrchu, gan inni benderfynu gwneud y gorau o'r bytecode waled a'i ysgrifennu mewn opcodes.

Awdur Pavel Kondratenkov, arbenigwr Ethereum

Ffynhonnell: hab.com

Ychwanegu sylw