Ki jan yo detèmine adrès yon kontra entelijan anvan deplwaman: lè l sèvi avèk CREATE2 pou yon echanj crypto

Sijè blòk la pa janm sispann yon sous pa sèlman tout kalite battage, men tou, lide ki gen anpil valè nan yon pwen de vi teknolojik. Se poutèt sa, li pa t 'kontoune moun ki abite yo nan lavil la solèy. Moun ap gade ak anpil atansyon, etidye, ap eseye transfere ekspètiz yo nan sekirite enfòmasyon tradisyonèl nan sistèm blòk. Se konsa, lwen, li nan plas sou: youn nan devlopman Rostelecom-Solar a ka tcheke sekirite nan lojisyèl ki baze sou blòk. Ak sou wout la, kèk panse leve sou rezoud pwoblèm aplike nan kominote a blockchain. Youn nan antay lavi sa yo - ki jan yo detèmine adrès la nan yon kontra entelijan anvan deplwaman lè l sèvi avèk CREATE2 - jodi a mwen vle pataje avèk ou anba koupe a.

Ki jan yo detèmine adrès yon kontra entelijan anvan deplwaman: lè l sèvi avèk CREATE2 pou yon echanj crypto
Opcode CREATE2 te ajoute nan fork difisil Constantinople nan 28 fevriye ane sa a. Jan sa di nan EIP a, opcode sa a te prezante sitou pou chanèl leta yo. Sepandan, nou itilize li pou rezoud yon pwoblèm diferan.

Gen itilizatè ki gen balans sou echanj la. Nou dwe bay chak itilizatè yon adrès Ethereum kote nenpòt moun ka voye marqueur, kidonk ranpli kont yo. Ann rele adrès sa yo "bous". Lè tokens rive nan bous, nou dwe voye yo nan yon sèl bous (hotwallet).

Nan seksyon sa yo, mwen analize opsyon pou rezoud pwoblèm sa a san CREATE2 epi mwen di w poukisa nou abandone yo. Si w enterese sèlman nan rezilta final la, ou ka jwenn li nan seksyon "Solisyon final la".

adrès Ethereum

Solisyon ki pi senp la se jenere nouvo adrès Ethereum pou nouvo itilizatè yo. Adrès sa yo pral bous yo. Pou transfere marqueur soti nan yon bous nan hotwallet, ou bezwen siyen tranzaksyon an lè w rele fonksyon an transfere () ak kle prive nan bous la soti nan backend la.

Apwòch sa a gen avantaj sa yo:

  • se jis
  • pri a nan transfere marqueur soti nan yon bous nan hotwallet egal a pri a nan yon apèl fonksyon transfere ()

Sepandan, nou te deside kont apwòch sa a paske li gen yon gwo dezavantaj: ou bezwen sere kle prive yo yon kote. Se pa sèlman yo ka pèdi, men ou bezwen tou ak anpil atansyon jere aksè a kle sa yo. Si omwen youn nan yo konpwomèt, Lè sa a, marqueur yo nan yon itilizatè patikilye pa pral rive nan bous la cho.

Ki jan yo detèmine adrès yon kontra entelijan anvan deplwaman: lè l sèvi avèk CREATE2 pou yon echanj crypto

Kreye yon kontra entelijan separe pou chak itilizatè

Deplwaye yon kontra entelijan separe pou chak itilizatè pèmèt ou evite estoke kle prive pou bous sou sèvè a. Echanj la pral rele kontra entelijan sa a pou transfere marqueur yo nan hotwallet la.

Nou menm tou nou abandone solisyon sa a, depi itilizatè a pa ka montre adrès bous li san yo pa deplwaye yon kontra entelijan (sa a se aktyèlman posib, men nan yon fason olye konplèks ak lòt dezavantaj ke nou pa pral diskite isit la). Sou echanj la, yon itilizatè ka kreye anpil kont jan li bezwen, epi chak moun bezwen pwòp bous li. Sa vle di ke nou bezwen depanse lajan sou deplwaye yon kontra san yo pa menm asire w ke itilizatè a pral sèvi ak kont sa a.

