Skip to main content

概述

getTransactionsForAddress 是一个 Helius 独有的 RPC 方法,返回地址的交易历史,具有高级过滤、灵活排序和高效分页功能。它不是标准 Solana RPC 的一部分。 与 getSignaturesForAddress 不同,它仅返回签名并跳过关联的代币账户,getTransactionsForAddress 可以在一次调用中返回完整的交易数据,包括钱包的关联代币账户 (ATA) 活动。这使得它成为回填、索引和分析的最快路径。 此方法每次调用最多返回1000个完整交易。

灵活排序

按时间顺序排序(最旧的在前)或反序(最新的在前)。

高级过滤

按时间范围、槽位、签名、状态和代币转移进行过滤。

完整交易数据

在一次调用中获取完整的交易详情,无需后续 getTransaction。

代币账户

包括地址的关联代币账户的交易。

使用场景

在需要以下情况时使用 getTransactionsForAddress:
  • 完整的钱包代币历史,包括关联的代币账户
  • 用于索引器或数据管道的快速单次调用回填
  • 基于时间或槽位的交易分析和报告
  • 状态过滤仅保留成功或失败的交易
  • 按时间顺序的历史重演(最旧的排序)
  • 代币发布分析:首次铸造交易和早期持有者
  • 钱包资金历史和对方发现
  • 特定时间段的合规性和审计报告
对于解析的、仅转账历史(付款、余额调整),请改用 getTransfersByAddress。

网络支持

快速开始

1

获取你的API密钥

从Helius仪表板获取你的API密钥。
2

使用高级功能查询

获取在两个日期之间的钱包的所有成功交易,按时间顺序排序:
3

了解参数

这个例子展示了关键功能:
  • transactionDetails: 设置为'full'以在一次调用中获取完整交易数据
  • sortOrder: 使用'asc'按时间顺序(最早的优先)或'desc'按最新顺序
  • filters.blockTime: 使用gte(大于或等于)和lte(小于或等于)设置时间范围
  • filters.status: 仅过滤为'succeeded'或'failed'的交易
  • filters.tokenAccounts: 包括相关token账户的转账、铸造和销毁

请求参数

string
必填
要查询交易历史记录的账户的Base-58编码公钥
string
默认值:"signatures"
返回的交易详细级别:
  • signatures: 基本签名信息(更快)
  • full: 完整交易数据(消除对getTransaction调用的需要,支持最大限制为1000)
string
默认值:"desc"
结果的排序顺序:
  • desc: 最新优先(默认)
  • asc: 最早优先(按时间顺序,非常适合历史分析)
number
默认值:"1000"
返回的最大交易数:
  • 当transactionDetails: "signatures"时最多到1000
  • 当transactionDetails: "full"时最多到1000
string
上一次响应的分页token(格式:"slot:position")
string
默认值:"finalized"
承诺级别:finalized或confirmed。不支持processed承诺。
object
用于缩小结果的高级过滤选项。
object
使用比较运算符过滤slot编号:gte, gt, lte, lt示例:{ "slot": { "gte": 1000, "lte": 2000 } }
object
使用比较运算符按Unix时间戳过滤:gte, gt, lte, lt, eq示例:{ "blockTime": { "gte": 1640995200, "lte": 1641081600 } }
object
使用比较运算符按交易签名过滤:gte, gt, lte, lt示例:{ "signature": { "lt": "SIGNATURE_STRING" } }
string
按交易成功/失败状态过滤:
  • succeeded:仅成功交易
  • failed:仅失败交易
  • any:成功和失败(默认)
示例:{ "status": "succeeded" }
string
默认值:"none"
对相关代币账户的交易进行过滤:
  • none: 仅返回引用提供地址的交易(默认)
  • balanceChanged: 返回引用提供地址或修改由提供地址持有的代币账户余额的交易(推荐)
  • all: 返回引用提供地址或任何由提供地址持有的代币账户的交易
