Ethereum イベントログデコーダー

生のログエントリ(address、topics、data)を名前付きのイベントとパラメーターに変換します。40 種類以上の一般的なイベントを自動認識し、それ以外はコントラクトの ABI を貼り付けてください。レシート内のすべてのログを一度にデコードします。

エクスプローラーの「Logs」タブ、viem、ethers、JSON-RPC エンベロープのいずれも使えます。レシート内のすべてのログをデコードします。
例:

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

イベントログとは

イベントログは、EVM コントラクトが LOG0–LOG4 オペコード(Solidity の emit)を実行したときに書き込む記録です。各エントリには、イベントを発行したコントラクトのアドレス、最大 4 つの 32 バイトの topics、そして任意長の data フィールドが含まれます。ログのデコードとは、topics[0] をイベントシグネチャに照合し、残りの topics から indexed パラメーターを読み取り、data から非 indexed パラメーターを ABI デコードすることです。エクスプローラーは検証済みソースを使ってこれを行いますが、このページはシグネチャだけを頼りに 40 種類以上の一般的なイベントを、あるいは貼り付けた任意の ABI を使ってデコードします。

ログのエンコード方法

フィールド内容例(ERC-20 Transfer)
addressイベントを発行したコントラクト0xdAC17F958D2ee523a2206206994597C13D831ec7(USDT)
topics[0]正規化シグネチャの keccak2560xddf252ad… = keccak256("Transfer(address,address,uint256)")
topics[1]1 番目の indexed パラメーター、32 バイトに左パディングfrom アドレス
topics[2]2 番目の indexed パラメーターto アドレス
dataすべての非 indexed パラメーターの ABI エンコード32 バイトの value

静的型(address、整数、bool、bytes1–32)の indexed パラメーターは topic にそのまま格納されます。動的型(string、bytes、配列、構造体)の indexed パラメーターは、Solidity ABI 仕様のイベントの節にあるとおり、そのエンコードの Keccak-256 ハッシュに置き換えられます。デコーダーはこれらをハッシュ済みとして表示します。

実例: USDT の転送

上の「ERC-20 Transfer」をクリックしてください。topics[0] は Transfer のシグネチャに一致し、topics がちょうど 3 つあるため、ERC-721 のレイアウト(indexed が 3 つ)ではなく ERC-20 のレイアウト(indexed なアドレスが 2 つ)が選ばれます。topics[1] は from = 0xd8dA6BF2…96045、topics[2] は to = 0x1111…1111 にデコードされ、data の唯一のワード 0x17d7840 は value = 25000000、USDT の小数点以下 6 桁で換算すると 25 USDT です。同じ仕組みで Uniswap V2 の Swap(indexed なアドレス 2 つと data 内の 4 つの金額)や、data フィールドにオフセットと長さ付きの動的配列を 2 つ持つ ERC-1155 の TransferBatch もデコードできます。

ABI なしで認識できるイベント

下の表はデコーダーが使うのと同じシグネチャリストからページ上で生成されるため、各 topics[0] の値は Keccak 実装のセルフテストにもなっています。対象は、ERC-20 と ERC-721 の Transfer と Approval、ApprovalForAll、ERC-1155 の TransferSingle、TransferBatch、URI、WETH の Deposit と Withdrawal、Uniswap V2 の Swap、Sync、Mint、Burn、PairCreated、Uniswap V3 の Swap、Mint、Burn、Collect、PoolCreated、OwnershipTransferred、EIP-1967 の Upgraded、AdminChanged、BeaconUpgraded、Initializable、Pausable、AccessControl のイベント、Permit2 の Approval、Permit、NonceInvalidation、Lockdown、ERC-4626 の Deposit と Withdraw、そして Safe の ExecutionSuccess、ExecutionFailure、SafeMultiSigTransaction、オーナーとしきい値の変更、SafeSetup、ProxyCreation です。

受け付ける入力

関連: セレクター・topic 計算ツールで任意のシグネチャから topic ハッシュを計算する、ABI デコーダーでトランザクションの calldata をデコードする、Ethereum トランザクションデコーダーで生のトランザクションを調べる。

よくある質問

Ethereum のログの topics と data とは何ですか?

ログには最大 4 つの 32 バイトの topics と可変長の data フィールドがあります。topics[0] はイベントシグネチャの Keccak-256 ハッシュです(anonymous イベントを除く)。topics[1..3] には indexed パラメーターが 1 topic に 1 つずつ入り、非 indexed パラメーターはすべて宣言順に、関数引数とまったく同じ方法で data に ABI エンコードされます。

indexed な string や bytes がハッシュで表示されるのはなぜですか?

EVM は動的な値を 32 バイトの topic に収められないため、Solidity は代わりにその値の keccak256 を格納します。元の文字列をログから復元することはできず、候補の値をハッシュして比較することしかできません。アドレス、整数、bool、bytesN は完全な形で格納され、通常どおりデコードされます。

ERC-20 と ERC-721 の Transfer は同じ topics[0] です。どう区別しますか?

どちらもシグネチャは Transfer(address,address,uint256) なので topics[0] は同一です。ERC-721 は tokenId を indexed にするため topics が 4 つで data は空、ERC-20 は from と to だけを indexed にするため topics が 3 つで data は 32 バイトになります。デコーダーは indexed の数がログと一致するレイアウトを選びます。

イベントが認識されない場合は?

ログは topics[0] を強調表示した生の形で表示されます。コントラクトの ABI(イベントだけで十分です)、または event Bid(address indexed bidder, uint256 amount) のような 1 行を ABI 欄に貼り付けて、もう一度デコードしてください。4byte.directory や openchain.xyz などのシグネチャデータベースは、未知の topic ハッシュの特定に役立ちます。

anonymous イベントはどう扱われますか?

anonymous と宣言されたイベントにはシグネチャの topic がないため、topics はすべて indexed パラメーターで、オンチェーンにはそれを識別するものがありません。デコーダーは、提供された ABI 内の anonymous イベントと topic の数で照合することしかできず、その旨を注記します。

金額はトークン単位に換算されますか?

整数は正確な 10 進数で表示されます。uint256 の値には、1018 と 106 で割った値のヒントが表示され、ETH、ほとんどの ERC-20、USDC、USDT をカバーします。それ以外の小数桁数はトークン小数桁コンバーターをお使いください。デコーダーは各トークンの小数桁数を知りません。

何かアップロードされますか?

いいえ。組み込みテーブルの topic ハッシュはページ読み込み時にブラウザ内で Keccak-256 により計算され、デコードもローカルで実行されます。ページは読み込み後にネットワークリクエストを行いません。