Kumaha nangtukeun alamat kontrak pinter saméméh deployment: ngagunakeun CREATE2 pikeun bursa crypto

Topik blockchain henteu lirén janten sumber sanés ngan ukur sagala jinis hype, tapi ogé ideu anu berharga tina sudut pandang téknologi. Ku alatan éta, manéhna teu bypass pangeusi kota cerah. Jalma-jalma ningali sacara saksama, diajar, nyobian ngalihkeun kaahlianna dina infobase tradisional kana sistem blockchain. Sajauh ieu, pointwise: salah sahiji kamajuan Rostelecom-Solar tiasa pariksa kaamanan software dumasar kana blockchain nu. Sareng sapanjang jalan, sababaraha pamikiran timbul pikeun ngarengsekeun masalah anu diterapkeun ku komunitas blockchain. Salah sahiji hacks hirup ieu - kumaha nangtukeun alamat kontrak pinter sateuacan nyebarkeun nganggo CREATE2 - dinten ayeuna kuring hoyong bagikeun sareng anjeun dina potongan.

Kumaha nangtukeun alamat kontrak pinter saméméh deployment: ngagunakeun CREATE2 pikeun bursa crypto
Opcode CREATE2 ditambahkeun dina garpu keras Konstantinopel dina 28 Pebruari taun ieu. Salaku nyatakeun dina EIP, opcode ieu diwanohkeun utamana pikeun saluran kaayaan. Nanging, kami nganggo éta pikeun ngabéréskeun masalah anu béda.

Aya pamaké kalawan balances on bursa. Urang kudu nyadiakeun unggal pamaké alamat Ethereum, nu saha bisa ngirim tokens, kukituna replenishing akun maranéhanana. Hayu urang nelepon alamat ieu "dompet". Nalika token sumping dina dompét, urang kedah ngirimkeunana ka dompét tunggal (hotwallet).

Dina bagian di handap ieu, kuring nganalisis pilihan pikeun ngarengsekeun masalah ieu tanpa CREATE2 sareng ngajelaskeun naha urang ngantunkeunana. Upami anjeun ngan ukur resep kana hasil ahir, anjeun tiasa mendakan éta dina bagian Solusi Akhir.

alamat Ethereum

Solusi pangbasajanna nyaéta pikeun ngahasilkeun alamat ethereum énggal pikeun pangguna énggal. Alamat ieu bakal dompét. Pikeun mindahkeun token tina dompét ka hotwallet, anjeun kedah ngadaptarkeun transaksi ku nelepon fungsina mindahkeun() jeung konci swasta tina dompét ti backend nu.

pendekatan ieu boga kaunggulan handap:

  • éta waé
  • biaya mindahkeun tokens tina dompét ka hotwallet sarua jeung biaya nelepon fungsi mindahkeun()

Nanging, kami ngantunkeun pendekatan ieu kusabab éta ngagaduhan hiji kalemahan anu penting: anjeun kedah nyimpen konci pribadi dimana waé. Sareng henteu ngan ukur aranjeunna tiasa leungit, tapi ogé anjeun kedah taliti ngatur aksés kana konci ieu. Upami sahenteuna salah sahijina dikompromi, maka token tina pangguna anu tangtu moal ngahontal dompét panas.

Kumaha nangtukeun alamat kontrak pinter saméméh deployment: ngagunakeun CREATE2 pikeun bursa crypto

Jieun kontrak pinter misah pikeun tiap pamaké

Nyebarkeun kontrak pinter anu misah pikeun unggal pangguna ngamungkinkeun anjeun henteu nyimpen konci pribadi tina dompét dina server. Bursa bakal nyauran kontrak pinter ieu pikeun mindahkeun token ka hotwallet.

Kami ogé ngantunkeun solusi ieu, sabab pangguna henteu tiasa nunjukkeun alamat dompétna tanpa nyebarkeun kontrak pinter (ieu saleresna mungkin, tapi dina cara anu rada rumit sareng kalemahan sanés anu urang moal bahas di dieu). Dina bursa, pamaké bisa nyieun saloba rekening sakumaha anjeunna perlu, sarta dulur perlu dompét sorangan. Ieu ngandung harti yén urang kudu méakkeun duit dina deploying kontrak tanpa malah yakin yén pamaké bakal ngagunakeun akun ieu.

