摘要
Solana RPC 服务器是您的应用用来读取账户、提交交易和订阅链上事件的 HTTP 和 WebSocket 接口。本页解释了 Solana RPC 服务器的实际功能、如何将您的工具指向它,以及随着工作负载增长,如何在公共端点、托管 RPC API 或专用节点之间做出选择。
您将找到可用的 curl 和 JavaScript 示例、钱包和框架配置所需的链设置、常见故障模式(如速率限制和 slot 延迟),以及当流量超出共享端点时,迁移到专用 Solana 基础设施的实用检查清单。
Solana RPC 服务器是您的应用程序在需要读取区块链状态或提交交易时与之通信的服务。您无需自己运行验证器或 RPC 节点,而是将客户端指向一个支持 Solana JSON-RPC 方言的 HTTP 端点(通常还有一个 WebSocket 端点)。从钱包余额检查到代币交换,一切都始于向该服务器发送请求。
本页面向已经知道自己需要 Solana RPC 服务器并希望正确连接它的开发者,然后决定共享端点是否足够,或者专用节点是否更合适。如果您仍在高层面上比较提供商,请从如何选择 RPC 提供商开始,然后回到这里进行 Solana 特定的配置。
在公共、托管和专用 Solana RPC 之间选择
最快的决策方法是将您的工作负载与端点类型匹配。大多数团队从公共或共享端点开始,然后在遇到特定限制时升级,而不是模糊地感觉速度慢。
| 您的情况 | 通常适合的端点类型 | 需要注意什么 |
|---|---|---|
| 原型设计、脚本、低请求量 | 公共端点 | 共享容量、严格的速率限制、无 SLA |
| 具有稳定读取流量的生产 dApp | 托管 RPC API(共享、带密钥) | 每方法限制、WebSocket 连接上限 |
索引器、机器人、大量使用 getProgramAccounts | 专用节点 | 账户扫描的内存和磁盘、归档需求 |
| 交易或延迟敏感的提交 | 靠近您基础设施的专用节点 | Slot 延迟、交易落地率、故障转移 |
| 需要历史状态或完整账本 | 支持归档的专用节点 | 存储增长、快照恢复时间 |
OnFinality 通过托管的 RPC API 服务和专用节点提供 Solana RPC,当您需要隔离容量时。托管端点是大多数应用的合适起点;专用节点适用于已超出共享吞吐量或需要可预测资源的团队。
一个快速的经验法则:如果您的错误主要是 429 响应,您需要带密钥的托管计划或专用节点。如果您的错误是像 getProgramAccounts 这样的重调用超时,您需要更多内存和专用节点,而不是更大的共享计划。
Solana RPC 服务器设置一览
当您配置钱包、框架或后端服务时,您需要网络参数,而不仅仅是 URL。对于 Solana 主网,这些是要使用的值。
| 设置 | 值 |
|---|---|
| 链名称 | Solana Mainnet |
| 原生货币 | SOL(9 位小数) |
| HTTP RPC URL | https://solana.api.onfinality.io/public |
| WebSocket RPC URL | wss://solana.api.onfinality.io/public-ws |
| 区块浏览器 | https://explorer.solana.com |
| 支持的传输 | HTTP 和 WebSocket |
对于开发和测试,请使用 devnet 端点而不是主网,这样您就不会花费真实的 SOL。OnFinality 暴露了一个单独的 Solana Devnet 端点,您可以从标准的 Solana 水龙头请求 devnet SOL 来资助测试交易。将 devnet 和主网配置保存在单独的环境变量中,这样测试密钥就不会意外指向主网。
一个常见的模式是将端点存储在环境变量中并在启动时读取:
SOLANA_RPC_URL=https://solana.api.onfinality.io/public
SOLANA_WS_URL=wss://solana.api.onfinality.io/public-ws
使用 curl 和 JavaScript 连接
确认 Solana RPC 服务器正在响应的最简单方法是通过 HTTP 进行 JSON-RPC 调用。Solana 使用与其他链相同的 JSON-RPC 2.0 信封,但具有 Solana 特定的方法。
curl https://solana.api.onfinality.io/public \
-X POST \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"id": 1,
"method": "getLatestBlockhash",
"params": [{"commitment": "confirmed"}]
}'
健康的响应会返回一个包含 blockhash 和 lastValidBlockHeight 的 result 对象。如果您得到的是错误对象,则端点可达但请求被拒绝,这通常指向格式错误的方法或参数,而不是网络问题。
在 JavaScript 中,@solana/web3.js 库封装了这些调用。将连接指向您的端点并传递承诺级别:
import { Connection, PublicKey, clusterApiUrl } from "@solana/web3.js";
const connection = new Connection(
process.env.SOLANA_RPC_URL,
{ commitment: "confirmed", wsEndpoint: process.env.SOLANA_WS_URL }
);
const balance = await connection.getBalance(
new PublicKey("11111111111111111111111111111111")
);
console.log("lamports:", balance);
承诺级别在 Solana 上很重要。processed 最快但可能回滚,confirmed 是大多数应用的常见默认值,finalized 对于结算逻辑最安全。选择与操作风险匹配的级别,而不是可用的最快级别。
WebSocket 订阅及何时使用它们
Solana RPC 服务器还暴露 WebSocket 传输以进行基于推送的更新。无需在循环中轮询 getSlot 或 getAccountInfo,您可以订阅并在状态更改时接收通知。
const subId = connection.onAccountChange(
new PublicKey("11111111111111111111111111111111"),
(accountInfo, context) => {
console.log("slot", context.slot, "lamports", accountInfo.lamports);
},
"confirmed"
);
WebSocket 订阅很高效,但它们保持连接打开,共享端点通常会限制并发订阅。如果您在许多用户之间运行许多订阅,请跟踪您的连接数并计划重连。订阅可能在网络拥塞期间断开,因此始终处理断开事件并重新订阅,而不是假设流是永久的。
对于高频使用,专用节点为您提供稳定的订阅预算,并避免与其他租户竞争通知传递。
常见故障模式及如何解读
大多数 Solana RPC 问题归结为少数症状。将症状与原因匹配可以节省大量猜测。
| 症状 | 可能原因 | 初步修复 |
|---|---|---|
HTTP 429 响应 | 共享端点上的速率限制 | 添加带密钥的计划或迁移到专用 |
getProgramAccounts 请求超时 | 大账户扫描、内存压力 | 使用过滤器,或迁移到专用节点 |
发送时 Blockhash not found | Blockhash 在落地前过期 | 获取新的 blockhash 并重试 |
| 交易落地缓慢 | 拥塞或费用太低 | 添加优先费用,重新提交 |
| WebSocket 断开 | 空闲超时或连接上限 | 实现重连和重新订阅 |
| Slot 数据陈旧 | 节点落后于尖端 | 检查 slot 延迟,考虑更换节点 |
其中两个值得更多细节。首先,没有过滤器的 getProgramAccounts 是 Solana 上最重的调用之一。它可以扫描大量账户数据,在共享端点上,它通常是第一个被限流的调用。在责怪端点之前,添加数据大小和 memcmp 过滤器以缩小结果集。
其次,交易落地不仅仅与 RPC 服务器有关。Solana 使用的 blockhash 在短窗口后过期,因此使用旧 blockhash 构建的交易即使在完全健康的端点上也会失败。获取新的 blockhash,设置合理的优先费用,并使用退避重试。
生产就绪检查清单
在将真实流量发送到 Solana RPC 服务器之前,请完成以下项目。它们是演示与能在繁忙一天中存活的东西之间的区别。
- 分离环境。 将 devnet 和主网端点和密钥保存在不同的配置中。
- 有意设置承诺级别。 大多数读取使用
confirmed,结算使用finalized。 - 处理速率限制。 检测
429响应并退避,而不是立即重试。 - 计划故障转移。 配置辅助端点,以便单次中断不会导致应用宕机。
- 监控 slot 延迟。 跟踪您的节点落后集群尖端多远。
- 关注 WebSocket 健康。 记录断开连接和重新订阅成功。
- 为重调用做预算。 了解您的应用最常使用哪些方法并相应调整规模。
如果其中几项在共享端点上已经令人痛苦,那就是评估专用节点的信号。您可以在 RPC 定价页面比较计划,如果您还在其他链上运营,可以查看支持的 RPC 网络的完整列表。
运行自己的 Solana RPC 服务器 vs 租用
您可以自己运行 Solana RPC 节点。权衡是运营性的,而不仅仅是财务性的。Solana RPC 节点需要大量 RAM、快速 NVMe 存储,以及对快照、升级和监控的持续关注。账本不断增长,因此存储规划是反复出现的任务,而不是一次性设置。
租用托管端点或专用节点将运营负担转移给提供商。您仍然选择区域、容量和传输,但您不需要在凌晨 2 点修补节点或恢复快照。对于大多数产品团队来说,这是工程时间的更好利用。对于有严格数据本地化或合规要求的团队,自托管可能仍然是正确的选择,混合方法(自托管主节点、托管故障转移)很常见。
OnFinality 属于托管阵营:您获得 Solana RPC 端点,并在需要时获得专用节点,而无需自己运行基础设施。Solana 网络页面列出了当前的端点详细信息和传输。
从公共端点迁移而不破坏东西
从公共 Solana RPC 服务器迁移到托管或专用服务器应该是配置更改,而不是重写。如果您准备好,步骤很简单。
- 将新端点与旧端点一起添加。 暂时不要删除公共 URL。
- 将一小部分流量路由到新端点,并比较错误率和延迟。
- 单独更新 WebSocket 配置,因为 HTTP 和 WS 端点是不同的。
- 验证承诺级别在新端点上行为相同。
- 切换默认值一旦错误率稳定,保留旧端点作为故障转移。
- 移除公共端点仅在完整流量周期且无回归后。
因为 Solana RPC 是基于 HTTP 的 JSON-RPC,迁移通常是在环境变量中交换 URL 并重新部署。风险在于细节:忘记 WebSocket URL,或同时更改承诺级别和端点,这使得很难判断行为变化的原因。
关键要点
- Solana RPC 服务器是您的应用用来读取状态和提交交易的 HTTP 和 WebSocket 接口。
- 主网使用链名称 Solana Mainnet、9 位小数的 SOL,以及位于 explorer.solana.com 的浏览器。
- 从共享或公共端点开始,然后在遇到速率限制或重调用超时时迁移到托管或专用节点。
- 承诺级别(
processed、confirmed、finalized)应与每个操作的风险匹配。 - WebSocket 订阅很高效,但需要重连和重新订阅处理。
getProgramAccounts和过期的 blockhash 是两个最常见的混淆来源。- 迁移通常是配置更改,但请一起更新 HTTP 和 WebSocket 端点。
常见问题
什么是 Solana RPC 服务器?
它是一个通过 HTTP 和 WebSocket 暴露 Solana JSON-RPC API 的服务,让您的应用程序无需自己运行节点即可读取账户、提交交易和订阅事件。
主网的 Solana RPC URL 是什么?
OnFinality 在 https://solana.api.onfinality.io/public 暴露 Solana 主网 HTTP,在 wss://solana.api.onfinality.io/public-ws 暴露 WebSocket。始终在 Solana 网络页面上确认当前端点。
为什么我的 Solana RPC 端点返回 429 错误?
429 表示您触发了速率限制,这在共享或公共端点上很常见。带密钥的托管计划或专用节点消除了共享上限。
对于 Solana,我应该使用 HTTP 还是 WebSocket?
使用 HTTP 进行请求-响应调用,使用 WebSocket 进行推送更新,例如账户或 slot 更改。大多数生产应用两者都使用。
我可以在生产中使用公共 Solana RPC 端点吗?
可以,但公共端点是共享的,通常有速率限制。对于稳定的生产流量,托管或专用端点提供更可预测的行为和清晰的升级路径。
如何在不花费 SOL 的情况下测试?
使用 devnet 端点并从水龙头请求 devnet SOL。将 devnet 配置与主网分开,以免密钥交叉。