摘要
solana.io 并不是你需要的 Solana RPC 端点或开发者门户。Solana 网络通过 JSON-RPC 端点访问,实际问题是你的应用应该指向哪个端点。本文解释了域名混淆,展示了真实的 Solana mainnet RPC 和 WebSocket URL,并帮助你决定是使用公共端点还是专用节点基础设施。
你将获得一个可用的连接示例、公共访问与专用访问的对比,以及针对最常见 Solana RPC 故障的调试路径,以便从首次请求过渡到生产就绪的设置。
solana.io 是什么,以及不是什么
如果你在浏览器或配置文件中输入 solana.io,期望得到一个 Solana RPC 端点,那么你遇到了命名冲突。域名 solana.io 不是 Solana 的官方开发者门户,也不是你可以向其 POST 请求的 JSON-RPC 端点。Solana 网络通过暴露 HTTP 和 WebSocket 端点的 RPC 提供商访问,官方开发者文档位于 Solana 文档站点,而不是一个 .io 域名。
实际结论:不要再寻找 solana.io 作为端点。你真正需要的是一个 Solana mainnet 或 devnet RPC URL、正确的传输方式(HTTP 用于请求/响应,WebSocket 用于订阅),以及决定共享公共端点是否足够,还是你的工作负载需要专用容量。
本文直接回答这个问题,然后介绍连接设置、一个可用的请求,以及当 Solana 端点未针对你的流量进行规模调整时出现的故障模式。
你应该指向哪个 Solana 端点?
在复制任何 URL 之前,将端点与环境和工作负载匹配。下表是最快的决定方式。
| 你的情况 | 环境 | 传输 | 推荐访问 |
|---|---|---|---|
| 第一个脚本,学习 JSON-RPC | Devnet | HTTP | 公共 devnet 端点 |
| 钱包或 dApp 测试 | Devnet | HTTP + WebSocket | 公共或共享端点 |
| 生产 dApp 读取 | Mainnet | HTTP | 共享或专用 RPC |
| 实时账户或 slot 更新 | Mainnet | WebSocket | 支持 WS 的端点 |
| 高请求量或索引 | Mainnet | HTTP + WebSocket | 专用节点 |
| 延迟敏感的交易或机器人 | Mainnet | HTTP + WebSocket | 专用节点,同地部署 |
两条规则让你远离麻烦。第一,永远不要将生产流量指向 devnet 端点,也永远不要将测试指向 mainnet。第二,如果你的应用打开 WebSocket 订阅,在发布前确认端点声明支持 WebSocket。
OnFinality 通过 HTTP 和 WebSocket 暴露 Solana mainnet,因此同一个提供商可以覆盖请求/响应调用和基于订阅的流程。你可以在 Solana RPC 网络页面 查看网络详情,并在仍在构建时使用 Solana Devnet。
Solana 链设置一览
当你配置钱包、框架或自定义客户端时,以下是 Solana mainnet 的重要值。
| 设置 | 值 |
|---|---|
| 链名称 | Solana Mainnet |
| 原生货币 | SOL(9 位小数) |
| HTTP RPC | https://solana.api.onfinality.io/public |
| WebSocket RPC | wss://solana.api.onfinality.io/public-ws |
| 区块浏览器 | https://explorer.solana.com |
注意,Solana 不像以太坊网络那样使用 EVM 风格的数值链 ID。如果某个工具要求链 ID,请查看该工具的 Solana 特定文档,而不是猜测一个数字。
对于 devnet 工作,将 devnet 和 mainnet 配置保存在单独的环境变量中,这样复制粘贴错误就不会将测试交易发送到 mainnet。
# .env
SOLANA_MAINNET_RPC=https://solana.api.onfinality.io/public
SOLANA_MAINNET_WS=wss://solana.api.onfinality.io/public-ws
SOLANA_DEVNET_RPC=<your-devnet-endpoint>
一个可用的 Solana JSON-RPC 请求
Solana 使用基于 HTTP 的 JSON-RPC。下面的示例获取当前 slot,这是一种确认端点可达并返回数据的轻量级方法。
curl https://solana.api.onfinality.io/public \
-X POST \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"id": 1,
"method": "getSlot",
"params": [{"commitment": "confirmed"}]
}'
健康的响应看起来像一个 JSON 对象,其中 result 字段包含一个数字。如果你得到的是错误对象,请跳转到下面的调试部分。
使用 fetch 的 JavaScript 相同调用:
const res = await fetch("https://solana.api.onfinality.io/public", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
jsonrpc: "2.0",
id: 1,
method: "getSlot",
params: [{ commitment: "confirmed" }],
}),
});
const data = await res.json();
console.log(data.result);
一旦基本调用正常工作,就转向你的应用实际需要的方法:getAccountInfo 用于余额和账户数据,getTransaction 用于确认检查,sendTransaction 用于写入,getProgramAccounts 用于程序范围的查询。getProgramAccounts 是最可能暴露端点能力不足的方法,因为它可能返回大量结果集。
公共端点还是专用节点?
这是决定你的应用随着使用增长是否保持响应的决策。公共或共享端点适用于开发、低流量脚本和早期测试。当你的流量可预测但很大时,当你需要一致地访问 WebSocket 订阅时,或者当你运行发出许多并发调用的索引器和机器人时,专用节点就有意义。
你已经超出共享端点的信号:
- 在高峰时段看到间歇性的
429响应。 - WebSocket 订阅频繁断开和重连。
getProgramAccounts或大型getTransaction批次超时。- 你的 p95 延迟在一天中变化很大。
- 你需要为发布或交易窗口提供可预测的容量。
如果其中两个或更多适用,请评估专用容量。OnFinality 为需要隔离资源的团队提供 专用节点,你可以在 RPC 定价页面 比较访问层级。有关涵盖归档访问、trace 方法和故障转移的更广泛框架,请参阅 如何选择 RPC 提供商。
常见 Solana RPC 故障的调试路径
当调用失败时,错误通常指向少数几个原因之一。在更换提供商之前,请先处理此表。
| 症状 | 可能原因 | 下一步 |
|---|---|---|
429 Too Many Requests | 共享端点上的速率限制 | 降低并发或迁移到专用容量 |
Method not found | 该端点未启用该方法 | 与提供商确认方法支持 |
getProgramAccounts 超时 | 结果集大,端点限制 | 添加过滤器、分页或使用更强的端点 |
| WebSocket 断开 | 订阅限制或网络不稳定 | 添加重连逻辑,确认 WS 支持 |
Blockhash not found | 交易中的 blockhash 过期 | 在签名前获取新的 blockhash |
账户的 result 为空 | 错误的 commitment 级别或账户尚未创建 | 使用 confirmed 或 finalized 重试 |
两个调试习惯会带来回报。第一,记录原始 JSON-RPC 错误对象,而不仅仅是 HTTP 状态,因为 Solana 在响应体中返回有用的错误代码。第二,对第二个端点测试相同的调用,以区分应用程序错误和端点问题。
如果你特别关注速率限制和身份验证问题,Solana RPC 访问文章 会更深入地探讨这些故障模式。
Commitment 级别及其为何改变结果
Solana 允许你选择响应必须达到的最终性程度。这会影响正确性和延迟。
processed返回最快但最不稳定的数据。confirmed是面向用户读取的常见默认值。finalized对于任何不可逆的操作(如存入存款)是最安全的。
一个常见的错误是在 processed 级别读取余额并将其视为最终。对于任何涉及价值转移的操作,请在 confirmed 或 finalized 级别读取,并在每次调用中明确指定 commitment,而不是依赖默认值。
通过 WebSocket 运行订阅
实时功能(如监视账户或跟踪 slot)需要 WebSocket 连接。Solana 通过 WebSocket 传输暴露订阅方法,如 accountSubscribe 和 slotSubscribe。
const ws = new WebSocket("wss://solana.api.onfinality.io/public-ws");
ws.onopen = () => {
ws.send(JSON.stringify({
jsonrpc: "2.0",
id: 1,
method: "slotSubscribe",
params: [],
}));
};
ws.onmessage = (event) => {
console.log(JSON.parse(event.data));
};
生产订阅代码应包括带退避的重连逻辑、用于检测死连接的心跳,以及每个客户端同时订阅数量的上限。静默停止传递更新的丢失订阅是最难注意到的错误之一,因此请监控消息到达,而不是假设套接字健康。
关键要点
solana.io不是 Solana RPC 端点或官方开发者门户;请改用真实的 JSON-RPC URL。- Solana mainnet 可通过 HTTP 访问
https://solana.api.onfinality.io/public,通过 WebSocket 访问wss://solana.api.onfinality.io/public-ws。 - 将端点与环境匹配:devnet 用于构建,mainnet 用于生产,切勿混用两者。
- 有意识地选择 commitment 级别;对于任何涉及价值转移的操作,使用
confirmed或finalized。 - 当你看到持续的
429、订阅丢失或大型查询超时时,从共享容量迁移到专用容量。 - 记录原始 JSON-RPC 错误体,并对第二个端点进行测试,以区分应用错误和端点限制。
常见问题
solana.io 是官方的 Solana RPC 端点吗?
不是。solana.io 不是 JSON-RPC 端点。Solana 通过暴露 HTTP 和 WebSocket URL 的 RPC 提供商访问,官方开发者文档位于 Solana 文档站点。
Solana mainnet RPC URL 是什么?
OnFinality 通过 HTTP 暴露 Solana mainnet:https://solana.api.onfinality.io/public,通过 WebSocket:wss://solana.api.onfinality.io/public-ws。你可以在 Solana RPC 网络页面 查看网络。
我需要为 Solana 使用 WebSocket 端点吗?
仅当你的应用使用订阅(如 accountSubscribe 或 slotSubscribe)时才需要。如果你只进行请求/响应调用,HTTP 就足够了。如果你需要实时更新,请在发布前确认端点支持 WebSocket。
我什么时候应该从公共 Solana 端点迁移?
当你看到持续的速率限制错误、WebSocket 订阅丢失或大型查询(如 getProgramAccounts)超时时。此时,评估 专用节点 并在 RPC 定价页面 比较层级。
如何快速测试 Solana 端点?
使用 curl 发送 getSlot 请求,如上所示。数字 result 确认端点可达并响应;错误对象告诉你检查方法、commitment 或速率限制。
在哪里可以看到 OnFinality 支持的所有网络?
完整列表在 支持的 RPC 网络 页面上,包括 Solana mainnet 和 devnet。
下一步
首先将测试脚本指向 Solana mainnet 端点并确认 getSlot 响应。然后添加你的应用所需的方法,设置明确的 commitment 级别,如果你使用订阅,则添加 WebSocket 重连逻辑。当你的流量增长到共享端点无法轻松处理时,查看 专用节点 和 RPC 定价,并在扩展到其他链时保留 支持的 RPC 网络 页面。