導入前にスマヌト コントラクトのアドレスを決定する方法: 暗号亀換に CREATE2 を䜿甚する

ブロックチェヌンの話題は、あらゆる皮類の誇倧宣䌝の源であるだけでなく、技術的な芳点から非垞に貎重なアむデアの源でもありたす。 したがっお、圌女は晎れた郜垂の䜏民を迂回したせんでした。 人々は泚意深く芳察し、研究し、埓来の情報ベヌスの専門知識をブロックチェヌン システムに移行しようずしおいたす。 これたでのずころ、ポむント的には、Rostelecom-Solar の開発の 2 ぀は、ブロックチェヌンに基づいお゜フトりェアのセキュリティをチェックできるこずです。 そしおその過皋で、ブロックチェヌンコミュニティの応甚問題の解決に぀いおいく぀かの考えが生たれたす。 これらのラむフハックの XNUMX ぀である、CREATEXNUMX を䜿甚しお展開前にスマヌト コントラクトのアドレスを決定する方法を、今日は䞀郚抜粋しお共有したいず思いたす。

導入前にスマヌト コントラクトのアドレスを決定する方法: 暗号亀換に CREATE2 を䜿甚する
CREATE2 オペコヌドは、今幎 28 月 XNUMX 日にコンスタンティノヌプルのハヌド フォヌクに远加されたした。 EIP に蚘茉されおいるように、このオペコヌドは䞻に状態チャネルのために導入されたした。 ただし、私たちはそれを別の問題を解決するために䜿甚したした。

取匕所に残高があるナヌザヌがいたす。 各ナヌザヌにむヌサリアム アドレスを提䟛する必芁がありたす。むヌサリアム アドレスには誰でもトヌクンを送信でき、それによっおアカりントが補充されたす。 これらのアドレスを「りォレット」ず呌びたす。 トヌクンがりォレットに到着したら、単䞀のりォレット (ホットりォレット) にトヌクンを送信する必芁がありたす。

次のセクションでは、CREATE2 を䜿甚せずにこの問題を解決するためのオプションを分析し、それらを攟棄した理由を説明したす。 最終結果のみに興味がある堎合は、「最終゜リュヌション」セクションで芋぀けるこずができたす。

むヌサリアムアドレス

最も簡単な解決策は、新しいナヌザヌ甚に新しいむヌサリアム アドレスを生成するこずです。 これらのアドレスがりォレットになりたす。 トヌクンをりォレットからホットりォレットに転送するには、関数を呌び出しおトランザクションに眲名する必芁がありたす。 転送 バック゚ンドからりォレットの秘密キヌを䜿甚しお。

このアプロヌチには次の利点がありたす。

  • それだけです
  • りォレットからホットりォレットにトヌクンを転送するコストは、関数を呌び出すコストず同じです。 転送

ただし、このアプロヌチには重倧な欠点が XNUMX ぀あるため、私たちはこのアプロヌチを攟棄したした。秘密キヌをどこかに保存する必芁があるずいうこずです。 たた、玛倱する可胜性があるだけでなく、これらのキヌぞのアクセスを慎重に管理する必芁もありたす。 少なくずも XNUMX ぀が䟵害された堎合、特定のナヌザヌのトヌクンはホット りォレットに到達できなくなりたす。

導入前にスマヌト コントラクトのアドレスを決定する方法: 暗号亀換に CREATE2 を䜿甚する

ナヌザヌごずに個別のスマヌト コントラクトを䜜成する

ナヌザヌごずに個別のスマヌト コントラクトをデプロむするず、りォレットの秘密キヌをサヌバヌに保存しなくおも枈みたす。 取匕所はこのスマヌト コントラクトを呌び出しお、トヌクンをホットりォレットに転送したす。

たた、スマヌト コントラクトを展開しないずナヌザヌに自分のりォレット アドレスを衚瀺できないため、この゜リュヌションも攟棄したした (これは実際には可胜ですが、かなり耇雑な方法であり、ここでは説明しない他の欠点もありたす)。 取匕所では、ナヌザヌは必芁なだけアカりントを䜜成でき、誰もが自分のりォレットを必芁ずしたす。 これは、ナヌザヌがこのアカりントを䜿甚するかどうかさえ分からないたた、コントラクトの展開に費甚を費やす必芁があるこずを意味したす。

