什么是事件日志?
事件日志是 EVM 合约执行 LOG0–LOG4 操作码(Solidity 中的 emit)时写入的记录。每条日志包含发出事件的合约地址、最多四个 32 字节的 topics,以及一个任意长度的 data 字段。解码日志就是把 topics[0] 与某个事件签名匹配,从其余 topics 中读取 indexed 参数,再从 data 中按 ABI 解码非索引参数。区块浏览器借助已验证的源码完成这一步;本页仅凭签名即可解码四十余种常见事件,也可使用你粘贴的任意 ABI。
日志的编码方式
| 字段 | 内容 | 示例(ERC-20 Transfer) |
|---|---|---|
| address | 发出事件的合约 | 0xdAC17F958D2ee523a2206206994597C13D831ec7(USDT) |
| topics[0] | 规范签名的 keccak256 | 0xddf252ad… = keccak256("Transfer(address,address,uint256)") |
| topics[1] | 第一个索引参数,左侧补零至 32 字节 | from 地址 |
| topics[2] | 第二个索引参数 | to 地址 |
| data | 所有非索引参数的 ABI 编码 | 32 字节的 value |
静态类型(address、整数、bool、bytes1–32)的索引参数直接存放在 topic 中。动态类型(string、bytes、数组、结构体)的索引参数则按 Solidity ABI 规范事件章节的描述,替换为其编码的 Keccak-256 哈希;解码器会将这类参数标记为已哈希。
实例演示:一笔 USDT 转账
点击上方的“ERC-20 Transfer”。topics[0] 与 Transfer 签名匹配,并且由于恰好有三个 topics,解码器选择 ERC-20 布局(两个索引地址)而非 ERC-721 布局(三个索引参数)。topics[1] 解码为 from = 0xd8dA6BF2…96045,topics[2] 解码为 to = 0x1111…1111,data 中唯一的字 0x17d7840 即 value = 25000000,按 USDT 的 6 位小数计算就是 25 USDT。同样的机制也能解码 Uniswap V2 Swap(两个索引地址,data 中四个金额)或 ERC-1155 TransferBatch(其 data 字段包含两个带偏移量和长度的动态数组)。
无需 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。
接受的输入
- 从区块浏览器、viem、ethers 或 web3.py 复制的单个日志对象
{"address","topics","data"}。 - 日志数组、
eth_getLogs的result,或完整的 JSON-RPC 响应。 - 交易收据:其
logs数组中的每一项都会按顺序解码,并显示区块号、日志索引和交易哈希。 - 每行一条粘贴的 topics 加上 data 十六进制,适用于从 trace 或调试器中复制的日志;“topics[1]:” 之类的标签会被忽略。
- 可选的 ABI:JSON 片段数组、带
abi键的对象(Hardhat 和 Foundry 构建产物),或人类可读的event …行。ABI 中的事件优先于内置表。
相关工具:用选择器与 topic 计算器根据任意签名计算 topic 哈希,用 ABI 解码器解码交易的 calldata,或用以太坊交易解码器检查原始交易。