如何使用Envio的HyperSync追踪原生ETH转账

  • enviodev
  • 发布于 2026-04-25 23:47
  • 阅读 70

本文介绍了如何使用HyperSync高效追踪链上原生ETH转账。

博文封面图片(含标题)

TL;DR

  • 在链上追踪原生 ETH 转账需要解析追踪(traces),而不是事件日志,这在标准 RPC 下非常慢。
  • HyperSync 直接暴露追踪过滤功能,让你能通过设置 call_type=call 并加上价值阈值来流式获取原生转账。
  • 完整示例使用 Bun 项目中的 Node.js 客户端,持续流式获取结果,直到收集到 10 笔超过 0.005 ETH 的转账为止。
  • 追踪功能当前支持 Ethereum、Base、Arbitrum、Gnosis 和 Monad。

在链上追踪原生代币转账比 ERC-20 转账更棘手。因为没有事件日志可供索引,所以你必须深入解析追踪。使用标准 RPC 节点时,这意味着要调用 eth_traceBlock 并遍历每个区块中的每条追踪,速度很慢。 HyperSync 为你提供了一种更快的替代方案:一个支持原生追踪过滤的数据检索层。

先决条件

本文我们将使用 Bun,请确保已安装。如果你想使用其他支持 TypeScript 的运行环境,也可以。

你还需要一个 Envio API Token 来访问 HyperSync。如果没有,请访问 envio.dev/app/api-tokens 创建一个。详细步骤请参考 docs.envio.dev/docs/HyperSync/api-tokens

HyperSync 与查询

HyperSync 专为数据检索而优化,而非共识,因此比 RPC 节点快得多。要获取数据,你发送一个描述所需内容的查询,HyperSync 只返回该数据。

典型的查询如下所示:

{
  "fromBlock": 0,
  "transactions": [\
    { "from": ["0x5a830d7a5149b2f1a2e72d15cd51b84379ee81e5"] },\
    { "to": ["0x5a830d7a5149b2f1a2e72d15cd51b84379ee81e5"] }\
  ],
  "fieldSelection": {
    "transaction": ["BlockNumber", "Hash", "From", "To", "Value"]
  }
}

每个查询包含三个主要部分:fromBlock、一个过滤部分(transactionsblockslogstraces 之一)以及 fieldSelection。完整选项请参阅 完整查询参考

过滤原生转账

原生 ETH 转账仅发生在 call_typecall 的追踪中——而不是 staticcalldelegatecall。直接过滤 callType 比过滤追踪的 kind 更高效,因为它能让 HyperSync 预先跳过无关的追踪类型。

构建获取器

设置

创建一个新的 Bun 项目并安装 HyperSync 客户端:

bun init -y && bun install @envio-dev/hypersync-client

将你的 API Token 添加到 .env 文件中。如果没有 Token,请在 envio.dev/app/api-tokens 生成。

ENVIO_API_TOKEN=你的Token

注意: HyperSync 的追踪功能当前支持 Ethereum、Base、Arbitrum、Gnosis 和 Monad。如果其他链需要追踪支持,请 联系我们

导入与辅助函数

import { HypersyncClient, type TraceField } from "@envio-dev/hypersync-client";

我们将使用最小阈值过滤掉小额转账,并将值格式化为人类可读的 ETH:

const THRESHOLD_WEI = BigInt("5000000000000000"); // 0.005 ETH
const WEI_PER_ETH = BigInt("1000000000000000000"); // 1 ETH
const DECIMALS = 6;

function weiToEth(wei: bigint): string {
  const whole = wei / WEI_PER_ETH;
  const remainder = wei % WEI_PER_ETH;
  const remainderStr = remainder.toString().padStart(18, "0").slice(0, DECIMALS);
  return `${whole}.${remainderStr}`;
}

创建客户端

使用 Ethereum 追踪端点:

const client = new HypersyncClient({
  url: "https://eth-traces.hypersync.xyz",
  apiToken: process.env.ENVIO_API_TOKEN!,
});

查询

只请求 call 类型的追踪,并选择我们关心的字段:

