Орналастыру алдында смарт келісімшарттың мекенжайын қалай анықтауға болады: криптовалюта алмасу үшін CREATE2 пайдалану

Блокчейн тақырыбы тек қана әр түрлі шумақтар ғана емес, сонымен қатар технологиялық тұрғыдан өте құнды идеялардың көзі болуды тоқтатпайды. Сондықтан шуақты шаһар тұрғындарын да айналып өтпеді. Адамдар мұқият қарап, зерттеп, дәстүрлі ақпараттық қауіпсіздік саласындағы тәжірибесін блокчейн жүйелеріне көшіруге тырысуда. Әзірге бұл нақты: Rostelecom-Solar әзірлемелерінің бірі блокчейнге негізделген бағдарламалық жасақтаманың қауіпсіздігін тексере алады. Сонымен қатар, блокчейн қауымдастығының қолданбалы мәселелерін шешу туралы кейбір ойлар туындайды. Осы лайфхактардың бірі - CREATE2 көмегімен орналастыру алдында смарт келісім-шарттың мекенжайын қалай анықтауға болады - бүгін мен сізбен қысқаша бөліскім келеді.

Орналастыру алдында смарт келісімшарттың мекенжайын қалай анықтауға болады: криптовалюта алмасу үшін CREATE2 пайдалану
CREATE2 операция коды ағымдағы жылдың 28 ақпанында Константинополь қатты шанышқысына қосылды. EIP-те айтылғандай, бұл операция коды негізінен мемлекеттік арналар үшін енгізілген. Дегенмен, біз оны басқа мәселені шешу үшін қолдандық.

Биржада қалдығы бар пайдаланушылар бар. Біз әрбір пайдаланушыға кез келген адам токендерді жібере алатын Ethereum мекенжайын беруіміз керек, осылайша олардың есептік жазбасын толықтырамыз. Бұл мекенжайларды «әмияндар» деп атаймыз. Токендер әмияндарға келгенде, біз оларды бір әмиянға (hotwallet) жіберуіміз керек.

Келесі бөлімдерде мен бұл мәселені CREATE2-сіз шешу нұсқаларын талдаймын және неліктен олардан бас тартқанымызды айтамын. Егер сізді тек соңғы нәтиже қызықтырса, оны «Түпкілікті шешім» бөлімінде таба аласыз.

Ethereum мекенжайлары

Ең қарапайым шешім - жаңа пайдаланушылар үшін жаңа Ethereum мекенжайларын жасау. Бұл мекенжайлар әмияндар болады. Токендерді әмияннан hotwallet-ке тасымалдау үшін функцияға қоңырау шалу арқылы транзакцияға қол қою керек аудару() әмиянның жеке кілтімен серверден.

Бұл тәсілдің келесі артықшылықтары бар:

  • Бұл оп-оңай
  • әмияннан hotwallet-ке токендерді тасымалдау құны функционалдық шақыру құнына тең аудару()

Дегенмен, біз бұл тәсілге қарсы шешім қабылдадық, өйткені оның бір маңызды кемшілігі бар: жеке кілттерді бір жерде сақтау керек. Олар жоғалып қана қоймайды, сонымен қатар осы кілттерге қол жеткізуді мұқият басқару керек. Егер олардың кем дегенде біреуі бұзылған болса, онда белгілі бір пайдаланушының токендері ыстық әмиянға жетпейді.

Орналастыру алдында смарт келісімшарттың мекенжайын қалай анықтауға болады: криптовалюта алмасу үшін CREATE2 пайдалану

Әрбір пайдаланушы үшін жеке смарт келісімшарт жасаңыз

Әрбір пайдаланушы үшін бөлек смарт келісімшартты қолдану серверде әмияндарға арналған жеке кілттерді сақтаудан аулақ болуға мүмкіндік береді. Биржа токендерді hotwallet-ке тасымалдау үшін осы смарт келісімшартты шақырады.

Біз сондай-ақ бұл шешімнен бас тарттық, өйткені пайдаланушыға ақылды келісім-шартты қолданбай әмиянының мекенжайын көрсету мүмкін емес (бұл шын мәнінде мүмкін, бірақ біз мұнда талқыланбайтын басқа кемшіліктері бар өте күрделі түрде). Биржада пайдаланушы қанша қажет болса, сонша тіркелгі жасай алады және әрқайсысына жеке әмиян қажет. Бұл пайдаланушының осы есептік жазбаны пайдаланатынына сенімді болмай-ақ, келісімшартты орналастыруға ақша жұмсауымыз керек дегенді білдіреді.

