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"
承诺级别:finalizedconfirmed。不支持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
设置要返回的最大交易版本。如果省略,则仅返回传统交易。设置为 0 可包含所有版本的交易。
number
请求可以评估的最小槽位

计量

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

响应

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

响应字段

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

过滤器

您可以对 slotblockTimesignature 使用比较运算符,以及特殊的 statustokenAccountstokenTransfer 过滤器。结合多个过滤器可将结果缩小到它们的交集。

比较运算符

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

枚举过滤器

组合过滤器示例:

关联代币账户

在 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 与其他顶级过滤器组合(slotblockTimestatustokenAccounts);最终结果是交集。

示例

基于时间的分析

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

代币铸造创建

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

资金流动交易

查找谁为特定地址提供了资金:
然后分析交易数据以查找 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 历史数据方法。