こんにちは!弐号です。
EthereumなどのEVM系のチェーンでDeFiなどのコントラクトを呼ぶ際には、主に呼び先のコントラクトアドレスと、コントラクト内のどのメソッドを呼ぶか、どのような引数を渡すのかを指定する必要があります。
この記事では、呼び出すコントラクトのメソッドを(Solidityの場合)ローレベルでどのように指定しているのかを解説します。
トランザクションの中身
EVM系チェーンのトランザクションは、主に以下の内容で構成されています。
- to: 送り先のアドレス
- ナンス
- ガス代
- value: 総金額
- 電子署名
- data: コントラクトの呼び出しデータ
コントラクトを呼び出す際には、to
に呼び出し先のコントラクトアドレスを指定し、data
フィールドで呼び出し先のコントラクトメソッドおよび、引数を指定します。
実際に見てみましょう。
以下は Aave にて 0.01 $ETH を預け入れした際の data
フィールドを Etherscan で確認したものです。
depositETH
というメソッドが呼ばれ、その引数として address lendingPool
、address onBehalfOf
、uint16 referralCode
が指定されていることが分かります。
この表示は Etherscan が分かりやすく表示してくれているものであり、実際のトランザクションに書かれている data
フィールドの中身は以下のようなものです。
これを見て分かるとおり、どこにも depositETH
に対応している文字列はありません。
それではコントラクト呼び出しの際に、どのようにメソッド名を識別しているのでしょうか?
メソッドID
その鍵は、一番目の画像に書かれているメソッドID (0x474cf53d) になります。
コントラクトの呼び出しの際には、コントラクトのそれぞれのメソッドに割り当てられたメソッドIDを指定することで、呼び出し先のメソッドを選択しています。
それではこのメソッドIDはどのように決まるのでしょうか?
実はメソッドIDはメソッド名と引数の型で一意に決まります。
具体的には「メソッド名(引数1の型,引数2の型,…)」を (Keccak-256で) ハッシュ化したものの先頭4バイトになります。
本当にそうなるのか、オンラインのハッシュ値計算ツールで確認してみましょう。
今回の例では「depositETH(address,address,uint16)」をハッシュ化したものとなるはずです。
確
ここから先は、会員限定のコンテンツになります。残り全てを見るには、サロン入会案内ページから会員登録をよろしくおねがいします。