Опкоды CREATE2

Алдыңғы әдіс мәселесін шешу үшін біз CREATE2 операция кодын пайдалануды шештік. CREATE2 смарт келісімшарт қолданылатын мекенжайды алдын ала анықтауға мүмкіндік береді. Мекенжай келесі формула бойынша есептеледі:

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


, мұнда:

  • мекен-жай — CREATE2 шақыратын смарт келісімшарттың мекенжайы
  • тұз - кездейсоқ шама
  • init_code — орналастыруға арналған смарт келісімшарт байт коды

Бұл пайдаланушыға беретін мекенжайда қажетті байт-код бар екеніне кепілдік береді. Сонымен қатар, бұл ақылды келісім-шартты қажет болған кезде қолдануға болады. Мысалы, пайдаланушы әмиянды бірінші рет пайдалануды шешкенде.
Орналастыру алдында смарт келісімшарттың мекенжайын қалай анықтауға болады: криптовалюта алмасу үшін CREATE2 пайдалану
Сонымен қатар, смарт келісімшарт мекенжайын сақтаудың орнына әр уақытта есептей аласыз, себебі:

  • мекен-жай формулада тұрақты, өйткені бұл біздің әмиян фабрикасының мекенжайы
  • тұз — user_id хэші
  • init_code бір әмиянды пайдаланатындықтан тұрақты

Қосымша жақсартулар

Алдыңғы шешімнің әлі де бір кемшілігі бар: смарт келісімшартты қолдану үшін төлеу керек. Дегенмен, сіз одан құтыла аласыз. Мұны істеу үшін функцияны шақыруға болады аудару(), сосын өзін-өзі жою() әмиян конструкторында. Содан кейін смарт келісімшартты орналастыруға арналған газ қайтарылады.

Танымал пікірге қарамастан, сіз CREATE2 операция коды арқылы бір мекенжайға бірнеше рет смарт келісімшартты орналастыра аласыз. Себебі CREATE2 мақсатты мекенжайдың нөлге тең еместігін тексереді (оған конструктордың басында «1» мәні тағайындалады). Бұл жағдайда функция өзін-өзі жою() емес мекенжайларды әр уақытта қалпына келтіреді. Сондықтан CREATE2-ге дәл сол аргументтермен қайта қоңырау шалсаңыз, бір реттік тексеру өтеді.

Назар аударыңыз, бұл шешім Ethereum мекенжай опциясына ұқсас, бірақ жеке кілттерді сақтау қажет емес. Ақшаны әмияннан hotwallet-ке аудару құны шамамен функцияны шақыру құнына тең аудару(), өйткені біз смарт келісімшартты орналастыру үшін төлем жасамаймыз.

Соңғы шешім

Орналастыру алдында смарт келісімшарттың мекенжайын қалай анықтауға болады: криптовалюта алмасу үшін CREATE2 пайдалану

Бастапқыда дайындаған:

  • тұз алу функциясы Қолданушының ID
  • сәйкес тұзбен CREATE2 операция кодын шақыратын смарт келісімшарт (яғни әмиян фабрикасы)
  • келесі конструктормен келісім-шартқа сәйкес әмиян байт коды:

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


Әрбір жаңа пайдаланушы үшін біз оның әмиян мекенжайын есептеу арқылы көрсетеміз

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


Пайдаланушы таңбалауыштарды сәйкес әмиян мекенжайына тасымалдағанда, біздің сервер параметрі бар Transfer оқиғасын көреді. _қа, әмиян мекенжайына тең. Осы сәтте әмиянды орналастырмас бұрын биржадағы пайдаланушының балансын арттыруға болады.

Әмиян мекенжайында токендердің жеткілікті саны жинақталғанда, біз олардың барлығын бірден hotwallet-ке тасымалдай аламыз. Бұл әрекетті орындау үшін сервер келесі әрекеттерді орындайтын смарт келісімшарт зауытының функциясын шақырады:

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


Осылайша, әмиянның смарт-конструкторы шақырылады, ол өзінің барлық белгілерін hotwallet мекенжайына жібереді, содан кейін өзін-өзі жояды.

Толық кодты табуға болады осында. Бұл біздің өндірістік кодымыз емес екенін ескеріңіз, өйткені біз әмиянның байт кодын оңтайландыруды шештік және оны опкодтарға жаздык.

Авторы Павел Кондратенков, Ethereum маманы

Ақпарат көзі: www.habr.com

пікір қалдыру