Kuinka määrittää älykkään sopimuksen osoite ennen käyttöönottoa: CREATE2:n käyttäminen kryptovaihtoon

Lohkoketjun aihe ei lakkaa olemasta kaikenlaisen hypen, mutta myös erittäin arvokkaiden ideoiden lähde teknisestä näkökulmasta. Siksi hän ei ohittanut aurinkoisen kaupungin asukkaita. Ihmiset katsovat tarkasti, opiskelevat ja yrittävät siirtää asiantuntemustaan ​​perinteisestä tietokannasta lohkoketjujärjestelmiin. Toistaiseksi asiallisesti: yksi Rostelecom-Solarin kehityksestä pystyy tarkistamaan lohkoketjuun perustuvien ohjelmistojen turvallisuuden. Ja matkan varrella herää ajatuksia blockchain-yhteisön sovellettujen ongelmien ratkaisemisesta. Yksi näistä elämänmurroista – älykkään sopimuksen osoitteen määrittäminen ennen käyttöönottoa CREATE2:n avulla – haluan jakaa kanssasi tänään.

Kuinka määrittää älykkään sopimuksen osoite ennen käyttöönottoa: CREATE2:n käyttäminen kryptovaihtoon
CREATE2-operaatiokoodi lisättiin Konstantinopolin kovaan haarukkaan 28. helmikuuta tänä vuonna. Kuten EIP:ssä todetaan, tämä toimintakoodi otettiin käyttöön ensisijaisesti tilakanaville. Käytimme sitä kuitenkin eri ongelman ratkaisemiseen.

Pörssissä on käyttäjiä, joilla on saldoja. Meidän on annettava jokaiselle käyttäjälle Ethereum-osoite, johon kuka tahansa voi lähettää tokeneita ja siten täydentää tiliään. Kutsutaan näitä osoitteita "lompakoksi". Kun rahakkeet saapuvat lompakoihin, meidän on lähetettävä ne yhteen lompakkoon (hotwallet).

Seuraavissa osissa analysoin vaihtoehtoja tämän ongelman ratkaisemiseksi ilman CREATE2:ta ja selitän, miksi hylkäsimme ne. Jos olet kiinnostunut vain lopputuloksesta, löydät sen Lopullinen ratkaisu -osiosta.

Ethereum-osoitteet

Yksinkertaisin ratkaisu on luoda uusia ethereum-osoitteita uusille käyttäjille. Nämä osoitteet ovat lompakot. Jos haluat siirtää rahakkeita lompakosta hotwalletiin, sinun on allekirjoitettava tapahtuma kutsumalla toiminto siirtää() lompakon yksityisellä avaimella taustajärjestelmästä.

Tällä lähestymistavalla on seuraavat edut:

  • se on vain
  • rahakkeiden siirtäminen lompakosta hotwalletiin on yhtä suuri kuin toiminnon kutsuminen siirtää()

Hylkäsimme kuitenkin tästä lähestymistavasta, koska sillä on yksi merkittävä haittapuoli: sinun täytyy tallentaa yksityiset avaimet jonnekin. Eikä kyse ole vain siitä, että ne voivat kadota, vaan myös sinun on huolehdittava näiden avainten pääsystä. Jos ainakin yksi niistä vaarantuu, tietyn käyttäjän tunnukset eivät pääse kuumaan lompakkoon.

Kuinka määrittää älykkään sopimuksen osoite ennen käyttöönottoa: CREATE2:n käyttäminen kryptovaihtoon

Luo erillinen älykäs sopimus jokaiselle käyttäjälle

Kun jokaiselle käyttäjälle otetaan käyttöön erillinen älykäs sopimus, et voi tallentaa lompakoiden yksityisiä avaimia palvelimelle. Pörssi kutsuu tätä älykästä sopimusta siirtääkseen rahakkeet hotwalletiin.

Luovuimme myös tästä ratkaisusta, koska käyttäjälle ei voida näyttää lompakkoosoitetta ilman älykkään sopimuksen käyttöönottoa (tämä on itse asiassa mahdollista, mutta melko monimutkaisella tavalla muiden haittojen kanssa, joita emme käsittele tässä). Pörssissä käyttäjä voi luoda niin monta tiliä kuin hän tarvitsee, ja jokainen tarvitsee oman lompakon. Tämä tarkoittaa, että meidän on käytettävä rahaa sopimuksen käyttöönottoon ilman, että edes olla varmoja siitä, että käyttäjä käyttää tätä tiliä.

