Nola zehaztu kontratu adimendun baten helbidea zabaldu aurretik: CREATE2 erabiliz kriptografia truke baterako

Blockchain-aren gaiak ez du inoiz iragarki mota guztien iturri izateari uzten, baita teknologiaren ikuspuntutik oso baliotsuak diren ideien iturri izateari ere. Hori dela eta, ez zituen hiri eguzkitsuko bizilagunak saihestu. Jendea arretaz begiratzen ari da, ikasten, informazio-segurtasun tradizionalean duten espezializazioa blockchain sistemetara transferitzen saiatzen ari da. Orain arte, egokia da: Rostelecom-Solar-en garapenetako batek blockchain-en oinarritutako softwarearen segurtasuna egiaztatu dezake. Eta bidean, pentsamendu batzuk sortzen dira blockchain komunitatearen arazo aplikatuak konpontzeko. Bizitzako hack horietako bat - nola zehaztu kontratu adimendun baten helbidea CREATE2 erabiliz zabaldu aurretik - gaur zurekin partekatu nahi dut.

Nola zehaztu kontratu adimendun baten helbidea zabaldu aurretik: CREATE2 erabiliz kriptografia truke baterako
CREATE2 opcode-a Konstantinoplako sardexka gogorrean gehitu zen aurtengo otsailaren 28an. EIPn esaten den moduan, opcode hau estatuko kanaletarako sartu zen nagusiki. Hala ere, beste arazo bat konpontzeko erabili dugu.

Trukean saldoak dituzten erabiltzaileak daude. Erabiltzaile bakoitzari Ethereum helbide bat eman behar diogu edonork tokenak bidal ditzan, eta horrela bere kontua betetzeko. Dei diezaiegun helbide horiei "zorroak". Tokenak zorroetara iristen direnean, zorro bakar batera bidali behar ditugu (hotwallet).

Hurrengo ataletan, CREATE2 gabe arazo hau konpontzeko aukerak aztertzen ditut eta zergatik utzi genituen esaten dizut. Azken emaitza bakarrik interesatzen bazaizu, "Azken irtenbidea" atalean aurki dezakezu.

Ethereum helbideak

Irtenbiderik errazena erabiltzaile berrientzako Ethereum helbide berriak sortzea da. Helbide hauek diru-zorroak izango dira. Tokenak zorro batetik hotwalletera transferitzeko, transakzioa sinatu behar duzu funtziora deituz transferentzia () backend-eko zorroaren gako pribatuarekin.

Ikuspegi honek abantaila hauek ditu:

  • sinplea da
  • zorrotik hotwallet-era tokenak transferitzearen kostua funtzio-dei baten kostuaren berdina da transferentzia ()

Hala ere, ikuspegi honen aurka erabaki dugu eragozpen handi bat duelako: gako pribatuak nonbait gorde behar dituzu. Galtzeaz gain, gako hauetarako sarbidea arretaz kudeatu behar duzu. Gutxienez horietako bat arriskuan jartzen bada, erabiltzaile jakin baten tokenak ez dira zorro berora iritsiko.

Nola zehaztu kontratu adimendun baten helbidea zabaldu aurretik: CREATE2 erabiliz kriptografia truke baterako

Sortu kontratu adimendun bana erabiltzaile bakoitzarentzat

Erabiltzaile bakoitzeko kontratu adimendun bereizia zabaltzeak zerbitzarian zorroentzako gako pribatuak gordetzea saihesteko aukera ematen du. Trukeak kontratu adimendun honi deituko dio tokenak hotwallet-era transferitzeko.

Irtenbide hau ere alde batera utzi genuen, erabiltzaileari ezin zaiolako bere zorroaren helbidea erakutsi kontratu adimendun bat zabaldu gabe (hau benetan posible da, baina modu konplexu samarrean hemen eztabaidatuko ez ditugun beste desabantailekin). Trukean, erabiltzaile batek behar adina kontu sor ditzake, eta bakoitzak bere zorroa behar du. Horrek esan nahi du kontratu bat zabaltzeko dirua gastatu behar dugula erabiltzaileak kontu hau erabiliko duela ziur egon gabe.

Opcode CREATE2