const query = {
  fromBlock: 22000000,
  traces: [\
    {\
      callType: ["call"],\
    },\
  ],
  fieldSelection: {
    trace: ["From", "To", "Value", "CallType", "BlockNumber"] as TraceField[],
  },
};

流式获取结果

HyperSync 提供两种获取模式:get(单次响应)和 stream(持续)。我们将进行流式获取,并在收集到 10 笔超过阈值的转账后停止:

console.log("正在获取原生转账(call_type=call, value > 0.005 ETH)...\n");

const results: { from: string; to: string; valueEth: string }[] = [];

const stream = await client.stream(query, {});

outer: while (true) {
  const res = await stream.recv();

  if (res === null) break; // 流已耗尽

  if (res.data?.traces) {
    for (const trace of res.data.traces) {
      if (trace.value === undefined || trace.value === null) continue;
      if (trace.value <= THRESHOLD_WEI) continue;

      results.push({
        from: trace.from ?? "未知",
        to: trace.to ?? "未知",
        valueEth: weiToEth(trace.value),
      });

      if (results.length >= 10) break outer;
    }
  }
}

await stream.close();

if (results.length === 0) {
  console.log("未找到结果。");
} else {
  console.table(
    results.map((r) => ({
      From: r.from,
      To: r.to,
      "Value (ETH)": r.valueEth,
    }))
  );
}

使用以下命令运行:

bun run index.ts

显示原生转账的输出表格

下一步

这里我们仅使用了 callType 作为过滤器。从这个起点出发,你可以通过向追踪选择中加入 from 或 to 地址过滤器来跟踪特定钱包,使用其他 TraceSelection 字段(如 sighash 或 kind)进一步缩小范围,或者将端点切换到另一个支持追踪的 HyperSync 网络,跨链运行相同的查询。

有关完整的 TraceSelection schema 和字段列表,请参阅 HyperSync 查询参考。

常见问题

什么是 HyperSync?

HyperSync 是 Envio 的高性能区块链数据检索层,作为传统 JSON-RPC 端点的替代方案而构建。它为开发者提供直接访问链上数据的能力,速度比标准 RPC 方法快 2000 倍,支持 Python、Rust、Node.js 和 Go 的客户端库,覆盖 86 多个 EVM 链。

为什么不能通过事件日志追踪原生 ETH 转账?

原生 ETH 转账不会发出事件。ERC-20 的 Transfer 事件是标准合约事件,但原生 ETH 的移动发生在协议层面,仅出现在交易追踪中。要追踪它们,你必须直接查询追踪。

过滤追踪时,call_typekind 有什么区别?

kind 是追踪类型(callcreatesuicidereward)。call_type 是调用追踪的子类型(calldelegatecallstaticcall)。原生 ETH 转账仅在 call_typecall 时发生,因此直接过滤 call_type 比先过滤 kind 再缩小范围更高效。

HyperSync 上哪些链支持追踪查询?

追踪功能当前支持 Ethereum、Base、Arbitrum、Gnosis 和 Monad。如果你需要其他链的追踪支持,请联系 nikhil@envio.dev

对于追踪查询,HyperSync 比 RPC 快多少?

对于数据检索工作负载,HyperSync 比标准 JSON-RPC 快 2000 倍。对于追踪查询,差距更大,因为 RPC 追踪方法(如 eth_traceBlock)是大多数节点上最慢的调用之一。

这种方法也可以用于 ERC-20 转账吗?

可以,但对于 ERC-20,你应该查询日志(logs)而非追踪,因为 ERC-20 合约会发出 Transfer 事件。使用 logs 过滤器,并将 Transfer 事件签名作为 topic0。详情请参阅 HyperSync 查询参考

使用 Envio 构建

Envio HyperIndex 是经独立基准测试的最快 EVM 区块链索引器。如果你正在链上构建并需要与链同步的索引,请查阅 文档,亲自运行基准测试,或联系我们讨论你的数据需求。 通过订阅我们的通讯、在 X 上关注我们或加入 Discord,获取更多更新。 订阅我们的通讯 💌

网站 | X | Discord | Telegram | GitHub | YouTube | Reddit

  • 原文链接: docs.envio.dev/blog/trac...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
enviodev
enviodev
江湖只有他的大名,没有他的介绍。