Opcode CREATE2

Pou rezoud pwoblèm metòd anvan an, nou deside sèvi ak CREATE2 opcode. CREATE2 pèmèt ou pre-detèmine adrès kote kontra entelijan an pral deplwaye. Adrès la kalkile ak fòmil sa a:

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


, kote:

  • adrès — adrès kontra entelijan ki pral rele CREATE2
  • sèl - valè o aza
  • init_code - bytecode kontra entelijan pou deplwaman

Sa a asire ke adrès nou bay itilizatè a aktyèlman gen bytecode a vle. Anplis, kontra entelijan sa a ka deplwaye chak fwa nou bezwen. Pou egzanp, lè yon itilizatè deside sèvi ak bous yo pou premye fwa.
Ki jan yo detèmine adrès yon kontra entelijan anvan deplwaman: lè l sèvi avèk CREATE2 pou yon echanj crypto
Anplis, ou ka kalkile adrès kontra entelijan an chak fwa olye pou yo estoke li paske:

  • adrès nan fòmil la se konstan, depi sa a se adrès la nan faktori bous nou an
  • sèl — user_id hash
  • init_code se konstan depi nou itilize menm bous la

Plis amelyorasyon

Solisyon anvan an toujou gen yon dezavantaj: ou bezwen peye pou deplwaye kontra entelijan an. Sepandan, ou ka debarase m de li. Pou fè sa ou ka rele fonksyon an transfere ()ak lè sa a otodestriksyon () nan konstrukteur nan bous. Lè sa a, gaz la pou deplwaye kontra entelijan an pral retounen.

Kontrèman ak kwayans popilè, ou ka deplwaye yon kontra entelijan nan menm adrès la plizyè fwa ak opcode CREATE2 la. Sa a se paske CREATE2 tcheke ke nonce adrès sib la se zewo (yo bay li valè "1" nan kòmansman an nan konstrukteur a). Nan ka sa a, fonksyon an otodestriksyon () reset adrès nonce chak fwa. Se konsa, si ou rele CREATE2 ankò ak agiman yo menm, chèk la nonce ap pase.

Tanpri sonje ke solisyon sa a sanble ak opsyon adrès Ethereum, men san yo pa bezwen sere kle prive. Pri a nan transfere lajan soti nan yon bous nan hotwallet se apeprè egal a pri a pou rele yon fonksyon transfere (), depi nou pa peye pou deplwaman kontra entelijan.

Desizyon final la

Ki jan yo detèmine adrès yon kontra entelijan anvan deplwaman: lè l sèvi avèk CREATE2 pou yon echanj crypto

Okòmansman prepare pa:

  • fonksyon pou jwenn sèl pa user_id
  • yon kontra entelijan ki pral rele opcode CREATE2 ak sèl ki apwopriye a (sa vle di faktori bous)
  • bytecode bous ki koresponn ak kontra a ak konstrukteur sa a:

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


Pou chak nouvo itilizatè nou montre adrès bous li pa kalkil

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


Lè yon itilizatè transfere marqueur nan adrès bous ki koresponn lan, backend nou an wè yon evènman Transfè ak paramèt la. _pou, egal a adrès bous la. Nan pwen sa a, li deja posib pou ogmante balans itilizatè a sou echanj la anvan deplwaye bous la.

Lè yon adrès bous akimile yon kantite ase nan marqueur, nou ka transfere yo tout nan yon fwa nan hotwallet. Pou fè sa, backend la rele fonksyon faktori kontra entelijan, ki fè aksyon sa yo:

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


Kidonk, yo rele bous entelijan kontra konstrukteur a, ki transfere tout marqueur li yo nan adrès hotwallet la ak Lè sa a, pwòp tèt ou-destriksyon.

Ou ka jwenn kòd konplè a isit la. Tanpri sonje ke sa a se pa kòd pwodiksyon nou an, kòm nou deside optimize bytecode nan bous epi ekri li nan opcodes.

Otè Pavel Kondratenkov, espesyalis Ethereum

Sous: www.habr.com

Add nouvo kòmantè