Cara nemtokake alamat kontrak cerdas sadurunge panyebaran: nggunakake CREATE2 kanggo ijol-ijolan crypto

Topik pamblokiran ora tau mandheg dadi sumber ora mung kabeh jinis hype, nanging uga ide sing larang banget saka sudut pandang teknologi. Mulane, ora ngliwati warga kutha sing cerah. Wong-wong nggoleki kanthi teliti, sinau, nyoba nransfer keahliane babagan keamanan informasi tradisional menyang sistem blockchain. Nganti saiki, ana titik ing: salah sawijining pangembangan Rostelecom-Solar bisa mriksa keamanan piranti lunak berbasis blockchain. Lan ing sadawane dalan, sawetara pikirane muncul kanggo ngrampungake masalah sing ditrapake ing komunitas blockchain. Salah sawijining hacks urip iki - kepiye nemtokake alamat kontrak cerdas sadurunge nyebarake nggunakake CREATE2 - dina iki aku pengin bareng karo sampeyan.

Cara nemtokake alamat kontrak cerdas sadurunge panyebaran: nggunakake CREATE2 kanggo ijol-ijolan crypto
Opcode CREATE2 ditambahake ing garpu keras Konstantinopel tanggal 28 Februari taun iki. Kaya sing kasebut ing EIP, opcode iki dikenalake utamane kanggo saluran negara. Nanging, kita digunakake kanggo ngatasi masalah sing beda.

Ana pangguna kanthi saldo ing ijol-ijolan. Kita kudu menehi saben pangguna alamat Ethereum sing sapa wae bisa ngirim token, saΓ©ngga ngisi akun kasebut. Ayo diarani alamat kasebut "dompet". Nalika token teka ing dompet, kita kudu ngirim menyang dompet siji (hotwallet).

Ing bagean ing ngisor iki, aku nganalisa pilihan kanggo ngrampungake masalah iki tanpa CREATE2 lan pitutur marang kowe kenapa kita nilar. Yen sampeyan mung kasengsem ing asil final, sampeyan bisa nemokake ing bagean "Solusi Final".

alamat Ethereum

Solusi paling gampang yaiku ngasilake alamat Ethereum anyar kanggo pangguna anyar. Alamat kasebut bakal dadi dompet. Kanggo nransfer token saka dompet menyang hotwallet, sampeyan kudu mlebu transaksi kanthi nelpon fungsi kasebut transfer() karo kunci pribadi saka dompet saka backend.

Pendekatan iki nduweni kaluwihan ing ngisor iki:

  • iku mung
  • biaya transfer token saka dompet kanggo hotwallet padha karo biaya telpon fungsi transfer()

Nanging, kita mutusake nglawan pendekatan iki amarga ana siji kekurangan utama: sampeyan kudu nyimpen kunci pribadi ing endi wae. Ora mung bisa ilang, nanging sampeyan uga kudu kanthi ati-ati ngatur akses menyang tombol kasebut. Yen paling ora salah sijine dikompromi, mula token pangguna tartamtu ora bakal tekan dompet panas.

Cara nemtokake alamat kontrak cerdas sadurunge panyebaran: nggunakake CREATE2 kanggo ijol-ijolan crypto

Nggawe kontrak pinter sing kapisah kanggo saben pangguna

Nganggo kontrak cerdas sing kapisah kanggo saben pangguna ngidini sampeyan supaya ora nyimpen kunci pribadi kanggo dompet ing server. Ijol-ijolan bakal nelpon kontrak pinter iki kanggo nransfer token menyang hotwallet.

Kita uga ninggalake solusi iki, amarga pangguna ora bisa nuduhake alamat dompete tanpa masang kontrak cerdas (iki bisa uga, nanging kanthi cara sing rumit karo kekurangan liyane sing ora bakal dibahas ing kene). Ing ijol-ijolan, pangguna bisa nggawe akun akeh sing dibutuhake, lan saben wong butuh dompet dhewe. Iki tegese kita kudu mbuwang dhuwit kanggo nyebarake kontrak tanpa yakin manawa pangguna bakal nggunakake akun iki.

