概述
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, base58number
设置要返回的最大交易版本。如果省略,则仅返回传统交易。设置为
0 可包含所有版本的交易。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);最终结果是交集。
示例
基于时间的分析
生成月度交易报告:代币铸造创建
查找特定代币铸造的创建交易:资金流动交易
查找谁为特定地址提供了资金:代币转移
按tokenTransfer 过滤以隔离特定代币移动。
到某个地址的 USDC 流入:
分页
当您有比限制更多的交易时,使用响应中的paginationToken 以获取下一页。令牌是简单的字符串格式 "slot:position",告诉 API 从哪里继续。
从每个响应中使用分页令牌以获取下一页:
多个地址
您无法在单个请求中查询多个地址。每个地址查询算作独立的 API 请求,并相应计费。要获取多个地址的交易,请在相同时间或插槽窗口内查询每个地址,然后合并并排序:最佳实践
性能。 当您不需要完整交易数据时使用transactionDetails: "signatures"。使用合理的页面大小以获得更好的响应时间,并按时间范围或特定插槽进行过滤以进行更有针对性的查询。
过滤。 从广泛的过滤器开始,然后逐步缩小。对于分析和报告工作流,使用基于时间的过滤器,并结合多个过滤器进行精确查询,目标是特定的交易类型或时间段。
分页。 当您需要稍后继续大量查询时存储分页令牌。监控分页深度进行性能规划,当需要按时间顺序回放历史事件时,使用升序。
错误处理。 以指数退避法优雅地处理速率限制。在发出请求之前验证地址,并在适当时缓存结果以减少 API 使用。
限制和边缘情况
一小部分地址路由到旧版存档,限于插槽扫描回退,或返回空值。在插槽 111,491,819 之前的代币账户发现也需要一种解决方法。展开以下部分以获取完整信息。不支持和特殊路由的地址
不支持和特殊路由的地址
路由到旧存档。 这些地址的请求被路由到我们的旧存档系统。
插槽扫描回退。 这些地址的请求被转发到我们的新存档系统,并可通过逐插槽扫描方法进行查询(最多 100 个插槽)。但这些数据未索引。
返回空值 (
is_reserved_address)。 请求被转发到我们的新存档系统,但数据未索引,查询返回为空。解决方法:历史代币账户发现(在插槽 111,491,819 之前)
解决方法:历史代币账户发现(在插槽 111,491,819 之前)
对于在插槽 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 历史数据方法。