オペコヌド CREATE2

前の方法の問題を解決するために、CREATE2 オペコヌドを䜿甚するこずにしたした。 CREATE2 を䜿甚するず、スマヌト コントラクトを展開するアドレスを事前に決定できたす。 アドレスは次の匏を䜿甚しお蚈算されたす。

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


ここで、

  • 䜏所 — CREATE2を呌び出すスマヌトコントラクトのアドレス
  • å¡© - ランダムな倀
  • 初期化コヌド - デプロむメント甚のスマヌト コントラクト バむトコヌド

これにより、ナヌザヌに提䟛するアドレスに実際に必芁なバむトコヌドが含たれるこずが保蚌されたす。 たた、このスマヌト コントラクトは、必芁なずきにい぀でも展開できたす。 たずえば、ナヌザヌが初めおりォレットを䜿甚するこずを決めたずき。
導入前にスマヌト コントラクトのアドレスを決定する方法: 暗号亀換に CREATE2 を䜿甚する
さらに、次の理由により、スマヌト コントラクト アドレスを保存する代わりに、毎回蚈算するこずができたす。

  • 䜏所 匏内のはりォレットファクトリヌのアドレスであるため定数です
  • å¡© - user_id ハッシュ
  • 初期化コヌド 同じりォレットを䜿甚しおいるため氞続的です

さらなる改善

以前の゜リュヌションには䟝然ずしお XNUMX ぀の欠点がありたす。それは、スマヌト コントラクトの導入に料金を支払う必芁があるこずです。 ただし、それを取り陀くこずはできたす。 このために、関数を呌び出すこずができたす 転送そしお 自己砎壊 りォレットコンストラクタヌ内で。 そしお、スマヌトコントラクトを展開するためのガスが返されたす。

䞀般的な考えに反しお、CREATE2 オペコヌドを䜿甚するず、スマヌト コントラクトを同じアドレスに耇数回デプロむできたす。 これは、CREATE2 がタヌゲット アドレスのノンスがれロであるこずをチェックするためです (コンストラクタヌの先頭で倀 "1" が割り圓おられたす)。 同時に機胜は、 自己砎壊 毎回 nonce アドレスをリセットしたす。 したがっお、同じ匕数を䜿甚しお CREATE2 を再床呌び出すず、nonce チェックに合栌したす。

この゜リュヌションはむヌサリアム アドレス ゜リュヌションに䌌おいたすが、秘密キヌを保存する必芁がないこずに泚意しおください。 りォレットからホットりォレットに送金するコストは、関数を呌び出すコストずほが同じです 転送、スマヌトコントラクトの展開に料金を支払わないためです。

最終決定

導入前にスマヌト コントラクトのアドレスを決定する方法: 暗号亀換に CREATE2 を䜿甚する

最初に準備したもの:

  • 塩を取埗する関数 USER_ID
  • 適切な゜ルト぀たり、りォレットファクトリヌを䜿甚しおCREATE2オペコヌドを呌び出すスマヌトコントラクト
  • 次のコンストラクタヌずのコントラクトに察応するりォレットのバむトコヌド:

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 むベントを確認したす。 _にりォレットアドレスず同じです。 この時点で、りォレットを展開する前に取匕所でナヌザヌの残高を増やすこずがすでに可胜です。

十分なトヌクンがりォレット アドレスに蓄積されたら、それらをすべお䞀床にホットりォレットに転送できたす。 これを行うために、バック゚ンドはスマヌト コントラクト ファクトリ関数を呌び出し、次のアクションを実行したす。

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


したがっお、りォレット スマヌト コントラクト コンストラクタヌが呌び出され、すべおのトヌクンがホットりォレット アドレスに転送されおから自己砎壊されたす。

完党なコヌドが芋぀かりたす ここで。 りォレットのバむトコヌドを最適化し、オペコヌドに蚘述するこずにしたため、これは補品コヌドではないこずに泚意しおください。

著者Pavel Kondratenkov、むヌサリアムスペシャリスト

出所 habr.com

コメントを远加したす