Solidity入門|第29回:機能セレクタ

私は最近、Solidityを再学習し、詳細を統合し、初心者が使用できる「Solidity Minimalist Primer」を書いています(プログラミングの人は別のチュートリアルを見つけることができます)、週に1〜3回更新しています。

すべてのコードとチュートリアルはgithub:github.com/AmazingAng/WTFSolidityでオープンソースです。

セレクタ

スマートコントラクトの関数を呼び出すと、送信されるバイトコードの最初の4バイトがセレクターになります。 この講演では、セレクターとは何か、そしてその使い方について説明します。

msg.data

msg.data は Solidity のグローバル変数で、値は full calldata (関数を呼び出すバイトコード) です。

次のコードでは、Log イベントを使用して、mint 関数を呼び出す calldata を出力できます。

パラメータが0x2c44b726ADF1963cA47Af88B284C06f30380fC78の場合、出力calldataは

この厄介なバイトコードは、2つの部分に分けることができます。

実際、calldataは、どの関数を呼び出したいか、パラメータが何であるかをスマートコントラクトに伝えます。

関数のシグネチャとセレクタ

セレクタは関数シグネチャのハッシュの最初の4バイトとして定義されていますが、関数シグネチャとは何ですか?

実際、第21回では「関数名(カンマ区切りパラメータ型)」という関数シグネチャについて簡単に紹介しました。 たとえば、上記のコードのmintの関数シグネチャは「mint(address)」です。 スマートコントラクトでは、関数が異なれば関数シグネチャも異なるため、関数シグネチャからどの関数を呼び出すかを決定できます。

関数シグネチャでは、uint と int は uint256 と int256 と記述する必要があることに注意してください。

mint関数のセレクタが0x6a627842ことを確認する関数を書いてみましょう。 次の関数を実行して、結果を確認できます。

セレクタを使う

セレクタを使用して、ターゲット関数を呼び出すことができます。 たとえば、mint 関数を呼び出す場合は、abi.encodeWithSelector を使用して mint 関数のセレクタとパラメーターをエンコードし、それを call 関数に渡すだけです。

ログを見ると、mint関数が正常に呼び出され、Logイベントが出力されていることがわかります。

まとめ

この講演では、関数セレクタとは何か、msg.dataとの関係、関数シグネチャ、そしてそれを使用して目的関数を呼び出す方法を紹介しました。

原文表示
このページには第三者のコンテンツが含まれている場合があり、情報提供のみを目的としております(表明・保証をするものではありません)。Gateによる見解の支持や、金融・専門的な助言とみなされるべきものではありません。詳細については免責事項をご覧ください。
  • 報酬
  • コメント
  • リポスト
  • 共有
コメント
0/400
コメントなし
  • ピン