摘要:对照 ethereum.org 中文 eth_getLogs 与事件日志文档,用公开 RPC 对主网 USDT Transfer 跑只读过滤器,并在 Etherscan Logs 核对 topic0。与回执 Logs、ERC-20 解码、cast call 文区分。

站内已有 交易回执 Status / Logs、ERC-20 Transfer / Approve 怎么读 与 Foundry cast 读存储。本篇换角度:不讲「打开某一笔交易再翻 Logs」,而讲用 JSON-RPC 的 eth_getLogs,按 address / fromBlock / toBlock / topics 去过滤一段区间内的事件。全程只读公开 RPC,不发交易、不需要钱包余额。

一、官方:eth_getLogs 过滤器字段

ethereum.org 中文「JSON-RPC API」里,eth_getLogs 的说明是:返回与给定过滤器对象匹配的所有日志数组。过滤器常见字段:

  • fromBlock / toBlock:起止块(hex,或 earliest / latest / pending / safe / finalized)。
  • address:可选,合约地址或地址列表——只收该合约发出的日志。
  • topics:可选,32 字节主题数组;顺序有意义,用来匹配事件签名与 indexed 参数。
  • blockHash:可选,限定单块;与 from/toBlock 互斥。

区间过大或结果过多时,公共节点常会报错或截断——开发时优先用短块窗口,再按需分页。

链上事件监听:eth_getLogs 与过滤器字段-程序旅途
图1:ethereum.org/zh …/json-rpc/#eth_getlogs:fromBlock/toBlock/address/topics/blockHash;简体中文,2026-10-14 实拍

二、官方:事件和日志是干什么的

同一站点「智能合约剖析」的事件和日志一节写明:事件让合约把信息留给前端或其他订阅方;交易被打包进块后,合约可触发事件并写入日志,链下再读。这和「读 storage / 调 view」不同——日志是历史里按块追加的记录,适合索引 Transfer、Swap 等。

链上事件监听:eth_getLogs 与过滤器字段-程序旅途
图2:ethereum.org/zh …/anatomy/#events-and-logs:事件用于与前端通信、写入日志;简体中文,2026-10-14 实拍

三、本机:对主网 USDT 跑 eth_getLogs

本场用公开 RPC https://ethereum.publicnode.com,合约为以太坊主网 USDT 0xdAC17F958D2ee523a2206206994597C13D831ec7。ERC-20 Transfer(address,address,uint256) 的 topic0 为:

0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef

过滤器示例(块高会变,以你终端为准;本场约在块 26189658 附近取最近 2 块):

curl -s -X POST https://ethereum.publicnode.com \
  -H 'Content-Type: application/json' \
  -d '{
    "jsonrpc":"2.0","id":1,"method":"eth_getLogs",
    "params":[{
      "address":"0xdAC17F958D2ee523a2206206994597C13D831ec7",
      "fromBlock":"0x18f9f58",
      "toBlock":"0x18f9f5a",
      "topics":["0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef"]
    }]
  }'

本场样例日志(金额会变):

  • transactionHash:0x01712fba0f418e05…14f1929e
  • blockNumber:26189658;logIndex:20
  • topics[1]/[2]:indexed from / to(左垫到 32 字节)
  • data:非 indexed 的 value;本场 raw ≈ 1487232907,USDT decimals=6 → 约 1487.232907 USDT
链上事件监听:eth_getLogs 与过滤器字段-程序旅途
图3:本机 curl + publicnode:topic0、短块窗口过滤器与样例 from/to/value;只读;2026-10-14

四、浏览器对照:同一笔的 Event Logs

把样例哈希打开 Etherscan 的 Logs 标签。同一笔交易里常有多条日志;本场可见 Log 20 地址为 USDT,事件名 Transfer(address from, address to, uint256 value),Topic0 与上面的签名一致。这和「回执里翻 Logs」是同一批数据——差别是 getLogs 可以按合约+主题批量筛区间,不必先知道哈希。

链上事件监听:eth_getLogs 与过滤器字段-程序旅途
图4:etherscan.io/tx/0x0171…#eventlog:WETH/USDT 等多条 Transfer;Log 20 为 USDT;界面英文,2026-10-14 实拍

五、核对清单:过滤器 vs 浏览器 Logs

  1. 过滤器 topics[0] 是否等于事件签名 keccak(Transfer 用上文常量)。
  2. address 是否就是你要对的合约(本场 USDT)。
  3. 样例哈希在浏览器 Logs 里能否找到同一条:topic0 / from / to / value 对齐。
  4. 块窗口是否过宽——公共 RPC 对过大结果常直接报错。

本场曾用 OKLink 打开同一哈希,索引未及时出现「暂无符合条件的数据」,故正文以 Etherscan Logs 与 RPC 对照为准;遇浏览器缺数时可换节点或稍后再查。

六、和站内其它文怎么分工

场景 更合适的文 本篇补充
已知哈希,读 Status/Gas/Logs 交易回执文 getLogs 不依赖先有哈希
在浏览器解码 Transfer/Approve ERC-20 字段文 用 topics 在 RPC 侧过滤
命令行读 name/balanceOf cast call 文 本篇是 eth_getLogs 过滤器
合约里怎么写 event Solidity mapping/事件文 本篇偏链下索引
短窗口
USDT 这类高频合约,几块就可能成百上千条;先 1~几块验证过滤器,再拉长。
topics 顺序
topics[0] 通常是事件签名;indexed 参数按声明顺序进 topics[1…];非 indexed 在 data。
只读即可
本场全程公开 RPC,不需要测试网 ETH;WebSocket 订阅见后续站内文。
  1. 在 ethereum.org 中文 JSON-RPC 页读完过滤器字段。
  2. 用 curl/脚本对公开 RPC 跑短窗口 eth_getLogs;脚本见本场 raw/run_getlogs.sh。
  3. 拿样例哈希到浏览器 Logs 对照 topic0 与 value。
  4. 需要钱包看测试网时可用欧易 Web3(创建步骤可填 CHENGXULVTU);买少量主网 Gas 可在 币安 或 欧易——本场不需要。

相关阅读

说明:配图为 2026-10-14 ethereum.org 中文 JSON-RPC / 智能合约剖析、本机真实 eth_getLogs 输出、Etherscan Event Logs(OKLink 本场索引未命中,未作步骤图)。块高、笔数、金额会变。本文不构成投资建议。