Joylashtirishdan oldin aqlli shartnoma manzilini qanday aniqlash mumkin: kripto almashinuvi uchun CREATE2 dan foydalanish

Blokcheyn mavzusi hech qachon nafaqat har xil shov-shuvlar, balki texnologik nuqtai nazardan juda qimmatli g'oyalar manbai bo'lishdan to'xtamaydi. Shuning uchun u quyoshli shahar aholisini chetlab o'tmadi. Odamlar an'anaviy axborot xavfsizligi bo'yicha o'z tajribalarini blokcheyn tizimlariga o'tkazishga yaqindan qarab, o'rganmoqdalar. Hozircha bu aniq: Rostelecom-Solar ishlanmalaridan biri blokcheynga asoslangan dasturiy ta'minot xavfsizligini tekshirishi mumkin. Va yo'lda, blokcheyn hamjamiyatining amaliy muammolarini hal qilish bo'yicha ba'zi fikrlar paydo bo'ladi. Ushbu hayotiy xakerliklardan biri - CREATE2-dan foydalanib joylashtirishdan oldin aqlli shartnoma manzilini qanday aniqlash mumkin - bugun men siz bilan kesma ostida baham ko'rmoqchiman.

Joylashtirishdan oldin aqlli shartnoma manzilini qanday aniqlash mumkin: kripto almashinuvi uchun CREATE2 dan foydalanish
CREATE2 opkodi joriy yilning 28-fevralida Konstantinopol qattiq vilkalariga qo'shilgan. EIPda ta'kidlanganidek, bu opcode birinchi navbatda davlat kanallari uchun kiritilgan. Biroq, biz undan boshqa muammoni hal qilish uchun foydalandik.

Birjada qoldiqlari bo'lgan foydalanuvchilar bor. Biz har bir foydalanuvchiga Ethereum manzilini taqdim etishimiz kerak, unga har kim tokenlarni yuborishi mumkin va shu bilan ularning hisobini toβ€˜ldiradi. Keling, bu manzillarni "hamyon" deb ataymiz. Tokenlar hamyonga kelganda, biz ularni bitta hamyonga (hotwallet) yuborishimiz kerak.

Keyingi bo'limlarda men ushbu muammoni CREATE2siz hal qilish variantlarini tahlil qilaman va nima uchun biz ulardan voz kechganimizni aytaman. Agar siz faqat yakuniy natijaga qiziqsangiz, uni "Yakuniy yechim" bo'limida topishingiz mumkin.

Ethereum manzillari

Eng oddiy yechim yangi foydalanuvchilar uchun yangi Ethereum manzillarini yaratishdir. Bu manzillar hamyonlar bo'ladi. Tokenlarni hamyondan hotwalletga oβ€˜tkazish uchun funksiyaga qoβ€˜ngβ€˜iroq qilib tranzaksiyani imzolash kerak transfer() backenddan hamyonning shaxsiy kaliti bilan.

Ushbu yondashuv quyidagi afzalliklarga ega:

  • bu shunchaki
  • tokenlarni hamyondan hotwalletga o'tkazish qiymati funktsiya chaqiruvi narxiga teng transfer()

Biroq, biz bu yondashuvdan voz kechdik, chunki u bitta muhim kamchilikka ega: shaxsiy kalitlarni biron bir joyda saqlashingiz kerak. Ular nafaqat yo'qolishi mumkin, balki siz ushbu kalitlarga kirishni diqqat bilan boshqarishingiz kerak. Agar ulardan kamida bittasi buzilgan bo'lsa, u holda ma'lum bir foydalanuvchining tokenlari issiq hamyonga etib bormaydi.

Joylashtirishdan oldin aqlli shartnoma manzilini qanday aniqlash mumkin: kripto almashinuvi uchun CREATE2 dan foydalanish

Har bir foydalanuvchi uchun alohida aqlli shartnoma yarating

Har bir foydalanuvchi uchun alohida aqlli shartnomani o'rnatish sizga hamyonlar uchun shaxsiy kalitlarni serverda saqlashdan qochish imkonini beradi. Birja tokenlarni hotwallet-ga o'tkazish uchun ushbu aqlli shartnomani chaqiradi.

Shuningdek, biz ushbu yechimdan voz kechdik, chunki foydalanuvchiga aqlli shartnomani o'rnatmasdan hamyon manzilini ko'rsatib bo'lmaydi (bu aslida mumkin, lekin biz bu erda muhokama qilmaydigan boshqa kamchiliklar bilan juda murakkab tarzda). Birjada foydalanuvchi o'zi kerak bo'lgan ko'plab hisoblarni yaratishi mumkin va ularning har biri o'z hamyoniga muhtoj. Bu shuni anglatadiki, foydalanuvchi ushbu hisob qaydnomasidan foydalanishiga amin bo'lmasdan ham shartnomani joylashtirishga pul sarflashimiz kerak.

