EVMのメソッドIDを理解する

こんにちは!弐号です。

EthereumなどのEVM系のチェーンでDeFiなどのコントラクトを呼ぶ際には、主に呼び先のコントラクトアドレスと、コントラクト内のどのメソッドを呼ぶか、どのような引数を渡すのかを指定する必要があります。

この記事では、呼び出すコントラクトのメソッドを(Solidityの場合)ローレベルでどのように指定しているのかを解説します。

トランザクションの中身

EVM系チェーンのトランザクションは、主に以下の内容で構成されています。

  • to: 送り先のアドレス
  • ナンス
  • ガス代
  • value: 総金額
  • 電子署名
  • data: コントラクトの呼び出しデータ

コントラクトを呼び出す際には、to に呼び出し先のコントラクトアドレスを指定し、data フィールドで呼び出し先のコントラクトメソッドおよび、引数を指定します。

実際に見てみましょう。

以下は Aave にて 0.01 $ETH を預け入れした際の data フィールドを Etherscan で確認したものです。

depositETH というメソッドが呼ばれ、その引数として address lendingPooladdress onBehalfOfuint16 referralCode が指定されていることが分かります。

この表示は Etherscan が分かりやすく表示してくれているものであり、実際のトランザクションに書かれている data フィールドの中身は以下のようなものです。

これを見て分かるとおり、どこにも depositETH に対応している文字列はありません。

それではコントラクト呼び出しの際に、どのようにメソッド名を識別しているのでしょうか?

メソッドID

その鍵は、一番目の画像に書かれているメソッドID (0x474cf53d) になります。

コントラクトの呼び出しの際には、コントラクトのそれぞれのメソッドに割り当てられたメソッドIDを指定することで、呼び出し先のメソッドを選択しています。

それではこのメソッドIDはどのように決まるのでしょうか?

実はメソッドIDはメソッド名と引数の型で一意に決まります。

具体的には「メソッド名(引数1の型,引数2の型,…)」を (Keccak-256で) ハッシュ化したものの先頭4バイトになります。

本当にそうなるのか、オンラインのハッシュ値計算ツールで確認してみましょう。

今回の例では「depositETH(address,address,uint16)」をハッシュ化したものとなるはずです。

ここから先は、会員限定のコンテンツになります。残り全てを見るには、サロン入会案内ページから会員登録をよろしくおねがいします。

関連記事