You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Solana CLI或API查询指定地址的历史SPL代币持仓?

如何查询Solana地址在特定时间/区块的SPL代币持仓

核心结论

可以实现,但原生Solana CLI和常规RPC节点存在局限,需结合归档节点或第三方链上索引服务完成查询。


1. 原生工具的局限

  • Solana CLI的spl-token balance命令仅支持查询最新区块的代币余额,无指定历史区块的参数,因为CLI默认仅同步并读取链上最新状态。
  • 普通Solana JSON-RPC节点(非归档节点)仅保留最近链上状态,无法直接查询历史区块的账户持仓;常规RPC方法如getTokenAccountsByOwner默认返回最新数据,不支持指定历史区块(需连接归档节点才可实现)。

2. 可行实现方案

方案一:使用归档节点的RPC接口

归档节点保存了Solana链的全量历史状态,连接这类节点后,可通过RPC方法指定目标区块参数查询:

  • 调用getTokenAccountsByOwner时,添加block参数(传入目标区块的哈希或高度),即可获取该地址在对应区块的所有SPL代币账户及余额。
  • 示例RPC请求(curl):
    curl https://your-archive-node-url.com -X POST -H "Content-Type: application/json" -d '
    {
      "jsonrpc": "2.0",
      "id": 1,
      "method": "getTokenAccountsByOwner",
      "params": [
        "YOUR_WALLET_ADDRESS",
        {
          "programId": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"
        },
        {
          "block": "TARGET_BLOCK_HASH_OR_HEIGHT",
          "commitment": "finalized"
        }
      ]
    }'
    
    注:需自行部署归档节点,或使用提供归档节点服务的供应商(如QuickNode、Alchemy的Solana归档节点)。

方案二:借助第三方链上索引服务

第三方服务(如Solscan、SolanaFM、Metaplex Indexer)已预索引全量历史数据,提供更易用的API接口直接查询历史持仓:

  • 例如,通过Solscan的API可查询地址的代币余额历史,指定目标区块高度或时间范围即可获取对应时点的持仓数据。
  • 这类服务无需自行维护归档节点,接口设计更贴近业务需求,适合快速开发。

方案三:手动回溯交易计算余额

若需完全自主实现,可按以下步骤操作:

  1. 连接归档节点,获取目标地址的所有SPL代币转移交易历史(使用getSignaturesForAddress方法,指定截止到目标区块的范围)。
  2. 遍历所有交易,解析每笔代币转移的金额和方向(转入/转出)。
  3. 累加计算到目标区块时的最终余额。
    这种方式开发成本较高,适合需要高度定制化的场景。

与以太坊的差异

以太坊节点默认保存全量历史状态,因此可直接通过eth_getBalance等方法指定区块参数查询历史余额;而Solana的普通节点仅保留最近状态,历史状态依赖归档节点或第三方索引,这是两者架构设计上的核心区别。

内容的提问来源于stack exchange,提问作者granddemon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 09:55:22