Giunsa pagtino ang adres sa usa ka intelihente nga kontrata sa wala pa i-deploy: gamit ang CREATE2 alang sa usa ka pagbinayloay sa crypto

Ang hilisgutan sa blockchain dili gayud mohunong nga mahimong tinubdan sa dili lamang sa tanan nga matang sa hype, apan usab sa mga ideya nga bililhon kaayo gikan sa usa ka teknolohikal nga punto sa panglantaw. Busa, wala kini makalapas sa mga residente sa sunny nga siyudad. Ang mga tawo nagtan-aw pag-ayo, nagtuon, naningkamot sa pagbalhin sa ilang kahanas sa tradisyonal nga seguridad sa impormasyon ngadto sa mga sistema sa blockchain. Sa pagkakaron, naa na kini: ang usa sa mga kalamboan sa Rostelecom-Solar mahimong masusi ang seguridad sa software nga nakabase sa blockchain. Ug sa dalan, ang pipila ka mga hunahuna mitungha sa pagsulbad sa mga problema nga gigamit sa komunidad nga blockchain. Usa sa mga hack sa kinabuhi - kung giunsa mahibal-an ang adres sa usa ka intelihente nga kontrata sa wala pa i-deploy gamit ang CREATE2 - karon gusto nako ipaambit kanimo sa ilawom sa pagputol.

Giunsa pagtino ang adres sa usa ka intelihente nga kontrata sa wala pa i-deploy: gamit ang CREATE2 alang sa usa ka pagbinayloay sa crypto
Ang CREATE2 opcode gidugang sa Constantinople hard fork niadtong Pebrero 28 ning tuiga. Ingon sa gipahayag sa EIP, kini nga opcode gipaila una sa mga channel sa estado. Bisan pa, gigamit namon kini aron masulbad ang lahi nga problema.

Adunay mga tiggamit nga adunay mga balanse sa pagbinayloay. Kinahanglan namon nga hatagan ang matag tiggamit og usa ka address sa Ethereum diin ang bisan kinsa makapadala mga token, sa ingon mapuno ang ilang account. Tawgon nato kini nga mga adres nga "mga pitaka". Kung ang mga token moabut sa mga pitaka, kinahanglan naton ipadala kini sa usa ka pitaka (hotwallet).

Sa mosunud nga mga seksyon, analisa nako ang mga kapilian sa pagsulbad sa kini nga problema nga wala CREATE2 ug isulti kanimo kung ngano nga gibiyaan namon sila. Kung interesado ka lang sa katapusang resulta, makit-an nimo kini sa seksyon nga "Katapusan nga Solusyon".

Mga adres sa Ethereum

Ang pinakasimple nga solusyon mao ang pagmugna og bag-ong mga adres sa Ethereum alang sa mga bag-ong tiggamit. Kini nga mga adres mao ang mga pitaka. Aron mabalhin ang mga token gikan sa usa ka pitaka ngadto sa hotwallet, kinahanglan nimo nga pirmahan ang transaksyon pinaagi sa pagtawag sa function pagbalhin() uban ang pribadong yawe sa pitaka gikan sa backend.

Kini nga pamaagi adunay mga mosunod nga bentaha:

  • yano ra
  • ang gasto sa pagbalhin sa mga token gikan sa usa ka pitaka ngadto sa hotwallet katumbas sa gasto sa usa ka function call pagbalhin()

Bisan pa, nakahukom kami batok niini nga pamaagi tungod kay kini adunay usa ka dako nga disbentaha: kinahanglan nimo nga tipigan ang pribadong mga yawe bisan asa. Dili lamang sila mahimong mawala, apan kinahanglan usab nimo nga maampingon ang pagdumala sa pag-access sa kini nga mga yawe. Kung labing menos usa niini ang nakompromiso, nan ang mga token sa usa ka partikular nga tiggamit dili makaabot sa init nga pitaka.

Giunsa pagtino ang adres sa usa ka intelihente nga kontrata sa wala pa i-deploy: gamit ang CREATE2 alang sa usa ka pagbinayloay sa crypto

Paghimo og bulag nga smart contract para sa matag user

Ang pag-deploy sa usa ka bulag nga smart nga kontrata alang sa matag tiggamit nagtugot kanimo sa paglikay sa pagtipig sa mga pribadong yawe alang sa mga pitaka sa server. Ang pagbinayloay motawag niining smart nga kontrata aron ibalhin ang mga token ngadto sa hotwallet.

Gibiyaan usab namo kini nga solusyon, tungod kay ang user dili mapakita sa iyang pitaka nga address nga walay pag-deploy sa usa ka smart nga kontrata (kini posible gayud, apan sa usa ka komplikado nga paagi sa uban nga mga disadvantages nga dili namo hisgutan dinhi). Sa pagbinayloay, ang usa ka tiggamit makahimo og daghang mga account nga iyang gikinahanglan, ug ang matag usa nagkinahanglan sa iyang kaugalingong pitaka. Nagpasabut kini nga kinahanglan namon nga mogasto og salapi sa pag-deploy sa usa ka kontrata nga wala gani sigurado nga gamiton sa tiggamit kini nga account.