Aurreko metodoaren arazoa konpontzeko, CREATE2 opcode erabiltzea erabaki dugu. CREATE2-k kontratu adimenduna zabalduko den helbidea aldez aurretik zehazteko aukera ematen du. Helbidea honako formula hau erabiliz kalkulatzen da:

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


, non:

  • helbidea β€” CREATE2 deituko duen kontratu adimendunaren helbidea
  • gatza - ausazko balioa
  • hasiera_kodea - Kontratu adimenduna hedatzeko bytecode

Honek erabiltzaileari ematen diogun helbideak nahi duen byte-kodea duela ziurtatzen du. Gainera, kontratu adimendun hau behar dugunean zabaldu daiteke. Adibidez, erabiltzaile batek bere zorroa lehen aldiz erabiltzea erabakitzen duenean.
Nola zehaztu kontratu adimendun baten helbidea zabaldu aurretik: CREATE2 erabiliz kriptografia truke baterako
Gainera, kontratu adimendunaren helbidea aldi bakoitzean kalkula dezakezu gorde beharrean, zeren eta:

  • helbidea formulan konstantea da, hau baita gure zorro fabrikaren helbidea
  • gatza β€” user_id hash
  • hasiera_kodea konstantea da zorro bera erabiltzen dugunez

Hobekuntza gehiago

Aurreko irtenbideak oraindik eragozpen bat du: kontratu adimenduna zabaltzeko ordaindu behar duzu. Hala ere, ken dezakezu. Horretarako funtziora deitu dezakezu transferentzia ()eta gero autosuntsitu () zorroaren eraikitzailean. Eta gero kontratu adimenduna zabaltzeko gasa itzuliko da.

Uste denaren aurka, kontratu adimendun bat helbide berean hainbat aldiz zabaldu dezakezu CREATE2 opcodearekin. Hau da, CREATE2-k xede-helbidearen nonce nulua dela egiaztatzen duelako (eraikitzailearen hasieran "1" balioa esleitzen zaio). Kasu honetan, funtzioa autosuntsitu () nonce helbideak berrezartzen ditu aldi bakoitzean. Beraz, CREATE2 berriro deitzen baduzu argumentu berdinekin, nonce egiaztapena gaindituko da.

Kontuan izan irtenbide hau Ethereum helbidearen aukeraren antzekoa dela, baina gako pribatuak gorde beharrik gabe. Dirua zorro batetik hotwalletera transferitzearen kostua funtzio bati deitzearen kostuaren berdina da gutxi gorabehera transferentzia (), ez baitugu ordaintzen kontratu adimendunaren hedapenagatik.

Azken erabakia

Nola zehaztu kontratu adimendun baten helbidea zabaldu aurretik: CREATE2 erabiliz kriptografia truke baterako

Jatorriz prestatua:

  • gatza lortzeko funtzioa erabiltzaile_id
  • CREATE2 opcodeari dagokion gatzarekin deituko duen kontratu adimenduna (hau da, zorro-fabrika)
  • zorroaren bytekodea eraikitzaile honekin kontratuari dagokiona:

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


Erabiltzaile berri bakoitzeko bere zorroaren helbidea erakusten dugu kalkulu bidez

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


Erabiltzaile batek tokenak dagokion zorroaren helbidera transferitzen dituenean, gure backend-ak Transferentzia gertaera bat ikusten du parametroarekin _to, diru-zorroaren helbidearen berdina. Une honetan, dagoeneko posible da erabiltzailearen saldoa trukean handitzea diru-zorroa zabaldu aurretik.

Diru-zorroaren helbideak token kopuru nahikoa pilatzen duenean, aldi berean hotwallet-era transferi ditzakegu. Horretarako, backend-ak smart contract factory funtzioa deitzen du, eta ekintza hauek egiten ditu:

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


Horrela, zorroaren kontratu adimendunaren eraikitzailea deitzen da, bere token guztiak hotwallet helbidera transferitzen dituena eta gero autosuntsitzen duena.

Kode osoa aurki daiteke Hemen. Kontuan izan hau ez dela gure ekoizpen-kodea, diru-zorroaren byte-kodea optimizatzea erabaki dugulako eta opcodeetan idatzi baitugu.

Pavel Kondratenkov egilea, Ethereum espezialista

Iturria: www.habr.com

Gehitu iruzkin berria