摘要:对照 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 互斥。
区间过大或结果过多时,公共节点常会报错或截断——开发时优先用短块窗口,再按需分页。

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

三、本机:对主网 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…14f1929eblockNumber:26189658;logIndex:20topics[1]/[2]:indexedfrom/to(左垫到 32 字节)data:非 indexed 的value;本场 raw ≈ 1487232907,USDT decimals=6 → 约 1487.232907 USDT

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

五、核对清单:过滤器 vs 浏览器 Logs
- 过滤器
topics[0]是否等于事件签名 keccak(Transfer 用上文常量)。 address是否就是你要对的合约(本场 USDT)。- 样例哈希在浏览器 Logs 里能否找到同一条:topic0 / from / to / value 对齐。
- 块窗口是否过宽——公共 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[0] 通常是事件签名;indexed 参数按声明顺序进 topics[1…];非 indexed 在 data。
本场全程公开 RPC,不需要测试网 ETH;WebSocket 订阅见后续站内文。
- 在 ethereum.org 中文 JSON-RPC 页读完过滤器字段。
- 用 curl/脚本对公开 RPC 跑短窗口 eth_getLogs;脚本见本场
raw/run_getlogs.sh。 - 拿样例哈希到浏览器 Logs 对照 topic0 与 value。
- 需要钱包看测试网时可用欧易 Web3(创建步骤可填 CHENGXULVTU);买少量主网 Gas 可在 币安 或 欧易——本场不需要。
相关阅读
- 以太坊交易回执怎么读:Status、Logs 与 Cumulative Gas
- ERC-20 标准字段:Transfer、Approve 在浏览器怎么读
- Foundry cast:读链上存储与发测试交易怎么跑
- Solidity mapping 与事件:怎么在浏览器核对
说明:配图为 2026-10-14 ethereum.org 中文 JSON-RPC / 智能合约剖析、本机真实 eth_getLogs 输出、Etherscan Event Logs(OKLink 本场索引未命中,未作步骤图)。块高、笔数、金额会变。本文不构成投资建议。