Opcode CREATE2

Aron ayuhon ang problema sa miaging pamaagi, nakahukom kami nga gamiton ang CREATE2 opcode. Gitugotan ka sa CREATE2 nga matino nang daan ang adres kung diin i-deploy ang smart contract. Ang adres gikalkulo gamit ang mosunod nga pormula:

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


, diin:

  • nga adres β€” ang adres sa smart contract nga motawag ug CREATE2
  • asin - random nga bili
  • init_code - smart contract bytecode para sa pag-deploy

Gisiguro niini nga ang adres nga among gihatag sa tiggamit adunay tinuud nga gitinguha nga bytecode. Dugang pa, kini nga intelihente nga kontrata mahimong ma-deploy kung kinahanglan namon. Pananglitan, kung ang usa ka tiggamit nakahukom nga gamiton ang ilang pitaka sa unang higayon.
Giunsa pagtino ang adres sa usa ka intelihente nga kontrata sa wala pa i-deploy: gamit ang CREATE2 alang sa usa ka pagbinayloay sa crypto
Dugang pa, mahimo nimong kuwentahon ang intelihente nga adres sa kontrata matag oras imbis nga itago kini tungod kay:

  • nga adres sa pormula kanunay, tungod kay kini ang adres sa among pabrika sa pitaka
  • asin β€” user_id hash
  • init_code kay pareha ra ang pitaka atong gigamit

Dugang mga kalamboan

Ang nauna nga solusyon adunay usa pa nga disbentaha: kinahanglan nimo nga magbayad aron ma-deploy ang smart nga kontrata. Bisan pa, mahimo nimong mapapas kini. Aron mahimo kini mahimo nimong tawagan ang function pagbalhin()ug unya pagguba sa kaugalingon() sa wallet constructor. Ug unya ang gas alang sa pag-deploy sa smart nga kontrata ibalik.

Sukwahi sa popular nga pagtuo, mahimo nimong i-deploy ang usa ka intelihente nga kontrata sa parehas nga adres daghang beses sa CREATE2 opcode. Kini tungod kay ang CREATE2 nagsusi nga ang nonce sa target nga adres mao ang zero (kini gi-assign sa kantidad nga "1" sa sinugdanan sa constructor). Sa kini nga kaso, ang function pagguba sa kaugalingon() i-reset ang mga nonce nga adres matag higayon. Mao nga kung tawagan nimo pag-usab ang CREATE2 nga adunay parehas nga mga argumento, ang nonce check moagi.

Palihug timan-i nga kini nga solusyon susama sa opsyon sa Ethereum address, apan walay panginahanglan sa pagtipig sa pribadong mga yawe. Ang gasto sa pagbalhin sa salapi gikan sa usa ka pitaka ngadto sa hotwallet gibana-bana nga katumbas sa gasto sa pagtawag sa usa ka function pagbalhin(), tungod kay wala kami nagbayad alang sa pag-deploy sa smart nga kontrata.

Katapusan nga desisyon

Giunsa pagtino ang adres sa usa ka intelihente nga kontrata sa wala pa i-deploy: gamit ang CREATE2 alang sa usa ka pagbinayloay sa crypto

Orihinal nga giandam ni:

  • function sa pagkuha sa asin pinaagi sa user_id
  • usa ka intelihente nga kontrata nga magtawag sa CREATE2 opcode nga adunay angay nga asin (ie pabrika sa pitaka)
  • pitaka bytecode nga katumbas sa kontrata uban sa mosunod nga constructor:

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


Alang sa matag bag-ong tiggamit among gipakita ang iyang address sa pitaka pinaagi sa kalkulasyon

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


Kung ang usa ka tiggamit magbalhin sa mga token sa katugbang nga adres sa pitaka, ang among backend makakita sa usa ka kalihokan sa Pagbalhin nga adunay parameter _sa, katumbas sa adres sa pitaka. Niini nga punto, posible na nga madugangan ang balanse sa user sa exchange sa dili pa i-deploy ang pitaka.

Kung ang usa ka adres sa pitaka makaipon ug igo nga gidaghanon sa mga token, mahimo namong ibalhin silang tanan sa usa ka higayon sa hotwallet. Aron mahimo kini, ang backend nagtawag sa smart contract factory function, nga naghimo sa mosunod nga mga aksyon:

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


Sa ingon, gitawag ang wallet smart contract constructor, nga nagbalhin sa tanan nga mga token niini sa adres sa hotwallet ug dayon nagdaot sa kaugalingon.

Makita ang tibuok code dinhi. Palihug timan-i nga dili kini ang among code sa produksiyon, tungod kay nakahukom kami nga i-optimize ang bytecode sa pitaka ug gisulat kini sa mga opcode.

Awtor Pavel Kondratenkov, espesyalista sa Ethereum

Source: www.habr.com

Idugang sa usa ka comment