示例: { "tokenAccounts": "balanceChanged" }
object
过滤符合对应方、方向、铸造或原始金额范围的代币转账参与地址的交易。所有字段都是可选的,并以AND语义组合。示例: { "tokenTransfer": { "direction": "in", "mint": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v" } }
string
对方地址。匹配另一方为此地址的转账。
string
默认值:"any"
根据相对于查询地址的转账方向进行过滤:
  • in: 查询地址接收的转账
  • out: 查询地址发送的转账
  • any: 入站和出站的转账
string
用于过滤的代币铸造。
object
使用区块链上的原始金额进行比较,而不是UI或调整后的小数金额。支持 gt, gte, lt, 和 lte。
string
用于交易数据的编码格式(仅在 transactionDetails: "full" 时适用)。与 getTransaction API 相同。选项:json, jsonParsed, base64, base58
number
设置返回的最大交易版本。如果省略,仅返回传统交易。设置为 1 以包含传统、v0 和 v1 交易。
number
请求可以评估的最小槽位

计量

成功的响应将根据返回内容进行计量:

响应

响应结构取决于transactionDetails。签名模式返回轻量级签名记录;完整模式返回完整的交易和元数据对象。

响应字段

transactionIndex字段仅适用于getTransactionsForAddress。其他类似端点如getSignaturesForAddress,getTransaction和getTransactions不包含此字段。 在全面模式下,meta 是完整的交易元数据对象——与 getTransaction 返回的形状相同。它包括 preTokenBalances 和 postTokenBalances,因此您可以直接从响应中计算代币余额变化(例如,检测交换),而无需后续调用。

过滤器

您可以对 slot,blockTime 和 signature 使用比较运算符,以及特殊的 status,tokenAccounts 和 tokenTransfer 过滤器。结合多个过滤器可将结果缩小到它们的交集。

比较运算符

这些运算符的工作原理类似于数据库查询,可让您精确控制数据范围。

枚举过滤器

组合过滤器示例:

关联代币账户

在 Solana 上,钱包并不直接持有代币。相反,钱包拥有代币账户,这些代币账户持有代币。当有人发送 USDC 给你,它会进入你的 USDC 代币账户,而不是你的主钱包地址。 这种方法是独特的,因为它可以查询完整的代币历史记录,包括钱包的关联代币账户 (ATAs)。像 getSignaturesForAddress 这样的原生 RPC 方法不包括 ATAs。 tokenAccounts 过滤器控制此行为:
  • none(默认):仅返回直接引用钱包地址的交易。当你只关心直接的钱包交互时使用此选项。
  • balanceChanged(推荐):返回引用钱包地址或修改钱包拥有的代币账户余额的交易。这会过滤掉垃圾邮件和不相关的操作,如费用收取或委托,为您提供有意义的钱包活动的清晰视图。
  • all:返回引用钱包地址或钱包拥有的任何代币账户的所有交易。
tokenAccounts 过滤器不支持 2022 年 12 月之前的交易。它依赖于在 Solana 的插槽 111,491,819 引入的代币转移元数据。要涵盖更早的活动,请参阅历史代币账户解决方法。

代币转移过滤器

tokenTransfer 过滤器将结果缩小到查询地址参与特定标准匹配的代币转移的交易:特定对手方、铸造方向或金额范围。 用它来回答以下问题:
  • 这个钱包何时从特定对手方接收到 USDC?
  • 显示所有超过 1000 代币的出站转移。
  • 这个钱包何时与这个特定铸造发生过联系?
该过滤器是请求配置中 filters 对象内的可选字段:
tokenTransfer 内的所有字段都是可选的。结合多个字段被视为 AND。 金额范围运算符: 你可以结合金额运算符,如 { "gte": 1000000, "lte": 5000000 } 用于封闭范围。tokenTransfer 与其他顶级过滤器组合(slot,blockTime,status 和 tokenAccounts);最终结果是交集。

示例

基于时间的分析

生成月度交易报告:
处理分析:

代币铸造创建

查找特定代币铸造的创建交易:
对于流动性池创建,查询池地址:
这可以找到代币铸造或流动性池创建的确切时刻,包括创建者地址和初始参数。

资金流动交易

查找谁为特定地址提供了资金:
然后分析交易数据以查找 SOL 转账:
前几笔交易通常会揭示资金来源,并有助于识别相关地址或资金模式。

代币转移

按 tokenTransfer 过滤以隔离特定代币移动。 到某个地址的 USDC 流入:
到特定对手方的大额转出:
结合插槽范围和状态:

分页

当您有比限制更多的交易时,使用响应中的 paginationToken 以获取下一页。令牌是简单的字符串格式 "slot:position",告诉 API 从哪里继续。 从每个响应中使用分页令牌以获取下一页:

多个地址

您无法在单个请求中查询多个地址。每个地址查询算作独立的 API 请求,并相应计费。要获取多个地址的交易,请在相同时间或插槽窗口内查询每个地址,然后合并并排序:
对于较大的历史扫描,请按时间或插槽窗口迭代(例如,每次 1000 个插槽)并重复此模式。

最佳实践

性能。 当您不需要完整交易数据时使用 transactionDetails: "signatures"。使用合理的页面大小以获得更好的响应时间,并按时间范围或特定插槽进行过滤以进行更有针对性的查询。 过滤。 从广泛的过滤器开始,然后逐步缩小。对于分析和报告工作流,使用基于时间的过滤器,并结合多个过滤器进行精确查询,目标是特定的交易类型或时间段。 分页。 当您需要稍后继续大量查询时存储分页令牌。监控分页深度进行性能规划,当需要按时间顺序回放历史事件时,使用升序。 错误处理。 以指数退避法优雅地处理速率限制。在发出请求之前验证地址,并在适当时缓存结果以减少 API 使用。

限制和边缘情况

一小部分地址路由到旧版存档,限于插槽扫描回退,或返回空值。在插槽 111,491,819 之前的代币账户发现也需要一种解决方法。展开以下部分以获取完整信息。
路由到旧存档。 这些地址的请求被路由到我们的旧存档系统。插槽扫描回退。 这些地址的请求被转发到我们的新存档系统,并可通过逐插槽扫描方法进行查询(最多 100 个插槽)。但这些数据未索引。返回空值 (is_reserved_address)。 请求被转发到我们的新存档系统,但数据未索引,查询返回为空。
对于在插槽 111,491,819 之前有代币账户活动的地址,tokenAccounts 过滤器无法确定所有权,因为代币余额元数据中的 owner 字段当时还不存在。要获得完整结果,您可以通过解析早期交易指令手动发现这些代币账户,然后对每个账户并行查询 getTransactionsForAddress。

这与 getSignaturesForAddress 有何不同?

如果你熟悉标准的getSignaturesForAddress方法,getTransactionsForAddress将多步工作流压缩为单个调用,并添加了过滤、排序和令牌账户支持。有关现有代码的逐步转换,请参见迁移指南。

在一个调用中获取完整交易

使用 getSignaturesForAddress,您需要两个步骤:
使用 getTransactionsForAddress,只需一次调用:

在一次调用中获取代币历史

使用 getSignaturesForAddress,您需要首先调用 getTokenAccountsByOwner,然后查询每个代币账户:
使用 getTransactionsForAddress 您只需设置 filters.tokenAccounts:

额外功能

按时间排序

通过 sortOrder: 'asc' 从最旧排序到最新。

基于时间的过滤

使用 blockTime 过滤器按时间范围进行过滤。

状态过滤

使用 status 过滤器仅获取成功或失败的交易。

更简单的分页

使用 paginationToken,而不是复杂的 before/until 签名。

下一步

索引指南

使用 getTransactionsForAddress 回填并同步 Solana 索引。

getTransfersByAddress

用于支付和对账的解析,仅限转账历史。

API 参考

getTransactionsForAddress 的完整请求和响应模式。

历史数据概述

比较所有 Solana 历史数据方法。