Байршуулахын өмнө ухаалаг гэрээний хаягийг хэрхэн тодорхойлох вэ: CREATE2-г крипто солилцоонд ашиглах

Блокчэйн сэдэв нь зөвхөн бүх төрлийн шуугиан дэгдээгээд зогсохгүй технологийн үүднээс маш үнэ цэнэтэй санаануудын эх сурвалж байсаар байх болно. Тиймээс нарлаг хотын оршин суугчдыг тойрсонгүй. Хүмүүс анхааралтай ажиглаж, судалж, уламжлалт мэдээллийн аюулгүй байдлын талаархи мэдлэгээ блокчейн систем рүү шилжүүлэхийг оролдож байна. Одоогийн байдлаар энэ нь маш чухал юм: Rostelecom-Solar-ийн бүтээн байгуулалтуудын нэг нь блокчейн дээр суурилсан програм хангамжийн аюулгүй байдлыг шалгах боломжтой. Замдаа блокчэйн нийгэмлэгийн хэрэглээний асуудлуудыг шийдвэрлэх талаар зарим бодол төрж байна. Эдгээр амьдралын хакеруудын нэг болох CREATE2-ийг ашиглан байршуулахаас өмнө ухаалаг гэрээний хаягийг хэрхэн тодорхойлох талаар өнөөдөр би тантай хуваалцахыг хүсч байна.

Байршуулахын өмнө ухаалаг гэрээний хаягийг хэрхэн тодорхойлох вэ: CREATE2-г крипто солилцоонд ашиглах
CREATE2 үйлдлийн кодыг энэ оны 28-р сарын XNUMX-нд Константинополын хатуу сэрээнд нэмсэн. EIP-д дурдсанчлан энэхүү үйлдлийн кодыг үндсэндээ улсын сувгуудад нэвтрүүлсэн. Гэсэн хэдий ч бид үүнийг өөр асуудлыг шийдвэрлэхэд ашигласан.

Бирж дээр үлдэгдэлтэй хэрэглэгчид байдаг. Бид хэрэглэгч бүрт жетон илгээх боломжтой Ethereum хаягийг өгөх ёстой бөгөөд ингэснээр тэдний дансыг нөхөх болно. Эдгээр хаягуудыг "түрийвч" гэж нэрлэе. Токенууд түрийвчинд ирэхэд бид тэдгээрийг нэг түрийвч рүү (hotwallet) илгээх ёстой.

Дараах хэсгүүдэд би CREATE2гүйгээр энэ асуудлыг шийдэх хувилбаруудад дүн шинжилгээ хийж, яагаад бид тэдгээрийг орхисныг танд хэлэх болно. Хэрэв та зөвхөн эцсийн үр дүнг сонирхож байгаа бол "Эцсийн шийдэл" хэсгээс олж болно.

Ethereum хаягууд

Хамгийн энгийн шийдэл бол шинэ хэрэглэгчдэд зориулсан Ethereum хаягийг бий болгох явдал юм. Эдгээр хаягууд нь түрийвч байх болно. Түрийвчээс hotwallet руу жетон шилжүүлэхийн тулд функц руу залгаж гүйлгээнд гарын үсэг зурах хэрэгтэй шилжүүлэх() ар талын түрийвчний хувийн түлхүүрээр.

Энэ арга нь дараахь давуу талуудтай.

  • энэ бол маш энгийн
  • хэтэвчээс hotwallet руу жетон шилжүүлэх зардал нь функцийн дуудлагын зардалтай тэнцүү байна шилжүүлэх()

Гэсэн хэдий ч бид энэ аргыг ашиглахаас татгалзсан, учир нь энэ нь нэг чухал сул талтай: та хувийн түлхүүрүүдийг хаа нэгтээ хадгалах хэрэгтэй. Тэдгээрийг алдаж болохоос гадна та эдгээр түлхүүрүүдэд хандах хандалтыг сайтар зохицуулах хэрэгтэй. Хэрэв тэдгээрийн дор хаяж нэг нь эвдэрсэн бол тухайн хэрэглэгчийн жетон халуун түрийвчэнд хүрэхгүй.

Байршуулахын өмнө ухаалаг гэрээний хаягийг хэрхэн тодорхойлох вэ: CREATE2-г крипто солилцоонд ашиглах

Хэрэглэгч бүрийн хувьд тусдаа ухаалаг гэрээ байгуул

