Ethereum ABI エンコーダー / デコーダー

関数シグネチャと引数から正確な calldata を生成したり、トランザクションの calldata を貼り付けてデコードしたりできます。ネストした配列、タプル、動的 bytes と string を含む ABI v2 に完全対応し、ワード単位の内訳を表示します。

整数は 10 進数または 0x hex(引用符は任意)。アドレス、bytes、string は引用符で囲みます。bytesN は 0x hex またはテキストを受け付けます。
例:

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

ABI エンコーディングとは

ABI エンコーディングは、関数呼び出しをバイト列に変換するための Solidity コントラクト ABI 仕様の規則です。4 バイトのセレクタの後に、引数を 32 バイトワードに詰めて並べます。静的な値はインラインに置かれ、動的な値(bytes、string、動的配列)はそのバイトオフセットを保持するヘッドの後ろに配置されます。ABI エンコーダーはシグネチャと値からこの calldata を組み立て、デコーダーはその逆を行います。

レイアウトの仕組み

f(uint256,uint32[],bytes10,bytes) を (0x123, [0x456, 0x789], "1234567890", "Hello, world!") で呼び出した場合のエンコードは次のとおりです: セレクタ 0x8be65246、続いて 4 ワードのヘッド(uint256、配列へのオフセット 0x80、右パディングされた bytes10、bytes へのオフセット 0xe0)、その後にテール(配列長 2 とその 2 要素、次に bytes 長 13 とパディングされたデータ)。上の「Solidity ドキュメントの f()」をクリックするとワード単位で確認できます。

規則の要点

具体例: ERC-20 の transfer

受取先 0x1111111111111111111111111111111111111111 に 25 USDT(生の単位で 25,000,000)を送る transfer(address,uint256) は 68 バイトにエンコードされます: セレクタ a9059cbb、次に 12 バイトのゼロによる左パディングに続く 20 バイトのアドレス、次に 25,000,000 = 0x17d7840 を 32 バイトワードに左パディングしたもの。あらゆるエクスプローラー上のあらゆる ERC-20 transfer がまさにこの形をしているため、デコーダーはセレクタだけで関数名を特定し引数を復元できるのです。

関連ツール

セレクタだけを計算するには関数セレクタツール、トークン量を生の整数に変換するにはトークン小数桁コンバーター、個々のワードを調べるにはhex→10進コンバーターを使ってください。

よくある質問

ABI エンコーディングとは何ですか?

Application Binary Interface は、トランザクションの data フィールド内で引数をどう配置するかを定義します: 4 バイトのセレクタの後に 32 バイトワードが続きます。静的型はインラインに置かれ、動的型(bytes、string、動的配列、それらを含むタプル)はヘッド内のオフセットで参照され、テールに配置されます。

引数はどう書きますか?

パラメータ順の JSON 配列として書きます。整数はそのままでも 0x hex でもよく、引用符の有無も問いません。大きな値は引用符で囲むか hex で書いてください。アドレスと string は引用符で囲みます。配列とタプルはネストした配列で、例えば uint256[][] には [[1,2],[3]] と書きます。

デコードした値が文字列として表示されるのはなぜですか?

253 を超える整数は JSON の数値として正確に表現できないため、すべての整数を 10 進文字列で表示しています。アドレスは EIP-55 チェックサム付きで表示されます。

Etherscan のトランザクションをデコードできますか?

はい。input data をコピーし、関数シグネチャと一緒に貼り付けてください。デコード前にセレクタがシグネチャと照合されます。セレクタが一致しない場合は、意味のない結果ではなくエラーが表示されます。

abi.encode と abi.encodePacked の違いは何ですか?

abi.encode は上記の標準規則に従い、すべての値を 32 バイトにパディングするためデコード可能です。abi.encodePacked は値を最小幅で連結し、パディングもオフセットもありません。短くなりますが曖昧で、型が分からなければデコードできません。このツールは標準のエンコーディングのみを実装しています。

カスタムエラーやイベントに対応していますか?

エンコード規則は同一なので、エラーのシグネチャを使ってエラーデータをエンコード/デコードできます。イベントログは異なります。indexed でないパラメータは data フィールドに ABI エンコードされるので、indexed でない型だけを含むシグネチャでその部分をデコードしてください。