golang如何监听以太坊事件日志_golang以太坊事件日志监听技巧

张开发
2026/4/16 14:24:07 15 分钟阅读

分享文章

golang如何监听以太坊事件日志_golang以太坊事件日志监听技巧
用 eth_subscribe 实时监听合约事件需连接 WebSocket 节点手动处理重连、校验地址格式、正确计算 topics 哈希、避免指定区块范围并并发安全读取日志通道。用 eth_subscribe 实时监听合约事件得先连上 WebSocket 节点Go 监听以太坊事件最直接的方式就是走 WebSocket eth_subscribe但它不是“连上就自动收”而是需要一个持续活跃的连接和手动错误恢复。HTTP RPC比如 eth_getLogs是轮询而 eth_subscribe 是推送——快但脆弱。必须用支持 WebSocket 的客户端比如 ethclient.Dial(wss://...)http:// 或 https:// 地址会直接 panic节点必须开启 ws 支持Geth 启动加 --wsInfura/Alchemy 的免费 tier 通常默认开订阅后若网络抖动或节点重启SubscribeFilterLogs 不会自动重连你得自己监听 watcher.Errors 并重建订阅别在 defer client.Close() 后再启动监听循环——连接关了channel 就永远阻塞了SubscribeFilterLogs 的查询参数容易配错传给 SubscribeFilterLogs 的 ethereum.FilterQuery 看似简单但三个字段错一个就收不到日志地址、topics、区块范围不能混用。Addresses: []common.Address{contractAddress} —— 必须是小写校验和格式大写地址如 MetaMask 复制的会导致匹配失败Topics 第一项是事件签名的 keccak256 哈希比如 Transfer(address,address,uint256) 得算成 keccak256(Transfer(address,address,uint256))不是字符串字面量如果填了 FromBlock 或 ToBlockWebSocket 订阅会静默失败它只接受空范围想扫历史得换 eth_getLogs监听多个事件别把不同签名的 topic 混在一个 Topics[0] 里——那是“AND”关系不是“OR”。要 OR得开多个订阅或改用 Graph从 channel 读日志时别卡死在 select 里不处理 error很多人写完 client.SubscribeFilterLogs(ctx, query, ch) 就进 for { select { case log : 结果一断网程序就挂住不动——因为错误没被消费codewatcher.Errors channel 堵满后整个订阅会卡住。 RedClaw 百度推出的手机端万能AI Agent助手

更多文章