関数セレクタ & イベントトピック計算ツール

関数またはイベントのシグネチャを貼り付けるとセレクタとトピックハッシュを取得できます。calldata で見つけたセレクタを貼り付けて、どの一般的な関数に属するかを調べることもできます。

パラメータ名、function、indexed、memory、returns 句は自動的に除去され、uint は uint256 に変換されます。

ブラウザ内で JavaScript により計算されます。アドレスがアップロードまたは保存されることはありません。

関数セレクタとは

関数セレクタは、関数の正規シグネチャ(関数名の後に、スペースやパラメータ名なしでパラメータ型を括弧で囲んだもの)の Keccak-256 ハッシュの先頭 4 バイトです。例: transfer(address,uint256) → 0xa9059cbb。すべてのコントラクト呼び出しの calldata の先頭 4 バイトを構成し、どの関数を実行するかをコントラクトに伝えます。残りのバイトは ABI エンコードされた引数です。

よく使われるセレクタ

この表はツールと同じ Keccak 実装によってページ上で計算されているため、セルフテストも兼ねています。上の入力欄に任意のセレクタを貼り付けると逆引きできます。

具体例

function approve(address spender, uint256 amount) external returns (bool) を例にします。キーワード、パラメータ名、可視性、戻り値の型を取り除くと approve(address,uint256) になります。この ASCII 文字列の Keccak-256 は 0x095ea7b3… で始まるので、セレクタは 0x095ea7b3 です。1 USDT(6 桁)を approve する calldata は、セレクタ、32 バイトに左パディングした spender アドレス、32 バイトワードとしての 1000000 で構成され、4 + 32 + 32 = 68 バイトになります。

最もよく目にする ERC-20 セレクタ

シグネチャセレクタ
totalSupply()0x18160ddd
balanceOf(address)0x70a08231
transfer(address,uint256)0xa9059cbb
transferFrom(address,address,uint256)0x23b872dd
approve(address,uint256)0x095ea7b3
allowance(address,address)0xdd62ed3e

よくある間違い

対応している入力形式

完全な calldata を組み立てたり読み解いたりするには、ABI エンコーダー / デコーダーに進んでください。

よくある質問

関数セレクタとは何ですか?

正規の関数シグネチャ(関数名とパラメータ型のみで、スペースや名前なし)の Keccak-256 ハッシュの先頭 4 バイトです。例: transfer(address,uint256) → 0xa9059cbb。EVM はこれを使って呼び出しを正しい関数に振り分けます。

なぜ uint ではなく uint256 を使う必要があるのですか?

正規シグネチャは完全な型名を使います。Solidity では uint は uint256 のエイリアスで、エイリアスをハッシュすると誤ったセレクタになります。このツールは uint/int を自動的に書き換え、パラメータ名とデータロケーションのキーワードを除去します。

タプル(構造体)はどう書きますか?

括弧で囲んだ型のリストとして書きます: exactInputSingle((address,address,uint24,address,uint256,uint256,uint256,uint160))。構造体のフィールドを順番に書き、構造体名自体はシグネチャに含めません。

イベントトピックとは何ですか?

イベントシグネチャの完全な 32 バイト Keccak-256 で、そのイベントが発行するすべてのログの topics[0] に格納されます。例: Transfer(address,address,uint256) → 0xddf252ad…。indexed パラメータは topics[1..3] になります。

セレクタは何通りありますか?

4 バイトなので 232、約 43 億通りです。既知のシグネチャが数万件ある中で衝突はまれですが実在します。1 つのコントラクト内では、Solidity コンパイラは同じセレクタを持つ 2 つの関数を拒否します。

2 つの関数が同じセレクタを持つことはありますか?

はい。4 バイトしか使わないため衝突は存在します。逆引きが複数のシグネチャを返すことがあるのも、同じコントラクト内で EVM が両者を区別できないのもこのためです。未知のセレクタについては、公開データベースの 4byte.directory と openchain.xyz を利用してください。