摘要
Solana RPC URL 是您的应用发送 JSON-RPC 调用以读取账户、提交交易和订阅链上事件的 HTTP 或 WebSocket 端点。OnFinality 在 https://solana.api.onfinality.io/public 公开了一个 Solana 端点,并在 wss://solana.api.onfinality.io/public-ws 提供了匹配的 WebSocket,您可以将其放入钱包、SDK 和脚本中进行测试。
公共端点便于开发,但生产应用通常需要专用容量、可预测的吞吐量和故障转移。本文介绍了 Solana RPC URL 在常见工具中的位置、如何验证其工作,以及何时从共享公共端点迁移到专用 Solana 节点基础设施。
Solana RPC URL 是您的应用程序通过 JSON-RPC 与 Solana 节点通信的地址。无需自己运行验证器或 RPC 节点,您只需将钱包、后端或脚本指向一个端点,让它处理 getAccountInfo、sendTransaction、getLatestBlockhash 以及 Solana JSON-RPC 接口的其余部分。本页回答了直接的问题——我该使用什么 URL——然后帮助您决定共享公共端点是否足够,或者您的工作负载是否需要专用容量。
现在该使用哪个 Solana RPC URL
最快的答案:OnFinality 发布了一个公共 Solana 主网端点,您可以立即使用。
| 设置 | 值 |
|---|---|
| 网络 | Solana Mainnet |
| HTTP RPC URL | https://solana.api.onfinality.io/public |
| WebSocket RPC URL | wss://solana.api.onfinality.io/public-ws |
| 原生货币 | SOL(9 位小数) |
| 区块浏览器 | https://explorer.solana.com |
| 链 ID | 不适用——Solana 不使用 EVM 风格的数值链 ID |
最后一行很重要。如果您来自以太坊工具,可能会期望在钱包网络配置中使用数值链 ID。Solana 通过名称(mainnet-beta、devnet、testnet)和创世哈希来标识其集群,而不是通过链 ID。因此,钱包和 SDK 配置需要 RPC URL 加上集群名称,而不是链 ID 整数。
如果您是在构建或测试而非发布,请改用 Solana Devnet RPC 端点,以免花费真实的 SOL。有关 OnFinality 服务的完整链列表,请参阅支持的 RPC 网络。
将端点放入您的技术栈
curl 冒烟测试
在将任何内容接入应用之前,确认端点有响应。Solana 使用基于 HTTP POST 的 JSON-RPC,因此一次 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}。如果您遇到超时或非 200 状态,说明从您的网络无法访问该端点——检查出口规则、代理,或尝试其他区域。
使用 @solana/web3.js 的 JavaScript
大多数 Solana 应用使用 @solana/web3.js。连接对象接受 HTTP URL,以及可选的用于订阅的 WebSocket URL:
import { Connection, PublicKey, clusterApiUrl } from "@solana/web3.js";
const connection = new Connection(
"https://solana.api.onfinality.io/public",
{
wsEndpoint: "wss://solana.api.onfinality.io/public-ws",
commitment: "confirmed",
}
);
const balance = await connection.getBalance(
new PublicKey("11111111111111111111111111111111")
);
console.log("lamports:", balance);
测试时将 URL 字符串替换为您的 devnet 端点。其余代码完全相同,这也是 Solana 开发者保持单一连接工厂并通过环境变量切换端点的原因之一。
钱包网络配置
Phantom 和 Solflare 等钱包允许用户在设置中添加自定义 RPC 端点。提供 HTTP URL,并在钱包支持的情况下提供 WebSocket URL。在默认公共端点上遇到速率限制的用户可以粘贴您的专用 URL。如果您发布 dApp,暴露可配置的端点是一个小功能,当共享端点拥塞时会带来回报。
公共端点 vs 专用 Solana 节点
公共端点适合开发、演示和低流量脚本。它并非为持续高请求率、大量 getProgramAccounts 扫描或延迟敏感的交易而设计。以下是两种选项在实际中的区别:
| 工作负载信号 | 公共端点 | 专用 Solana 节点 |
|---|---|---|
| 原型设计、一次性脚本 | 适合 | 过度 |
| 具有稳定用户流量的钱包或 dApp | 可能触及共享限制 | 可预测的容量 |
高频 sendTransaction | 争用风险 | 隔离的吞吐量 |
大量 getProgramAccounts / getSignaturesForAddress 扫描 | 经常被限流 | 更适合 |
| 大规模 WebSocket 订阅 | 共享 | 专用连接 |
| 合规或数据驻留需求 | 共享基础设施 | 可配置 |
如果您的应用已过原型阶段,并且您看到间歇性的 429、缓慢的 getProgramAccounts 或掉线的 WebSocket 订阅,那就是迁移的信号。OnFinality 提供托管 RPC API 访问和专用节点,让您获得隔离的容量。定价随您选择的计划而扩展——请查看 RPC 定价 了解当前层级,而不是从博客文章中猜测。
您实际会调用的 Solana JSON-RPC 方法
Solana 的 JSON-RPC 接口很广泛。在生产中,少数方法占主导地位:
getLatestBlockhash— 构建任何交易前必需;区块哈希会过期,因此要获取最新的。sendTransaction— 提交已签名的交易。返回签名,而不是确认。getSignatureStatuses— 轮询此方法以确认交易已落地。getAccountInfo— 读取单个账户的数据和 lamports。getProgramAccounts— 扫描程序拥有的所有账户。功能强大且昂贵;使用过滤器。getTokenAccountsByOwner— 列出钱包的 SPL 代币账户。getSlot和getBlockHeight— 低成本的存活检查。accountSubscribe/logsSubscribe(WebSocket)— 基于推送的更新,而非轮询。
一个常见的错误是将 sendTransaction 视为同步操作。它不是。您提交,然后通过 getSignatureStatuses 或 WebSocket 订阅进行确认。正确构建该确认循环是可靠应用与显示过时余额的应用之间的区别。
调试无法工作的 Solana RPC URL
当调用失败时,错误通常指向少数几个原因之一。将症状与可能的修复方法匹配:
| 症状 | 可能原因 | 尝试方法 |
|---|---|---|
Connection refused 或超时 | URL 错误、出口被阻止或代理问题 | 从同一主机重新运行 curl 测试 |
| HTTP 429 | 共享端点速率限制 | 退避、批量调用或迁移到专用容量 |
Blockhash not found | 过期的区块哈希 | 在签名前立即获取新的 getLatestBlockhash |
| 交易从未确认 | 被丢弃或费用过低 | 检查 getSignatureStatuses,用新的区块哈希重新提交 |
| WebSocket 断开连接 | 空闲超时或网络波动 | 实现带退避的重连;重新订阅 |
getProgramAccounts 超时 | 未过滤的扫描 | 添加 dataSize 和 memcmp 过滤器 |
| 本地正常,CI 中失败 | 环境变量未设置 | 在启动时记录解析后的端点 |
两个习惯可以防止大多数这些问题。首先,记录您的应用实际解析的端点——许多“RPC 宕机”的报告最终发现是过期的环境变量。其次,将 RPC 调用包装在带指数退避的重试逻辑中,并将 429 和 5xx 与 4xx 客户端错误区别对待。
生产就绪检查清单
在将真实用户指向 Solana RPC URL 之前,请确认以下内容:
- 端点是可配置的,而非硬编码。 从环境变量读取,以便无需重新部署即可切换提供商。
- 您有备用方案。 第二个端点——即使是不同的提供商——在主端点降级时保持在线。有关评估标准,请参阅如何选择 RPC 提供商。
- 确认逻辑正确。 不要假设
sendTransaction成功就意味着最终性。轮询或订阅。 - 处理了 WebSocket 重连。 订阅会断开;您的客户端应重新建立它们。
- 您监控错误率。 将 429、超时和确认延迟作为一等指标进行跟踪。
- 您了解自己的峰值请求率。 在启动前将其与计划的容量进行比较,而不是之后。
如果缺少任何一项,请在扩展流量之前修复。现在解决比在事件期间解决成本更低。
何时迁移到专用 Solana 基础设施
共享公共端点是起点,不是终点。在以下情况下迁移到专用基础设施:
- 您的请求量稳定且足够高,共享限制成为瓶颈。
- 您依赖
getProgramAccounts或归档式查询,这些在共享节点上很昂贵。 - 您需要可预测的延迟用于交易、清算或实时仪表板。
- 您希望为许多并发订阅者提供隔离的 WebSocket 容量。
- 您需要支持渠道和 SLA,而不是尽力而为的公共访问。
OnFinality 提供托管 API 和专用节点基础设施形式的 Solana RPC,因此您可以从公共端点开始,无需更改应用代码即可扩展——只需更改 URL。浏览 Solana 网络页面 了解端点详情,或在准备确定计划规模时查看 RPC 定价。
关键要点
- OnFinality 公共 Solana 主网 RPC URL 是
https://solana.api.onfinality.io/public,WebSocket 为wss://solana.api.onfinality.io/public-ws。 - Solana 不使用 EVM 风格的数值链 ID;通过集群名称和 RPC URL 进行配置。
- 在将端点接入应用之前,始终用
getHealthcurl 调用进行冒烟测试。 sendTransaction是异步的——通过getSignatureStatuses或 WebSocket 订阅进行确认。- 公共端点适合开发;专用节点适合持续、延迟敏感或扫描密集型工作负载。
- 将端点保存在环境变量中并配置备用方案,以便无需重新部署即可切换。
常见问题
Solana 有链 ID 吗?
没有。Solana 不使用 EVM 风格的数值链 ID。工具通过名称(mainnet-beta、devnet、testnet)和创世哈希来标识集群。当钱包要求链 ID 时,通常是一个不适用于 Solana 的 EVM 导向字段。
我可以对 devnet 和 mainnet 使用相同的 RPC URL 吗? 不可以。主网和 devnet 是独立的集群,具有独立的端点。测试时使用 Solana Devnet RPC 端点,生产时使用主网 URL,并将它们保存在不同的环境变量中。
为什么我的交易显示“blockhash not found”?
您签名所依据的区块哈希已过期。Solana 区块哈希寿命很短。在签名和重新提交之前立即获取新的 getLatestBlockhash。
我需要 WebSocket URL 吗?
仅当您使用 accountSubscribe 或 logsSubscribe 等订阅时。如果您通过 HTTP 调用进行轮询,仅 HTTP URL 就足够了。对于实时应用,WebSocket 可减少轮询负载。
我什么时候应该停止使用公共端点?
当您看到反复出现的 429、getProgramAccounts 超时、订阅掉线,或者需要可预测的延迟和支持时。此时,迁移到专用容量——请参阅 RPC 定价 和 专用节点。
我可以在不更改代码的情况下切换提供商吗? 通常可以,如果您将端点保存在配置中而不是硬编码。Solana JSON-RPC 是标准化的,因此大多数方法调用在不同提供商之间可以工作。在生产环境切换之前,测试 WebSocket 行为和任何提供商特定的扩展。