Opcode CREATE2

Edellisen menetelmän ongelman korjaamiseksi päätimme käyttää CREATE2-operaatiokoodia. CREATE2:n avulla voit määrittää etukäteen osoitteen, jossa älykäs sopimus otetaan käyttöön. Osoite lasketaan seuraavalla kaavalla:

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


, jossa:

  • osoite — älykkään sopimuksen osoite, joka kutsuu CREATE2:ta
  • suolaa - satunnainen arvo
  • aloituskoodi - älykäs sopimustavukoodi käyttöönottoa varten

Tämä varmistaa, että käyttäjälle antamamme osoite todella sisältää halutun tavukoodin. Lisäksi tämä älykäs sopimus voidaan ottaa käyttöön aina kun tarvitsemme. Esimerkiksi kun käyttäjä päättää käyttää lompakkoaan ensimmäistä kertaa.
Kuinka määrittää älykkään sopimuksen osoite ennen käyttöönottoa: CREATE2:n käyttäminen kryptovaihtoon
Lisäksi voit laskea älykkään sopimusosoitteen joka kerta sen tallentamisen sijaan, koska:

  • osoite kaavassa on vakio, koska se on lompakkotehtaamme osoite
  • suolaa - user_id hash
  • aloituskoodi on pysyvä, koska käytämme samaa lompakkoa

Lisää parannuksia

Edellisellä ratkaisulla on edelleen yksi haittapuoli: sinun on maksettava älykkäiden sopimusten käyttöönotosta. Siitä voi kuitenkin päästä eroon. Tätä varten voit kutsua funktion siirtää()ja sitten itsetuho() lompakon rakentajassa. Ja sitten älysopimuksen käyttöönottoon tarvittava kaasu palautetaan.

Vastoin yleistä luuloa, voit ottaa älykkään sopimuksen käyttöön samaan osoitteeseen useita kertoja CREATE2-operaatiokoodilla. Tämä johtuu siitä, että CREATE2 tarkistaa, että kohdeosoitteen nonce on nolla (sille annetaan arvo "1" konstruktorin alussa). Samalla toiminto itsetuho() nollaa nonce-osoitteen joka kerta. Jos siis kutsut CREATE2:ta uudelleen samoilla argumenteilla, nonce-tarkistus menee läpi.

Huomaa, että tämä ratkaisu on samanlainen kuin ethereum-osoiteratkaisu, mutta ilman tarvetta tallentaa yksityisiä avaimia. Rahan siirtäminen lompakosta hotwalletiin maksaa suunnilleen toiminnon soittamisen hintaa siirtää(), koska emme maksa älykkään sopimuksen käyttöönotosta.

Lopullinen päätös

Kuinka määrittää älykkään sopimuksen osoite ennen käyttöönottoa: CREATE2:n käyttäminen kryptovaihtoon

Aluksi valmisteltu:

  • toiminto saada suolaa USER_ID
  • älykäs sopimus, joka kutsuu CREATE2-operaatiokoodia sopivalla suolalla (eli lompakkotehdas)
  • lompakkotavukoodi, joka vastaa seuraavan rakentajan kanssa tehtyä sopimusta:

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


Jokaiselle uudelle käyttäjälle näytämme hänen lompakkoosoitteensa laskemalla

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


Kun käyttäjä siirtää tokeneja vastaavaan lompakon osoitteeseen, taustamme näkee Transfer-tapahtuman parametrin kanssa _tosama kuin lompakon osoite. Tässä vaiheessa on jo mahdollista kasvattaa käyttäjän saldoa pörssissä ennen lompakon käyttöönottoa.

Kun lompakon osoitteeseen kertyy tarpeeksi tokeneja, voimme siirtää ne kaikki kerralla hotwalletiin. Tätä varten taustaohjelma kutsuu älykkäiden sopimusten tehdastoimintoa, joka suorittaa seuraavat toiminnot:

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


Siten kutsutaan lompakko älykkään sopimuksen rakentajaa, joka siirtää kaikki tunnuksensa hotwallet-osoitteeseen ja sitten tuhoaa itsensä.

Täydellinen koodi löytyy täällä. Huomaa, että tämä ei ole tuotantokoodimme, koska päätimme optimoida lompakon tavukoodin ja kirjoittaa sen opkoodeiksi.

Kirjailija Pavel Kondratenkov, Ethereumin asiantuntija

Lähde: will.com

Lisää kommentti