Жайгаштыруунун алдында акылдуу келишимдин дарегин кантип аныктоо керек: крипто алмашуу үчүн CREATE2 колдонуу

Блокчейн темасы эч качан ар кандай дүрбөлөңдүн гана эмес, ошондой эле технологиялык көз караштан алганда абдан баалуу идеялардын булагы болуп кала бербейт. Андыктан күнөстүү шаардын тургундарын да кыйгап өткөн жок. Адамдар кылдаттык менен карап, изилдеп, салттуу маалыматтык коопсуздук боюнча тажрыйбасын блокчейн системаларына өткөрүүгө аракет кылып жатышат. Азырынча бул так: Rostelecom-Solar иштеп чыгууларынын бири блокчейнге негизделген программалык камсыздоонун коопсуздугун текшере алат. Ал эми жолдо, кээ бир ойлор blockchain коомчулуктун прикладдык көйгөйлөрүн чечүү боюнча пайда болот. Бул лайфхактардын бири - CREATE2 аркылуу жайылтуудан мурун акылдуу келишимдин дарегин кантип аныктоо керек - бүгүн мен сиз менен кесиптин астында бөлүшкүм келет.

Жайгаштыруунун алдында акылдуу келишимдин дарегин кантип аныктоо керек: крипто алмашуу үчүн CREATE2 колдонуу
CREATE2 операция коду ушул жылдын 28-февралында Константинополдогу катуу айрыга кошулган. EIPде айтылгандай, бул opcode биринчи кезекте мамлекеттик каналдар үчүн киргизилген. Бирок, биз аны башка маселени чечүү үчүн колдондук.

Биржада балансы бар колдонуучулар бар. Биз ар бир колдонуучуга 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ге ошол эле аргументтер менен кайра чалсаңыз, анда nonnce текшерүүдөн өтөт.

Сураныч, бул чечим Ethereum дареги опциясына окшош экенин, бирок купуя ачкычтарды сактоонун зарылдыгы жок экенин эске алыңыз. Капчыктан hotwalletке акча которуунун баасы болжол менен функцияны чакыруу наркына барабар өткөрүп берүү(), анткени биз акылдуу келишимди жайылтуу үчүн төлөбөйбүз.

Акыркы чечим

Жайгаштыруунун алдында акылдуу келишимдин дарегин кантип аныктоо керек: крипто алмашуу үчүн CREATE2 колдонуу

Башында даярдаган:

  • туз алуу функциясы user_id
  • ылайыктуу туз менен CREATE2 opcode чакыра турган акылдуу келишим (мисалы, капчык фабрикасы)
  • төмөнкү конструктор менен келишимге ылайыктуу капчык байт коду:

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 окуясын көрөт. _ to, капчык дарегине барабар. Бул учурда, капчыкты жайылтуудан мурун биржада колдонуучунун балансын көбөйтүүгө болот.

Капчыктын дареги жетиштүү сандагы энбелгилерди топтогондо, биз алардын бардыгын бир убакта hotwalletке өткөрө алабыз. Бул үчүн, backend төмөнкү аракеттерди аткарган акылдуу контракт фабрикасынын функциясын чакырат:

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


Ошентип, капчыктын акылдуу контракт конструктору аталат, ал анын бардык белгилерин hotwallet дарегине өткөрүп, андан кийин өзүн-өзү жок кылат.

Толук кодду тапса болот бул жерде. Бул биздин өндүрүш кодубуз эмес экенин эске алыңыз, анткени биз капчыкты байт кодду оптималдаштырууну чечтик жана аны опкоддорго жаздык.

Author Pavel Kondratenkov, Ethereum адиси

Source: www.habr.com

Комментарий кошуу