You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过计算方式获取交易中访问过的所有合约地址?

批量检测交易中是否与指定合约交互的方案

核心思路:利用交易收据的内部调用日志批量处理

  • 直接通过节点RPC获取整个区块的所有交易收据,而非逐个查询单条交易,从根源避免API限制和低效率问题
  • 解析每个交易收据里的logs和internalTransactions(若节点支持),匹配目标合约地址

具体实现步骤

  1. 批量获取区块交易收据
    使用ethers的批量接口一次性拉取整区块的交易收据,示例代码:

    const provider = new ethers.providers.JsonRpcProvider("你的RPC节点地址");
    const targetBlock = 18000000; // 目标区块号
    const block = await provider.getBlockWithTransactions(targetBlock);
    const txHashes = block.transactions.map(tx => tx.hash);
    const receipts = await provider.getTransactionReceipts(txHashes);
    
  2. 解析收据匹配目标合约
    对每个收据,从三个维度检查是否与目标合约交互:

    • 直接调用检查:如果交易直接调用目标合约,receipt.to会等于目标合约地址
    • 日志匹配:遍历所有日志,检查address字段是否包含目标合约(合约触发事件时会生成对应日志)
    • 内部调用检查(需节点支持):若RPC节点提供内部调用数据,解析internalTransactions里的to/from字段,覆盖合约间的间接调用场景
  3. 效率优化技巧

    • 提前将目标合约地址统一转为小写,避免大小写不匹配的问题
    • 批量处理时始终用Promise.all并发请求,拒绝串行调用
    • 本地维护目标合约地址列表,匹配时直接本地比对,无需额外API请求

注意事项

  • 部分免费公共RPC节点可能不支持getTransactionReceipts批量接口,建议使用带批量支持的付费节点服务
  • 内部调用数据需要节点开启追踪功能,免费节点大多无法提供,此时仅能通过直接调用字段和日志判断

内容的提问来源于stack exchange,提问作者SearchyBary

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 03:52:06