摘要
Solana 归档节点保留完整的账本历史,而不是修剪较旧的 slot,因此你可以查询标准节点已经丢弃的历史区块、交易和账户状态。大多数应用从不接触这些数据,但索引器、分析管道、税务和合规工具以及回填任务都依赖它。
本页解释了归档访问在实践中改变了什么,如何判断你的工作负载是否需要它,以及当你需要时如何通过 RPC API 或专用节点进行连接。它还涵盖了操作上的权衡、你将遇到的故障模式,以及在生产流量迁移之前如何评估提供商。
你真的需要归档访问吗?
在配置任何东西之前,先回答一个问题:你的工作负载是否读取比标准节点保留的数据更旧的数据?
常规的 Solana RPC 节点保留最近一段时间的账本数据,并修剪较旧的 slot,以保持在磁盘和内存预算之内。归档节点保留完整的账本历史,因此对旧区块、旧交易和历史账户状态的请求仍然可以解析。这种差异对大多数应用来说是不可见的,但对少数应用来说是决定性的。
使用这个快速测试:
| 你的工作负载 | 需要归档? | 原因 |
|---|---|---|
| 显示当前余额的钱包 | 否 | 只读取最新状态 |
| 报价实时价格的 DEX 前端 | 否 | 最新 slot 就足够了 |
| 覆盖所有历史的交易索引器 | 是 | 必须重放旧 slot |
| 税务、审计或合规导出 | 是 | 需要旧交易记录 |
| 随时间变化的分析/仪表板 | 通常是 | 历史聚合 |
| 索引器中断后的回填 | 是 | 重新读取遗漏的范围 |
| NFT 铸造历史查询 | 经常是 | 铸造可能发生在很久以前 |
如果你落在“否”列,标准 RPC 端点更便宜且更简单。如果你落在“是”或“通常是”,请继续阅读:本页的其余部分是关于如何连接到归档数据而不会为此支付过多费用。
Solana 上的“归档”意味着什么
Solana 不像某些 EVM 客户端那样暴露一个名为“归档模式”的单一标志。在实践中,归档访问意味着节点保留足够久远的账本历史,以便历史查询成功,而不是返回错误或空结果。
对你的集成来说,有两件事很重要:
- 保留深度。 节点可以向前提供数据多远。保留几天的节点不是归档;保留完整账本的节点才是。
- 查询范围。 哪些方法可以访问该历史。在 Solana 上,这主要是
getBlock、getTransaction、getSignaturesForAddress及相关方法,以及在支持的情况下对历史 slot 的账户状态查找。
当节点修剪了你请求的数据时,你通常会收到一个错误,例如区块不可用的响应,而不是静默的错误答案。该错误是你正在使用的端点对于该 slot 不具备归档能力的信号。
连接到归档数据
你有三种实际选择,它们主要在控制力、成本和你想运营的程度方面有所不同。
| 选项 | 控制力 | 运维负担 | 最适合 |
|---|---|---|---|
| 公共/共享 RPC API | 低 | 无 | 原型、轻量历史读取 |
| 托管归档 RPC(OnFinality RPC API) | 中 | 无 | 生产索引器和回填 |
| 专用归档节点(OnFinality 专用节点) | 高 | 低(托管) | 繁重、稳定的历史工作负载 |
OnFinality 通过其 RPC API 服务 提供 Solana RPC,并通过 专用节点 提供专用节点基础设施。对于共享端点,你可以从公共 Solana 端点开始,当你的历史读取量增长时,再迁移到专用归档节点。
公共 Solana 端点是:
https://solana.api.onfinality.io/public
wss://solana.api.onfinality.io/public-ws
有关链的详细信息,请参阅 Solana 网络页面,有关计划选项,请参阅 RPC 定价。公共端点适合测试,但它们是共享的,因此请将其视为起点,而不是生产归档后端。
历史数据的请求模式
Solana 的 JSON-RPC 与 EVM 链略有不同:大多数调用是带有 JSON 正文的 POST 请求,许多方法接受 slot 或 commitment 级别。一个最小的历史查询如下所示:
curl https://solana.api.onfinality.io/public \
-X POST \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"id": 1,
"method": "getBlock",
"params": [
250000000,
{
"encoding": "json",
"maxSupportedTransactionVersion": 0,
"transactionDetails": "signatures",
"rewards": false
}
]
}'
一些节省时间的实用说明:
- 设置
maxSupportedTransactionVersion。 如果不设置,包含版本化交易的区块可能会失败。除非你特别需要其他版本,否则传递0。 - 精简响应。 当你只需要概览时,
transactionDetails: "signatures"和rewards: false会大幅减少负载大小。 - 尽可能批量处理。 如果你的客户端支持 JSON-RPC 批处理,请将历史读取分组以减少往返次数。
- 预期缺口。 如果 slot 比节点的保留时间更旧,你会收到错误。请显式处理它,而不是永远重试。
对于账户历史和签名,getSignaturesForAddress 通常是入口点,然后你按签名获取单个交易。
生产就绪检查清单
归档工作负载以可预测的方式失败。在迁移流量之前,请运行以下检查:
- 确认保留深度。 询问端点可以向前提供数据多远,以及这是否与你最旧的所需 slot 匹配。
- 测试你最旧的查询。 选择接近你所需范围边缘的 slot,并验证它返回数据,而不是错误。
- 检查负载限制。 大型历史响应可能会触及响应大小或超时限制。使用真实的区块大小进行测试。
- 规划速率限制。 共享端点会限流。如果你的回填是突发性的,请为此调整规模或使用专用节点。
- 添加故障转移。 指向多个端点,并在重复错误时切换。
- 监控错误类别。 将“未找到/已修剪”错误与“速率限制”和“超时”错误分开;它们需要不同的修复方法。
- 演练回填。 在依赖它之前,端到端地运行一个小型历史重放。
如果你不能自信地回答第 1 项和第 2 项,那就是需要首先弥补的差距。
归档访问:构建还是购买
运行自己的 Solana 归档节点是可能的,但账本很大且不断增长,保持其健康是持续的工作:磁盘配置、快照处理、升级和监控。对于产品不是节点运营的团队来说,这通常是对工程时间的糟糕利用。
权衡如下:
| 因素 | 自托管归档节点 | 托管归档 RPC / 专用节点 |
|---|---|---|
| 前期设置 | 高 | 低 |
| 持续维护 | 你负责 | 提供商负责 |
| 成本形态 | 固定硬件 + 时间 | 基于使用量或计划 |
| 扩展历史读取 | 手动 | 取决于提供商 |
| 首次查询时间 | 天 | 分钟 |
对于大多数索引器和分析团队来说,托管归档端点或专用节点是更快的路径。当你对数据本地性有严格要求或已经在规模上运行节点基础设施时,自托管才有意义。
评估 Solana 归档提供商
当你比较提供商时,不要只比较标价。比较在你的实际工作负载下会发生什么。
| 检查内容 | 为什么重要 |
|---|---|
| 保留深度 | 决定你最旧的可查询 slot |
| 历史方法支持 | 确认 getBlock / getTransaction 在旧 slot 上工作 |
| 传输支持(HTTP、WebSocket) | 某些管道需要订阅 |
| 速率限制和突发行为 | 回填是突发性的 |
| 故障转移和冗余 | 保持长时间任务存活 |
| 可观测性 | 你需要看到错误类别 |
| 支持响应能力 | 归档问题会阻塞工作 |
OnFinality 在这里首先出现,因为它是本页围绕的选项:它通过托管的 RPC API 提供 Solana RPC,并为更繁重的工作负载提供专用节点。请根据上述标准将其与其他候选方案进行比较,而不是根据营销宣传。有关更广泛的框架,请参阅 如何选择 RPC 提供商。
常见故障模式及修复
| 症状 | 可能原因 | 修复 |
|---|---|---|
| 区块不可用错误 | 该节点上的 slot 已修剪 | 使用具备归档能力的端点 |
| 版本化交易错误 | 缺少 maxSupportedTransactionVersion | 传递 0 |
| 大区块超时 | 响应太大/太慢 | 精简响应、提高超时、批处理 |
| 回填期间突然出现 429 | 速率限制 | 放慢速度、批处理或使用专用节点 |
| 端点间结果不一致 | 不同的保留或 commitment | 标准化 commitment 和端点 |
| 回填中途停滞 | 单端点故障 | 添加故障转移和恢复检查点 |
大多数这些是配置或端点选择问题,而不是数据问题。在假设数据丢失之前,先修复端点和请求形状。
关键要点
- Solana 归档节点保留完整的账本历史;标准节点修剪较旧的 slot。
- 大多数应用不需要归档访问;索引器、分析、审计和回填通常需要。
- Solana 上的“归档”是关于保留深度以及哪些方法可以访问旧 slot,而不是一个单一标志。
- 在承诺使用端点之前,测试你最旧的所需 slot。
- 托管归档 RPC 或专用节点通常比自托管更快交付。
- 根据保留、方法支持、限制、故障转移和可观测性来评估提供商。
常见问题
Solana 归档节点和全节点一样吗? 不完全一样。全节点仍然可以修剪旧数据。归档节点保留足够久远的历史,以提供旧区块和交易,这才是你真正关心的属性。
如何知道我的端点是否具备归档能力? 查询接近你所需范围边缘的 slot。如果它返回数据,端点就能追溯到那么远。如果它返回区块不可用错误,则不能。
我可以使用公共 OnFinality Solana 端点进行归档查询吗? 你可以用它来测试。对于持续的历史读取或回填,请使用托管计划或专用节点,这样共享速率限制就不会中断长时间任务。
归档数据需要 WebSocket 吗? 通常不需要。归档访问主要是请求/响应。WebSocket 订阅更适用于实时 slot 和账户监控。
团队犯的最大错误是什么? 假设任何 RPC 端点都可以提供旧 slot。保留时间不同,因此在迁移之前进行测试。
后续步骤
首先针对候选端点测试你最旧的所需 slot。如果它能解析,你很可能可以使用共享的具备归档能力的 RPC 计划。如果你的回填很大或持续不断,请考虑使用专用节点,这样你的历史读取就不会与其他流量竞争。
查看 Solana 网络详情,比较 RPC 定价,如果你还需要其他链,请浏览 支持的 RPC 网络。当你准备好迁移生产流量时,根据上述检查清单进行简短评估将告诉你托管端点或专用归档节点是否合适。