Operatsiya kodi CREATE2

Oldingi usuldagi muammoni hal qilish uchun biz CREATE2 opkodidan foydalanishga qaror qildik. CREATE2 sizga aqlli shartnoma joylashtiriladigan manzilni oldindan belgilash imkonini beradi. Manzil quyidagi formula bo'yicha hisoblanadi:

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


qaerda:

  • manzil β€” CREATE2 ga qo'ng'iroq qiladigan aqlli shartnoma manzili
  • tuz - tasodifiy qiymat
  • init_code β€” joylashtirish uchun aqlli kontrakt bayt-kodi

Bu biz foydalanuvchiga taqdim etgan manzilda haqiqatda kerakli baytekod mavjudligini ta'minlaydi. Bundan tashqari, ushbu aqlli shartnomani biz xohlagan vaqtda ishlatishimiz mumkin. Misol uchun, foydalanuvchi o'z hamyonidan birinchi marta foydalanishga qaror qilganda.
Joylashtirishdan oldin aqlli shartnoma manzilini qanday aniqlash mumkin: kripto almashinuvi uchun CREATE2 dan foydalanish
Bundan tashqari, siz har safar aqlli shartnoma manzilini saqlash o'rniga hisoblashingiz mumkin, chunki:

  • manzil formulada doimiy, chunki bu bizning hamyon fabrikamizning manzili
  • tuz β€” user_id xeshi
  • init_code Biz bir xil hamyonni ishlatganimiz uchun doimiy

Yana yaxshilanishlar

Oldingi yechim hali ham bitta kamchilikka ega: aqlli shartnomani o'rnatish uchun siz to'lashingiz kerak. Biroq, siz undan qutulishingiz mumkin. Buning uchun siz funktsiyani chaqirishingiz mumkin transfer()va keyin o'zini yo'q qilish() hamyon konstruktorida. Va keyin aqlli shartnomani joylashtirish uchun gaz qaytariladi.

Ommabop e'tiqoddan farqli o'laroq, siz CREATE2 opcode bilan bir xil manzilga bir necha marta aqlli shartnomani o'rnatishingiz mumkin. Buning sababi shundaki, CREATE2 maqsadli manzilning nolligini tekshiradi (bu konstruktor boshida "1" qiymati bilan belgilanadi). Bunday holda, funktsiya o'zini yo'q qilish() har safar nonce manzillarni tiklaydi. Shunday qilib, agar siz CREATE2 ga yana bir xil argumentlar bilan qo'ng'iroq qilsangiz, nonce tekshiruvi o'tadi.

E'tibor bering, ushbu yechim Ethereum manzili opsiyasiga o'xshaydi, lekin shaxsiy kalitlarni saqlashga hojat yo'q. Hamyondan hotwallet-ga pul o'tkazish qiymati taxminan funktsiyani chaqirish narxiga teng transfer(), chunki biz aqlli shartnomani joylashtirish uchun to'lamaymiz.

Yakuniy qaror

Joylashtirishdan oldin aqlli shartnoma manzilini qanday aniqlash mumkin: kripto almashinuvi uchun CREATE2 dan foydalanish

Dastlab tayyorlagan:

  • tuz olish funktsiyasi user_id
  • CREATE2 opkodini tegishli tuz bilan chaqiradigan aqlli shartnoma (masalan, hamyon fabrikasi)
  • quyidagi konstruktor bilan tuzilgan shartnomaga mos keladigan hamyon bayt-kodi:

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


Har bir yangi foydalanuvchi uchun biz hisob-kitob yo'li bilan uning hamyon manzilini ko'rsatamiz

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


Agar foydalanuvchi tokenlarni mos keladigan hamyon manziliga o'tkazsa, bizning orqa tomonimiz parametr bilan Transfer hodisasini ko'radi. _to, hamyon manziliga teng. Ayni paytda, hamyonni joylashtirishdan oldin birjadagi foydalanuvchi balansini oshirish mumkin.

Hamyon manzilida etarli miqdordagi tokenlar to'planganda, biz ularni bir vaqtning o'zida hotwallet-ga o'tkazishimiz mumkin. Buning uchun backend quyidagi amallarni bajaradigan aqlli kontrakt zavodi funksiyasini chaqiradi:

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


Shunday qilib, hamyon aqlli kontrakt konstruktori chaqiriladi, u o'zining barcha tokenlarini hotwallet manziliga o'tkazadi va keyin o'zini o'zi yo'q qiladi.

To'liq kodni topish mumkin shu yerda. Esda tutingki, bu bizning ishlab chiqarish kodimiz emas, chunki biz hamyon baytekodini optimallashtirishga qaror qildik va uni opkodlarda yozdik.

Muallif Pavel Kondratenkov, Ethereum mutaxassisi

Manba: www.habr.com

a Izoh qo'shish