在以太坊生态中,eth获取历史交易是开发者、数据分析师乃至普通持币者绕不开的需求,无论是为了做税务申报、审计追踪,还是为 DApp 做用户画像,都需要把链上数据“搬”下来,下面结合个人踩坑经验,分享三种主流方案,并给出避坑提示。
第一种:官方 JSON-RPC 的 eth_getTransactionByHash 与 eth_getBlockByNumber 组合,这是最原生的方式,优点是无需额外授权、完全去中心化;缺点是只能逐笔、逐块查询,想拉取某地址全部历史交易就得自己写递归脚本,耗时且容易触发节点限流,去年我帮朋友统计 2018-2023 年的钱包流水,跑了整整 6 小时才扫完 120 万个区块,中途还因为 Infura 的 QPS 限制被断开两次,解决方法是自建 OpenEthereum 节点,把 ws 连接池开到 200,再把请求做批量聚合,速度能提升 5-7 倍。
第二种:使用 Etherscan API,它对新手最友好,一条 HTTP GET 就能拿到某地址的全部交易列表,还能直接导出 CSV,但免费 Key 每分钟只能调用 5 次,高频场景下必须升级 Pro,Etherscan 返回的数据不包含内部交易(Internal Transactions),如果你的业务涉及 DeFi 合约交互,就必须再调一次 txlistinternal 接口,否则金额会对不上,我曾在做流动性挖矿收益统计时漏掉内部交易,导致账面少了 23% 的 gas 返还,被财务同事追着“讨债”。
第三种:GraphQL 子图(The Graph),把链上事件预先索引成子图后,前端用 GraphQL 查询,几毫秒就能返回分页结果,适合需要实时刷新的 DApp,但部署子图需要写 Schema 和 Mapping,门槛较高,上个月我把 Uniswap V3 的 Mint/Burn 事件做成子图,原本 30 秒的聚合查询被优化到 200ms,用户体验提升肉眼可见。
如果只是偶尔查几笔交易,Etherscan 最省事;想批量离线分析,建议自建节点加本地数据库;面向用户的实时产品,则优先考虑 The Graph,无论哪种方案,记得把区块高度、交易索引、日志索引三件套都存下来,后续重跑数据才能“断点续传”。