摘要
Solana RPC 节点暴露了您的应用用于读取账户、提交交易以及订阅 slot 或账户变化的 JSON-RPC 接口。本页面涵盖了端点形态、实践中最关键的方法,以及随着工作负载增长如何在共享公共 RPC 和专用节点之间做出选择。
您将获得一个可连接的端点示例、工作负载与设置对照表、常见故障的调试路径,以及在将流量迁移到某个提供商之前评估它的简短清单。
从 RPC 的角度看,Solana 不像一条 EVM 链。没有 eth_getLogs,没有逐块收据模型,也没有可以轮询待处理交易的内存池。相反,您读取账户状态、提交已签名交易,并订阅 slot 或账户更新。理解这种形态是选择正确 RPC 节点设置的最快方式。
哪种 Solana RPC 设置适合您的工作负载
在比较提供商之前,先将您的工作负载与它实际需要的端点类型匹配。大多数团队早期过度配置,后期配置不足,因此请将此表作为初步筛选。
| 工作负载 | 典型调用模式 | 通常适合的设置 |
|---|---|---|
| 钱包或投资组合 UI | getBalance、getTokenAccountsByOwner、偶尔 sendTransaction | 带提供商密钥的共享 RPC 端点 |
| 交易机器人或狙击手 | 高频 sendTransaction、getLatestBlockhash、优先费用读取 | 专用节点或低延迟私有端点 |
| 索引器或分析 | getProgramAccounts、getSignaturesForAddress、大批量 getTransaction | 支持归档且计算限制宽松的节点 |
| dApp 前端 | 混合读取加 WebSocket accountSubscribe | 共享 RPC 加 WebSocket 端点 |
| 验证者工具 | Slot 和 epoch 读取、投票账户查询 | 靠近您验证者的专用节点 |
如果您的应用只读取余额并偶尔提交交易,共享端点通常就足够了。如果您突发提交交易、对大型程序运行 getProgramAccounts,或需要可预测的计算单元余量,专用 Solana 节点提供的容量不会与其他租户共享。
OnFinality 同时提供共享 Solana RPC API 访问和专用节点基础设施,因此您可以从共享端点开始,然后迁移到专用节点,而无需更改客户端代码。请参阅 Solana 网络页面 了解当前端点详情,以及 RPC 定价 了解计划形态。
端点形态:HTTP 和 WebSocket
Solana RPC 节点通过 HTTP 暴露 JSON-RPC 2.0 接口用于请求/响应调用,并提供一个单独的 WebSocket URL 用于订阅。两者不可互换:accountSubscribe、slotSubscribe 和 logsSubscribe 仅通过 WebSocket 工作。
公共 OnFinality Solana 端点遵循以下模式:
# HTTP JSON-RPC
https://solana.api.onfinality.io/public
# WebSocket subscriptions
wss://solana.api.onfinality.io/public-ws
一个最小的 curl 调用,用于确认端点在线并返回预期的集群:
curl https://solana.api.onfinality.io/public \
-X POST \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"id": 1,
"method": "getHealth"
}'
健康的主网节点返回 {"jsonrpc":"2.0","result":"ok","id":1}。如果您得到集群不匹配或 -32005 类错误,很可能指向了错误的网络或触发了速率限制。
对于客户端使用,@solana/web3.js 连接对象接受两个 URL:
import { Connection, PublicKey } from "@solana/web3.js";
const connection = new Connection(
"https://solana.api.onfinality.io/public",
{ wsEndpoint: "wss://solana.api.onfinality.io/public-ws" }
);
const balance = await connection.getBalance(
new PublicKey("11111111111111111111111111111111")
);
console.log(balance);
保持 HTTP 和 WebSocket URL 来自同一提供商和同一集群。将主网 HTTP 端点与 devnet WebSocket 混合使用是导致令人困惑的订阅失败的常见原因。
影响节点需求的方法
并非所有 JSON-RPC 方法的成本相同。少数 Solana 方法主导节点负载,是在您承诺使用某个提供商之前值得测试的方法。
| 方法 | 作用 | 为何给节点带来压力 |
|---|---|---|
getProgramAccounts | 返回程序拥有的所有账户 | 结果集大、计算繁重,通常需要过滤器 |
getSignaturesForAddress | 列出地址的签名 | 对繁忙地址进行深度历史扫描 |
getTransaction | 获取完整交易 | 在循环中不批量调用时开销大 |
sendTransaction | 提交已签名交易 | 对延迟敏感,竞争区块包含 |
getLatestBlockhash | 返回最近的区块哈希 | 在交易和机器人工作负载中频率高 |
accountSubscribe | 流式传输账户变化 | 需要稳定的 WebSocket 连接 |
如果您的应用依赖 getProgramAccounts 或深度签名历史,请确认提供商支持这些调用并具有合理的限制,以及在需要时支持归档数据。一些共享端点限制或节流这些方法,因为单个调用者可能消耗节点资源的很大份额。
将钱包或客户端连接到 Solana
对于钱包或前端,您通常注册一次网络,然后让用户切换。典型的 Solana 网络条目如下所示:
{
"chainName": "Solana Mainnet",
"rpcUrls": ["https://solana.api.onfinality.io/public"],
"nativeCurrency": { "name": "SOL", "symbol": "SOL", "decimals": 9 },
"blockExplorerUrls": ["https://explorer.solana.com"]
}
如果您在主网之前构建或测试,请指向 devnet 端点,并将两个配置分开。Solana Devnet 页面 涵盖了测试网侧的设置。
两个实用注意事项:
- Solana 交易过期很快。在提交时间附近获取新的区块哈希,而不是缓存一个。
- 优先费用在负载下很重要。读取最近的优先费用,并设置反映当前网络状况的费用,而不是固定值。
调试常见的 Solana RPC 故障
大多数 Solana RPC 问题归结为少数症状。在更换提供商之前,将症状与可能的原因匹配。
| 症状 | 可能原因 | 首先检查 |
|---|---|---|
Blockhash not found | 过时或过期的区块哈希 | 在发送前立即获取新的 getLatestBlockhash |
429 或速率限制错误 | 超出共享端点配额 | 请求速率、批处理,以及是否需要专用节点 |
| WebSocket 断开 | 空闲超时或连接不稳定 | 重连逻辑和订阅心跳 |
getProgramAccounts 结果为空 | 缺少或错误的过滤器 | 数据大小过滤器和账户鉴别器 |
| 交易上链缓慢 | 优先费用低或 slot 拥堵 | 最近的优先费用和重试策略 |
| 集群不匹配错误 | HTTP 和 WS 指向不同集群 | 两个 URL 来自同一网络 |
一个简单的监控探针可以帮助您在用户之前发现端点问题:
while true; do
curl -s https://solana.api.onfinality.io/public \
-X POST -H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"getSlot"}' \
| head -c 200
echo
done
对故障转移列表中的每个端点运行此命令并记录响应时间。如果某个端点出现偏差,您可以在它变成故障之前转移流量。
共享端点还是专用节点?
决策通常归结为三个问题:您的流量有多突发,您的方法有多重,以及您需要对节点本身有多少控制。
- 共享 RPC 适合读密集型应用、钱包和早期产品。您获得托管端点而无需运行基础设施,并且您为访问付费而不是为机器付费。
- 专用节点 适合交易系统、索引器和调用昂贵方法或需要一致计算余量的应用。您获得一个不与其他租户共享的节点,使性能更可预测。
一种常见模式是对一般读取使用共享 RPC,对延迟敏感路径使用专用节点,然后在它们之间故障转移。OnFinality 支持两种模式,您可以在 如何选择 RPC 提供商 和 专用节点 选项中查看权衡。
Solana 提供商评估清单
当您比较 Solana RPC 提供商时,请针对您的真实工作负载进行测试,而不是通用基准。
- 方法覆盖 — 确认
getProgramAccounts、getSignaturesForAddress和 WebSocket 订阅与您的过滤器一起工作。 - 计算和速率限制 — 询问限制如何应用,以及它们是否随您的计划扩展。
- 归档深度 — 如果您查询旧交易或签名,请验证历史数据是否可用。
- WebSocket 稳定性 — 测试长寿命订阅,而不仅仅是单条消息。
- 故障转移 — 检查您是否可以运行多个端点并在它们之间切换。
- 可观测性 — 寻找您可以采取行动的请求指标、错误率和状态信息。
- 支持路径 — 知道当交易路径中断时如何联系提供商。
您可以在 支持的 RPC 网络 页面查看可用网络,并在 RPC 定价 比较计划形态。
关键要点
- Solana RPC 节点通过 HTTP 暴露 JSON-RPC,并提供一个单独的 WebSocket URL 用于订阅。
getProgramAccounts、getSignaturesForAddress和sendTransaction是最影响节点需求的方法。- 共享端点适合读密集型应用;专用节点适合突发、延迟敏感或计算密集型工作负载。
- 大多数故障可追溯到过时的区块哈希、速率限制、WebSocket 断开或集群不匹配。
- 针对您的真实调用模式测试提供商,包括 WebSocket 稳定性和归档深度。
常见问题
我需要专用 Solana 节点吗? 不一定。如果您的应用读取余额并偶尔提交交易,共享端点通常就足够了。当您需要可预测的计算余量、重型方法支持或更低的交易提交延迟时,请迁移到专用节点。
HTTP 和 WebSocket Solana 端点有什么区别?
HTTP 处理请求/响应调用,如 getBalance 和 sendTransaction。WebSocket 处理订阅,如 accountSubscribe 和 slotSubscribe。如果您的应用使用订阅,则需要两个 URL。
为什么 getProgramAccounts 失败或返回空?
这是一个重型方法,通常需要过滤器,一些共享端点限制它。检查您的数据大小过滤器和账户鉴别器,并确认提供商支持您预期量的调用。
如何处理 Solana 交易失败?
在提交附近获取新的区块哈希,根据最近的网络状况设置优先费用,并实现重试。大多数 Blockhash not found 错误来自过时的区块哈希。
我可以对主网和 devnet 使用同一个端点吗? 不可以。主网和 devnet 是独立的集群,具有独立的端点。保持两个配置不同,并确保您的 HTTP 和 WebSocket URL 指向同一集群。