摘要
Solana 为 mainnet、devnet 和 testnet 提供公共 JSON-RPC API。这些端点是免费的,适合原型、演示和开发,但它们是共享基础设施,具有速率限制,且没有生产环境保证。本参考说明了这些端点、如何调用它们、常见错误模式,以及迁移到托管或专用 Solana RPC 服务的标准。
Solana 为其每个集群提供公共 JSON-RPC API:mainnet、devnet 和 testnet。这些端点可免费使用,非常适合开发、演示和小型实验,但它们属于共享基础设施,具有速率限制,并且不提供生产级可靠性承诺。本参考说明了 Solana 公共 API 端点、如何调用它们、常见故障模式,以及迁移到托管或专用 Solana RPC 服务的标准。
Solana 公共 API 决策清单
- 确定你的集群。 公共端点是特定于集群的:mainnet、devnet 或 testnet。
- 评估你的流量。 如果你预期有持续请求量,公共端点可能会返回 429 或 403 响应。
- 检查速率限制。 Solana 文档列出了公共端点限制,但这些限制随时可能更改。
- 确认所需的方法。 大多数 JSON-RPC 方法都可用,但某些专用或归档方法可能会受到限制。
- 评估 WebSocket 需求。 公共 WebSocket 端点存在,但它们也是共享的,在高负载下可能会丢弃订阅。
- 为错误做好设计。 针对公共端点响应实施退避、重试和缓存。
- 为生产环境做规划。 在 mainnet 启动之前,审查私有 RPC 或专用节点选项,以避免与其他团队共享容量。
什么是 Solana 公共 API?
Solana 公共 API 是 Solana Labs 为每个集群运行的 JSON-RPC 和 WebSocket 端点集合。任何应用程序都可以向这些端点发送 HTTP 请求,以读取账户数据、查询区块、模拟交易或提交已签名的交易。WebSocket 端点允许你订阅账户、签名、程序和 slot 的变化。
公共端点是一个方便的入口,因为它们不需要 API 密钥,也不需要设置。然而,它们是完全共享的。这意味着来自一个 dApp 的流量激增可能会降低同一端点上所有其他使用者的体验。因此,Solana 文档明确将公共端点描述为适用于开发、早期演示和小型私有测试计划,但不适用于生产应用。
对“solana public api”的查询通常来自两个方向:需要精确端点 URL 和配置值的开发者,以及决定公共端点是否足以满足其工作负载的团队。本文涵盖这两个方面。
Solana 集群和公共 API 端点
Solana 运行多个集群,每个集群都有自己的账本、代币和验证器集合。每个 RPC 请求都发送到特定集群,因此你选择的端点决定了你读取哪个网络状态以及交易发送到哪里。
| 集群 | 用途 | 公共 RPC 端点 |
|---|---|---|
| Mainnet | 使用真实 SOL 的实时生产网络 | https://api.mainnet.solana.com |
| Devnet | 公共开发者测试网络 | https://api.devnet.solana.com |
| Testnet | 网络升级和验证器测试 | https://api.testnet.solana.com |
对于本地开发,solana-test-validator 二进制文件会在你的机器上运行一个验证器,并在 http://localhost:8899 提供本地 HTTP RPC 端点,在 ws://localhost:8900 提供 WebSocket 端点。
公共端点并不是唯一的选择。许多 RPC 提供商(包括 OnFinality)提供具有可预测限制的托管 Solana API 端点,以及为需要隔离容量的团队提供 专用 Solana 节点。托管端点可以支持与公共 API 相同的 JSON-RPC 接口,同时增加私有基础设施和运营支持。
如何调用 Solana 公共 API
公共 API 遵循标准 JSON-RPC 2.0 规范。你发送一个 HTTP POST 请求,其中包含 jsonrpc、id、method 和可选的 params 数组。响应包含 jsonrpc、id 和 result 或 error 对象。
以下 curl 示例使用 finalized 提交级别调用 mainnet 上的 getSlot 方法。提交级别控制节点在返回数据之前区块必须达到的最终性程度;它是 Solana RPC 调用中最重要的参数之一。
curl https://api.mainnet.solana.com -H "Content-Type: application/json" -d '{
"jsonrpc": "2.0",
"id": 1,
"method": "getSlot",
"params": [
{
"commitment": "finalized"
}
]
}'
成功的响应如下所示:
{
"jsonrpc": "2.0",
"result": 312345678,
"id": 1
}
对于 WebSocket 订阅,请连接到集群的 WebSocket URL 并发送订阅请求,例如 accountSubscribe 或 slotSubscribe。公共 WebSocket 端点也可以免费使用,但它们可能会断开空闲客户端或应用自己的速率限制。
速率限制和常见公共端点错误
公共 Solana API 端点受到速率限制,以保护共享基础设施。确切限制在 Solana 集群参考中有所记录,但可能随时更改,恕不另行通知。两个 HTTP 状态码经常出现:
- 429 Too Many Requests:你已超出该端点的速率限制。
- 403 Forbidden:请求被阻止,通常是由 Web 应用防火墙因可疑流量模式或滥用而阻止。
这些错误不是你的代码中的 bug;它们是公共 API 在告诉你其共享容量已经耗尽。如果你的应用程序没有处理这些错误,你会看到难以复现的间歇性故障。
要规避公共 API 上的速率限制,你可以降低请求频率,缓存 getProgramAccounts 和 getSignaturesForAddress 等昂贵调用,并尽可能使用批量请求。然而,这些技术只会减少负载;它们并不能消除与其他所有人共享容量的根本问题。
何时迁移到公共 API 之外的方案
Solana mainnet 上的生产 dApp 不应依赖公共 API,原因如下:
- 没有容量保证:你的请求会与所有其他用户竞争。
- 速率限制变化:当限制被调整时,你可能会发现应用程序出现问题。
- 有限的归档深度:公共 API 不是归档节点,因此可能无法访问所有 slot 的历史数据。
- 没有专用的 WebSocket 容量:实时数据流在高负载下可能会被丢弃。
- 没有支持合同:如果端点不可用,你没有任何人可以联系。
此时,团队通常会评估托管 RPC 服务或专用节点。托管服务为你提供具有明确请求限制的私有端点,而专用节点为你提供隔离的计算和带宽。这两种方法都消除了“吵闹的邻居”问题,并为生产流量提供更稳定的基础。
OnFinality 是同时提供这两种选项的提供商之一。你可以通过该服务请求 公共 Solana 端点,在 托管 RPC API 上访问更高层级的容量,或者配置 专用 Solana 节点 以获得完全隔离。有关受支持链的完整列表,请参阅 受支持的 RPC 网络 页面。
如何评估 Solana 公共 API 替代方案
在比较 Solana API 提供商时,评估范围不仅仅是单个延迟数字。正确的选择取决于你的流量模式、数据需求和预算。下表总结了大多数 Solana 团队关心的标准。
| 标准 | 要检查什么 | 为什么重要 |
|---|---|---|
| 端点类型 | 是共享托管端点还是专用节点? | 共享端点更便宜,但仍受“吵闹的邻居”影响;专用节点提供隔离资源。 |
| 请求限制 | 持续每秒请求数或每月请求配额是多少? | 公共 API 限制不透明且不断变化;生产应用需要可预测的配额。 |
| 归档数据 | 提供商是否提供历史 slot 和账户访问? | 分析、索引和回填需要归档范围,而不仅仅是最近状态。 |
| WebSocket 支持 | WebSocket 端点是否由相同的 SLA 和容量覆盖? | 实时订阅对实时 dApp 和交易工具至关重要。 |
| 集群覆盖 | 是否提供 mainnet、devnet 和 testnet? | 你希望同一提供商处理开发和生产集群。 |
| 方法支持 | 是否所有 JSON-RPC 方法都可用,包括较新的方法? | 一些提供商会过滤如 getProgramAccounts 等昂贵方法。 |
| 故障转移 | 如果单个节点或区域发生故障会怎样? | 托管服务应绕过不健康的节点进行路由,而无需你更改 URL。 |
| 成本模型 | 定价是按请求、按月还是按专用实例? | 将计费模式与你的流量变化和预算相匹配。 |
如果你已经在使用公共 API,只需要少量额外余量,共享托管 RPC 端点通常是下一步最简单的选择。如果你需要保证响应延迟或运行大量索引,专用节点可能更合适。你可以在 RPC 定价 页面上查看这两种方案。
Solana RPC 客户端的生产环境提示
即使使用私有 RPC 端点,构建客户端的方式也会对性能和成本产生很大影响。
- 使用正确的提交级别。
processed是最新的,但可能发生重组;confirmed更安全;finalized最慢但最规范。如果你的应用能容忍轻微重组,不要每次都默认使用finalized。 - 缓存昂贵的调用。
getProgramAccounts和getSignaturesForAddress对 Solana 节点来说成本很高。尽可能使用缓存提供这些数据。 - 批量处理独立请求。 许多 JSON-RPC 调用可以合并到一个 HTTP 请求中,从而减少往返次数和速率限制消耗。
- 优先使用 WebSocket 订阅而不是轮询。 订阅减少了请求-响应调用的次数,并保持状态最新。
- 妥善处理重试。 对 429 或 503 等瞬时错误使用指数退避,但避免放大负载的重试风暴。
- 监控响应时间。 跟踪你的 RPC 延迟和错误率,以便在提供商或特定区域性能下降时及时发现。
这些优化在公共 API 上更为重要,因为每一次浪费的调用都会与生态系统中的其他调用竞争。
关键要点
- Solana 公共 API 是面向 mainnet、devnet 和 testnet 的免费 JSON-RPC 和 WebSocket 端点。
- 公共端点可用于开发、演示和早期测试,但它们是共享的且有限速。
- 常见的公共 API 错误是 HTTP 429(速率受限)和 HTTP 403(流量被阻止),两者都需要在客户端处理。
- 生产工作负载应评估托管 RPC 或专用节点,以获得可预测的容量、归档访问和运营支持。
- 选择提供商时,请比较端点类型、请求限制、WebSocket 覆盖、集群支持、方法可用性和成本模型。
常见问题
Solana 公共 API 是免费的吗?
是的,Solana Labs 公共 RPC 端点可以免费使用。它们是共享基础设施,因此具有速率限制,且不提供生产可用性保证。
Solana 公共 API 和私有 RPC 端点之间有什么区别?
私有 RPC 端点专用于你的应用程序或一小部分客户,提供更可预测的容量,并且通常提供归档数据和 WebSocket 支持等附加功能。
我应该使用哪个 Solana 公共 API 端点进行开发?
使用 https://api.devnet.solana.com 进行开发和测试。你可以从 Solana 水龙头获取 Devnet SOL 以支付交易费用。
我可以将公共 API 用于生产 dApp 吗?
Solana 文档建议不要将公共端点用于生产流量。它们是为开发和早期测试而设计的,不适合持续的生产负载。
OnFinality 是否提供 Solana 公共 API?
OnFinality 提供托管 Solana RPC 端点和专用节点基础设施。你可以在 Solana 网络页面 上开始使用 Solana 端点,并在 RPC 定价 页面上查看容量选项。