getTransactionsForAddress 及高达 10 倍速的归档数据

  • Helius
  • 发布于 2天前
  • 阅读 59

Helius 发布了一个新的 Solana RPC 方法 getTransactionsForAddress (gTFA),它将 getSignaturesForAddressgetTransaction 合并为一个调用,并具有强大的新功能,包括反向搜索、时间、状态和基于插槽的过滤以及分页。

新功能:getTransactionsForAddress,归档数据速度提升高达 10 倍

getTransactionsForAddress (gTFA) 是一种新的 Solana RPC 方法,用于查询历史数据,它将 getSignaturesForAddressgetTransaction 合并为一个调用,并具有强大的新功能,包括反向搜索、时间、状态和基于插槽 (slot) 的过滤以及分页。

到目前为止,回填和查询 Solana 上的历史数据迫使开发人员使用缓慢且昂贵的方法,例如 getBlock,或者使用 getSignaturesForAddressgetTransaction 循环处理批量签名。

现在,开发人员可以使用单个调用以及强大的过滤和排序选项来查询多达 100 条包含完整交易详细信息的记录,或者多达 1,000 条仅包含签名的记录。

查询 Solana 历史数据的挑战

Solana 的账本 (ledger) 包含曾经在链上发送的每一笔交易。这些历史数据包括自创世以来发生的每一次铸造 (mint)、转移、交换和程序交互。

迄今为止,Solana 已经生成了 超过 3.75 亿个区块,并且从创世区块到现在完整的、未修剪的交易历史记录的大小为 数百 TB

快速可靠地访问此数据对于当今在 Solana 上构建的几乎每个团队都至关重要。Solana 的归档方法 为从你最喜欢的钱包的交易历史记录选项卡到你最喜欢的浏览器和投资组合仪表板的所有内容提供支持。

到目前为止,开发人员只有两种查询存档数据的选择,而且都很痛苦:

  1. getBlock
  2. getSignaturesForAddress 加上 getTransaction

使用 getBlock 太慢

首先,开发人员可以尝试查询 getBlock 来回填数据 虽然可行,但此方法不必要地耗时、昂贵且消耗资源:

  1. 调用 getBlocks 以查找你的插槽范围内的已确认区块
  2. 对每个区块调用 getBlock 以获取完整的交易详细信息、签名或帐户
  3. 解析区块中的所有相关数据并将其存储在你的数据库中
  4. 重复直到所有区块都完成

虽然 getBlock 方法适用于繁忙的程序(例如,索引像 USDC 这样的热门代币或像 Pump.fun 这样的 Solana 程序),但将它用于小型、特定的数据集是不切实际的。

循环 getSignaturesForAddress 和 getTransaction

使用 getSignaturesForAddress (gSFA) 以及 getTransaction 是另一种常见的回填数据的方法。

这种“N+1 循环”方法重复获取交易签名,通常一次获取 1,000 个,然后进行批量 RPC 调用以获取每笔交易的详细信息。

鉴于 RPC 请求的数量巨大,开发人员将需要实施指数退避和重试逻辑,以避免达到速率限制并丢失数据。

虽然使用 gSFA 和 getTransactiongetBlock 更灵活,但它在规模上仍然昂贵、复杂且容易出错。

getTransactionForAddress 的优势

新的 getTransactionsForAddress RPC 方法getSignaturesForAddressgetTransaction 合并为一个调用,并具有强大的功能,使构建索引和查询历史数据更容易、更快捷。

以下是主要功能:

1. 反向搜索

现有的归档 RPC 方法,例如 gSFA,要求开发人员从最新的交易开始并向后工作。

使用 getTransactionForAddress,开发人员现在可以在升序(即按时间顺序,最旧的优先)或降序(即最新的优先)排序顺序之间进行选择。

结合基于时间的过滤器,开发人员可以使用 getTransactionForAddress 查询 Solana 历史记录的任何部分,从任何时间点开始,以任何顺序进行查询。

例如,我们的新 Solana 区块浏览器 Orb,使用 getTransactionsForAddress RPC 方法来支持“显示最旧优先”过滤器:

Orb 使用 getTransactionsForAddress RPC 方法显示 hSOL 代币的最旧交易

如果你想使用 getSignaturesForAddressgetTransaction 查询相同的这个数据,你需要:

  1. 找到与第一笔交易对应的确切时间戳
  2. 找到与你的开始日期对应的交易签名
  3. 使用 before: lastSignature 从该签名向后循环
  4. 继续循环,直到返回的签名的 blockTime 达到结束日期
  5. 编写退避和重试逻辑,以避免达到速率限制并丢失数据

此过程不仅查询速度慢,而且设置起来令人沮丧且容易出错。

2. 高级过滤

使用新的 getTransactionsForAddress 方法,开发人员可以按时间范围(即 Unix 时间戳)、插槽和状态(例如,成功或失败)进行过滤。这些过滤器使你可以更精确、更精细地控制查询所需的确切数据。

例如,此基于时间的过滤器使用 Unix 时间戳来接收 2025 年 1 月 1 日凌晨 12:00(格林尼治标准时间)和 2025 年 10 月 1 日凌晨 12:00(格林尼治标准时间)之间发生的所有成功交易。

// 仅包含成功交易的时间范围
"filters": {
  "blockTime": {
    "gte": 1767225600,
    "lte": 1759363200
  },
  "status": "succeeded"
}

3. 基于游标的分页

当你需要查询比 gTFA 的默认限制(1,000 个签名或 100 条包含完整交易详细信息的记录)更多的交易时,你可以使用响应中的 paginationToken获取下一页paginationToken 是一个简单的字符串,格式为“slot:position”,它告诉 API 从哪里继续。

例如,此查询使用 paginationToken(游标)以 100 个批量扫描地址的历史记录。

// 第一次请求
let paginationToken = null;
let allTransactions = [];

const getNextPage = async (paginationToken = null) => {
  const params = [
    'ADDRESS',
    {
      transactionDetails: 'signatures',
      limit: 100,
      ...(paginationToken && { paginationToken })
    }
  ];

  const response = await fetch(rpcUrl, {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({
      jsonrpc: '2.0',
      id: 1,
      method: 'getTransactionsForAddress',
      params
    })
  });

const data = await response.json();
  return data.result;
};

// 分页浏览所有结果
do {
  const result = await getNextPage(paginationToken);
  allTransactions.push(...result.data);
  paginationToken = result.paginationToken;

  console.log(`Fetched ${result.data.length} transactions, total: ${allTransactions.length}`);
} while (paginationToken);

新的 Solana 归档系统

除了新的 getTransactionsForAddress 方法之外,我们还发布了一个从头开始重建的全新归档系统,以优化归档的路由器和存储路径。

新系统已为所有 Solana 归档 RPC 方法(例如,getTransactiongetBlockgetInflationReward)启用,并且适用于所有免费和付费计划的用户。

这意味着 每个计划上的每个归档方法现在都快 2-10 倍 —— 更低的延迟、更好的性能,并且无需更改代码。

内部仪表板显示 Helius 开发人员计划中 Solana 归档调用的 P99 延迟

开始使用

getTransactionsForAddress RPC 方法从今天开始在所有付费计划上公开提供,并且可以与你现有的 Helius RPC URL 一起使用。gTFA 方法每次调用花费 100 个积分,并且是你的 RPC 速率限制组的一部分。

要了解该方法如何工作并开始使用,请阅读 API 参考 并按照我们的 getTransactionsForAddress 快速入门指南 进行操作。

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

0 条评论

请先 登录 后评论
Helius
Helius
https://www.helius.dev/