Opcode CREATE2

Pikeun ngalereskeun masalah metode saméméhna, urang mutuskeun pikeun ngagunakeun opcode CREATE2. CREATE2 ngidinan Anjeun pikeun pre-nangtukeun alamat dimana kontrak pinter bakal deployed. Alamatna diitung ngagunakeun rumus ieu:

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


dimana:

  • alamat — alamat kontrak pinter anu bakal nelepon CREATE2
  • uyah - nilai acak
  • init_code - bytecode kontrak pinter pikeun deployment

Ieu ensures yén alamat kami nyadiakeun keur pamaké sabenerna bakal ngandung bytecode dipikahoyong. Ogé, kontrak pinter ieu tiasa disebarkeun iraha waé urang peryogi. Contona, nalika hiji pamaké megatkeun pikeun ngagunakeun dompét maranéhanana pikeun kahiji kalina.
Kumaha nangtukeun alamat kontrak pinter saméméh deployment: ngagunakeun CREATE2 pikeun bursa crypto
Sumawona, anjeun tiasa ngitung alamat kontrak pinter unggal waktos tinimbang nyimpen éta, sabab:

  • alamat dina rumus téh konstan sakumaha anu kasebut alamat pabrik dompét urang
  • uyah - user_id hash
  • init_code nyaeta permanén saprak urang ngagunakeun dompét sarua

Langkung perbaikan

Solusi sateuacana masih gaduh hiji kakurangan: anjeun kedah mayar panyebaran kontrak pinter. Najan kitu, anjeun bisa meunang leupas tina eta. Pikeun ieu anjeun tiasa nelepon fungsi mindahkeun(), teras salajengna ngancurkeun diri() dina constructor dompét. Lajeng gas pikeun deploying kontrak pinter bakal balik.

Sabalikna sareng kapercayaan umum, anjeun tiasa nyebarkeun kontrak pinter ka alamat anu sami sababaraha kali sareng opcode CREATE2. Ieu kusabab CREATE2 pariksa yén nonce tina alamat targétna nyaéta nol (ditugaskeun nilai "1" dina awal konstruktor). Dina waktu nu sarua, fungsi ngancurkeun diri() ngareset alamat nonce unggal waktos. Janten, upami anjeun nyauran CREATE2 deui sareng argumen anu sami, cek nonce bakal lulus.

Punten dicatet yén solusi ieu sami sareng solusi alamat ethereum, tapi tanpa kedah nyimpen konci pribadi. Biaya nransferkeun artos tina dompét ka dompét panas kirang langkung sami sareng biaya nelepon fungsi. mindahkeun(), Kusabab urang teu mayar deployment tina kontrak pinter.

Kaputusan ahir

Kumaha nangtukeun alamat kontrak pinter saméméh deployment: ngagunakeun CREATE2 pikeun bursa crypto

Mimitina disiapkeun:

  • fungsi pikeun meunangkeun uyah ku ID Pangguna
  • kontrak pinter anu bakal nelepon ka CREATE2 opcode kalawan uyah luyu (ie pabrik dompet)
  • bytecode dompét pakait jeung kontrak jeung constructor handap:

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


Pikeun unggal pangguna anyar, kami nunjukkeun alamat dompétna ku ngitung

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


Nalika pangguna mindahkeun token ka alamat dompét anu saluyu, backend kami ningali acara Transfer sareng parameter _kasarua jeung alamat dompét. Dina titik ieu, geus mungkin pikeun ngaronjatkeun kasaimbangan pamaké dina bursa saméméh deploying dompét.

Nalika cukup token akumulasi dina alamat dompét, urang tiasa nransper sadayana sakaligus kana hotwallet. Jang ngalampahkeun ieu, backend nyauran fungsi pabrik kontrak pinter, anu ngalaksanakeun tindakan ieu:

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


Ku kituna, konstruktor kontrak pinter dompet disebut, nu mindahkeun sakabéh tokens na ka alamat hotwallet lajeng timer destructs.

Kode lengkep bisa kapanggih di dieu. Punten dicatet yén ieu sanés kode produksi kami, sabab kami mutuskeun pikeun ngaoptimalkeun bytecode dompét sareng nyerat dina opcodes.

Panulis Pavel Kondratenkov, spesialis Ethereum

sumber: www.habr.com

Tambahkeun komentar