私は最近、Solidityを再学習し、詳細を統合し、初心者が使用できる「Solidity Minimalist Primer」を書いています(プログラミングの人は別のチュートリアルを見つけることができます)、週に1〜3回更新しています。
すべてのコードとチュートリアルはgithub:github.com/AmazingAng/WTFSolidityでオープンソースです。
スマートコントラクトの関数を呼び出すと、送信されるバイトコードの最初の4バイトがセレクターになります。 この講演では、セレクターとは何か、そしてその使い方について説明します。
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との関係、関数シグネチャ、そしてそれを使用して目的関数を呼び出す方法を紹介しました。
53.67K 人気度
10.25K 人気度
7.65K 人気度
2.78K 人気度
2.64K 人気度
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との関係、関数シグネチャ、そしてそれを使用して目的関数を呼び出す方法を紹介しました。