Solana历史账本缺口怎么查? 图 1
Solana历史账本缺口怎么查? · 图 1

Solana历史查询返回空值或“Block not available”时,不能立刻断定链上从未有过这笔数据。公共RPC节点可能为了控制磁盘成本清理旧账本,某个slot也可能根本没有产生区块。minimumLedgerSlot和getFirstAvailableBlock是排查的两个坐标,但它们表示的边界不同。

先画出两条边界线

minimumLedgerSlot返回该节点本地账本中仍保留的最低slot,节点清理旧数据时数值可上升。 minimumLedgerSlot回答的是本节点底层账本仍保留的最低slot。它可随清理过程向前移动,所以监控系统不能把它当作一个永久常量。

getFirstAvailableBlock返回节点可查的最早已确认区块slot,它与最低本地账本slot不必相等。 getFirstAvailableBlock则回答该节点当前可返回的最早已确认区块slot。两个数值之间可能存在差距:账本保留边界是存储层口径,最早区块是RPC可查资源口径。

时间向右 →
[已裁剪历史] | minimumLedgerSlot | [仍有本地账本]
                       | getFirstAvailableBlock | [可返回区块]

某个slot不在返回里,还有第三种可能

Solana的slot可被跳过,因此在查询区间时需要把“裁剪”与“该slot未产生区块”分开处理。 Solana的Leader在某个slot没有成功产出可确认区块时,这个slot可被跳过。因此,在两条边界之后查不到单个slot,不必是节点丢了数据。应先用getBlocks查一个小区间,看该slot是否出现在已确认区块列表中。

现象主要检查下一步
目标slot小于minimumLedgerSlot本地已裁剪转归档RPC或自建存储
介于两边界之间RPC可查范围查节点实现、索引和服务级别
高于最早区块但单点缺失是否跳过slot查getBlocks区间
区间大量缺失限流、同步或供应商故障用第二端点对照

三步排查要固定commitment和端点

第一步,在同一RPC端点记录minimumLedgerSlot与getFirstAvailableBlock;第二步,用与业务一致的commitment查目标区间;第三步,只有在确认目标早于保留边界时才转归档节点。如果在不同供应商之间往返切换,所有对比都应带上端点、拉取时间和commitment。

重试不应无限执行。输入裁剪区间后,同一节点永远重试不会让历史回来,只会浪费配额并掩盖数据缺口。索引器应将任务标成“需要归档源”,而不是“暂时失败”。

监控看的不只是当前边界

每次采样两个边界的值,计算它们向前移动的速度,再与索引器处理到的最高slot比较。索引器若落后太多,可能被保留边界追上,形成无法通过同一节点补齐的永久缺口。这时需要提前切换归档源,不要等错误发生后才发现SLA没有约定历史保留。

每次告警还应保存节点版本、端点标识和采样时间,便于确认边界变化来自正常裁剪还是服务异常。

归档能力要写入服务目标

不只写“支持Solana历史查询”,而是写清最早保留高度、可恢复时间、归档端点和缺口补拉方法。

本文的三个可复核核心是:

  1. minimumLedgerSlot返回该节点本地账本中仍保留的最低slot,节点清理旧数据时数值可上升。
  2. getFirstAvailableBlock返回节点可查的最早已确认区块slot,它与最低本地账本slot不必相等。
  3. Solana的slot可被跳过,因此在查询区间时需要把“裁剪”与“该slot未产生区块”分开处理。

目前仍需保留的边界:商业RPC服务的归档保留天数和附加索引不由Solana标准RPC保证,需与供应商合同核对。

可结合Solana getBlocks不连续Solana地址历史翻页getLatestBlockhash过期判断继续查看相邻知识。本文为信息与技术教育内容,不构成投资、交易或法律建议;涉及资产或系统变更时,请先在隔离环境验证并自行承担风险。