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历史查询”,而是写清最早保留高度、可恢复时间、归档端点和缺口补拉方法。
本文的三个可复核核心是:
- minimumLedgerSlot返回该节点本地账本中仍保留的最低slot,节点清理旧数据时数值可上升。
- getFirstAvailableBlock返回节点可查的最早已确认区块slot,它与最低本地账本slot不必相等。
- Solana的slot可被跳过,因此在查询区间时需要把“裁剪”与“该slot未产生区块”分开处理。
目前仍需保留的边界:商业RPC服务的归档保留天数和附加索引不由Solana标准RPC保证,需与供应商合同核对。
可结合Solana getBlocks不连续、Solana地址历史翻页、getLatestBlockhash过期判断继续查看相邻知识。本文为信息与技术教育内容,不构成投资、交易或法律建议;涉及资产或系统变更时,请先在隔离环境验证并自行承担风险。
发表评论
还没有评论,来说两句吧。
评论区为展示样式,提交不会被处理。