Хэрэглэгч бүрт тусдаа ухаалаг гэрээ байгуулснаар түрийвчний хувийн түлхүүрүүдийг серверт хадгалахаас зайлсхийх боломжтой. Бирж нь жетоныг hotwallet руу шилжүүлэхийн тулд энэхүү ухаалаг гэрээг дуудах болно.

Ухаалаг гэрээ хийлгүйгээр хэрэглэгч түрийвчний хаягаа харуулах боломжгүй тул бид энэ шийдлийг орхисон (энэ нь үнэндээ боломжтой, гэхдээ бид энд ярихгүй бусад сул талуудтай нэлээд төвөгтэй байдлаар). Бирж дээр хэрэглэгч шаардлагатай тооны данс үүсгэх боломжтой бөгөөд тус бүр өөрийн хэтэвчтэй байх ёстой. Энэ нь хэрэглэгч энэ дансыг ашиглах болно гэдэгт эргэлзэхгүйгээр бид гэрээ байгуулахад мөнгө зарцуулах шаардлагатай гэсэн үг юм.

CREATE2 үйлдлийн код

Өмнөх аргын асуудлыг засахын тулд бид CREATE2 opcode ашиглахаар шийдсэн. CREATE2 нь ухаалаг гэрээг хаана байрлуулах хаягийг урьдчилан тодорхойлох боломжийг танд олгоно. Хаягийг дараах томъёогоор тооцоолно.

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


, хаана:

  • хаяг — CREATE2 руу залгах ухаалаг гэрээний хаяг
  • давс - санамсаргүй утга
  • init_code - байршуулах ухаалаг гэрээний байт код

Энэ нь бидний хэрэглэгчдэд өгөх хаяг нь хүссэн байт кодыг агуулж байгаа эсэхийг баталгаажуулдаг. Түүгээр ч барахгүй энэхүү ухаалаг гэрээг шаардлагатай үед ашиглах боломжтой. Жишээлбэл, хэрэглэгч түрийвчээ анх удаа ашиглахаар шийдсэн үед.
Байршуулахын өмнө ухаалаг гэрээний хаягийг хэрхэн тодорхойлох вэ: CREATE2-г крипто солилцоонд ашиглах
Үүнээс гадна, та ухаалаг гэрээний хаягийг хадгалахын оронд бүртгэх боломжтой, учир нь:

  • хаяг Энэ нь манай түрийвчний үйлдвэрийн хаяг тул томъёо нь тогтмол байна
  • давс — user_id хэш
  • init_code Бид ижил түрийвч ашигладаг тул тогтмол байдаг

Илүү сайжруулалтууд

Өмнөх шийдэл нь нэг сул талтай хэвээр байна: ухаалаг гэрээг ашиглахын тулд та төлбөр төлөх шаардлагатай болно. Гэсэн хэдий ч та үүнээс салж болно. Үүнийг хийхийн тулд та функцийг дуудаж болно шилжүүлэх(), Тэгээд өөрийгөө устгах() түрийвч бүтээгч дотор. Дараа нь ухаалаг гэрээг ашиглах хийг буцааж өгөх болно.

Түгээмэл итгэл үнэмшлээс үл хамааран та CREATE2 үйлдлийн кодоор ухаалаг гэрээг нэг хаяг руу олон удаа байрлуулж болно. Учир нь CREATE2 нь зорилтот хаягийн бус утга нь 1-тэй тэнцүү эсэхийг шалгадаг (үүнд байгуулагчийн эхэнд "XNUMX" гэсэн утгыг өгсөн). Энэ тохиолдолд функц өөрийгөө устгах() байнга хаягийг дахин тохируулдаг. Хэрэв та CREATE2-г ижил аргументуудаар дахин дуудвал nonce check өнгөрнө.

Энэ шийдэл нь Ethereum хаягийн сонголттой төстэй боловч хувийн түлхүүр хадгалах шаардлагагүй гэдгийг анхаарна уу. Түрийвчнээс hotwallet руу мөнгө шилжүүлэх зардал нь функцийг дуудах зардалтай ойролцоогоор тэнцүү байна шилжүүлэх(), учир нь бид ухаалаг гэрээний байршуулалтын төлбөрийг төлдөггүй.

Эцсийн шийдвэр

Байршуулахын өмнө ухаалаг гэрээний хаягийг хэрхэн тодорхойлох вэ: CREATE2-г крипто солилцоонд ашиглах

Анх бэлтгэсэн:

  • давс авах функц user_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

сэтгэгдэл нэмэх