Opcode CREATE2

Kanggo ndandani masalah cara sadurunge, kita mutusake nggunakake opcode CREATE2. CREATE2 ngijini sampeyan kanggo nemtokake alamat ing ngendi kontrak pinter bakal disebarake. Alamat diitung nganggo rumus ing ngisor iki:

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


ngendi:

  • alamat β€” alamat kontrak pinter sing bakal nelpon CREATE2
  • uyah - Nilai acak
  • kode_init - bytecode kontrak pinter kanggo panyebaran

Iki mesthekake yen alamat sing diwenehake kanggo pangguna pancen ngemot kode byte sing dikarepake. Kajaba iku, kontrak cerdas iki bisa ditindakake kapan wae. Contone, nalika pangguna mutusake nggunakake dompet kanggo pisanan.
Cara nemtokake alamat kontrak cerdas sadurunge panyebaran: nggunakake CREATE2 kanggo ijol-ijolan crypto
Kajaba iku, sampeyan bisa ngetung alamat kontrak pinter saben wektu tinimbang nyimpen amarga:

  • alamat ing rumus punika pancet, awit iki alamat pabrik dompet kita
  • uyah β€” hash user_id
  • kode_init punika pancet awit kita nggunakake dompet padha

luwih dandan

Solusi sadurunge isih duwe kekurangan: sampeyan kudu mbayar kanggo masang kontrak cerdas. Nanging, sampeyan bisa nyingkirake. Kanggo nindakake iki, sampeyan bisa nelpon fungsi kasebut transfer(), lan banjur ngrusak diri() ing konstruktor dompet. Lan banjur gas kanggo deploying kontrak pinter bakal bali.

Beda karo kapercayan populer, sampeyan bisa masang kontrak pinter menyang alamat sing padha kaping pirang-pirang nganggo opcode CREATE2. Iki amarga CREATE2 mriksa yen nonce alamat target nol (diwenehake nilai "1" ing wiwitan konstruktor). Ing kasus iki, fungsi ngrusak diri() ngreset alamat nonce saben wektu. Dadi yen sampeyan nelpon CREATE2 maneh karo argumen sing padha, mriksa nonce bakal liwati.

Elinga yen solusi iki padha karo pilihan alamat Ethereum, nanging tanpa perlu nyimpen kunci pribadi. Biaya transfer dhuwit saka dompet menyang hotwallet kira-kira padha karo biaya nelpon fungsi transfer(), amarga kita ora mbayar panyebaran kontrak cerdas.

Kaputusan pungkasan

Cara nemtokake alamat kontrak cerdas sadurunge panyebaran: nggunakake CREATE2 kanggo ijol-ijolan crypto

Originally disiapake dening:

  • fungsi kanggo njaluk uyah dening user_id
  • kontrak pinter sing bakal nelpon opcode CREATE2 karo uyah sing cocok (i.e. pabrik dompet)
  • bytecode dompet sing cocog karo kontrak karo konstruktor ing ngisor iki:

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


Kanggo saben pangguna anyar, kita nuduhake alamat dompet kanthi pitungan

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


Nalika pangguna nransfer token menyang alamat dompet sing cocog, backend kita ndeleng acara Transfer kanthi parameter _kanggo, padha karo alamat dompet. Ing jalur iki, wis bisa nambah imbangan pangguna ing ijol-ijolan sadurunge masang dompet.

Nalika alamat dompet accumulates nomer cekap saka token, kita bisa nransfer kabeh bebarengan menyang hotwallet. Kanggo nindakake iki, backend nelpon fungsi pabrik kontrak cerdas, sing nindakake tumindak ing ngisor iki:

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


Mangkono, konstruktor kontrak pinter dompet diarani, sing nransfer kabeh token menyang alamat hotwallet lan banjur ngrusak dhewe.

Kode lengkap bisa ditemokake kene. Elinga yen iki dudu kode produksi kita, amarga kita mutusake kanggo ngoptimalake bytecode dompet lan nulis ing opcodes.

Penulis Pavel Kondratenkov, spesialis Ethereum

Source: www.habr.com

Add a comment