摘要
Solana 的 JSON-RPC API 是应用程序与网络交互的标准方式——查询账户、提交交易以及订阅实时更新。本文解释了核心方法、如何连接到端点,以及在 Solana 上构建时需避免的常见陷阱。
快速回答:什么是 Solana JSON-RPC?
Solana JSON-RPC 是一个 HTTP 和 WebSocket API,允许您的应用程序在 Solana 区块链上读写数据。它遵循 JSON-RPC 2.0 规范,即您发送一个包含 method 和 params 的 JSON 对象,节点返回 JSON 结果或错误。
大多数开发者将其用于三件事:
- 查询状态 – 账户余额、代币持有量、交易详情和区块数据。
- 发送交易 – 序列化并提交已签名的指令。
- 订阅更新 – 账户变更、日志和插槽更新的实时通知。
如果您正在构建钱包、浏览器、交易机器人或任何需要实时 Solana 数据的 dApp,JSON-RPC 将是您使用的接口。
决策指南:公共端点与专用节点
在编写第一个请求之前,请决定哪种端点类型适合您的工作负载。该选择会影响可靠性、速率限制以及您需要管理的基础设施量。
| 工作负载 | 公共端点 | 专用节点 |
|---|---|---|
| 原型开发、黑客松 | ✅ 良好 | 过度 |
| 中等流量的生产 dApp | ⚠️ 可能但风险 | ✅ 推荐 |
| 高频交易、索引器 | ❌ 不适合 | ✅ 必需 |
大量 getProgramAccounts 调用 | ❌ 经常被限流 | ✅ 更好的隔离 |
| 大规模 WebSocket 订阅 | ⚠️ 连接有限 | ✅ 专用连接 |
公共端点免费且便于测试。OnFinality 提供公共 Solana 端点 https://solana.api.onfinality.io/public 和 WebSocket wss://solana.api.onfinality.io/public-ws。然而,公共端点是共享的,因此它们可能会限制或阻止大量使用。
专用节点为您提供私有 RPC 端点,具有自己的速率限制和资源。当您需要一致的性能、存档数据或自定义配置时,它们是正确的选择。OnFinality 提供专用 Solana 节点,您可以在几分钟内启动。有关详细信息,请参阅 RPC 定价 和 支持的网络。
如果您不确定,请从公共端点开始进行开发,然后在主网启动之前迁移到专用节点。
您将实际使用的 Solana JSON-RPC 方法
Solana 的 RPC 有数十种方法,但您可能只会使用一小部分。以下是最常见的方法,按用途分组。
账户和状态查询
getBalance– 返回公钥的 SOL 余额。getAccountInfo– 返回账户的数据、lamports、所有者以及可执行标志。getTokenAccountsByOwner– 列出钱包拥有的代币账户。getProgramAccounts– 获取程序拥有的所有账户(常用于索引)。
交易和区块数据
getTransaction– 通过签名检索交易,可选解析 JSON。getBlock– 返回区块的交易和元数据。getLatestBlockhash– 获取当前区块哈希,您需要它来签署交易。sendTransaction– 向集群提交已签名的交易。
网络和集群信息
getVersion– 返回节点的软件版本。getSlot– 获取当前插槽号。getEpochInfo– 返回 epoch 和插槽详细信息。
WebSocket 订阅
accountSubscribe– 当账户数据更改时通知。logsSubscribe– 流式传输程序或交易的日志。slotSubscribe– 在新插槽时通知。
连接到 Solana RPC 端点
您可以使用任何 HTTP 客户端调用 Solana JSON-RPC。以下是一个基本的 curl 示例,用于获取最新的区块哈希:
curl https://solana.api.onfinality.io/public \
-X POST \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"id": 1,
"method": "getLatestBlockhash",
"params": []
}'
响应:
{
"jsonrpc": "2.0",
"result": {
"context": {
"slot": 123456789
},
"value": {
"blockhash": "5xYk...",
"lastValidBlockHeight": 123456789
}
},
"id": 1
}
对于 JavaScript,您可以使用官方的 @solana/web3.js 库,它封装了 RPC 调用。以下是如何连接并获取余额:
import { Connection, PublicKey } from '@solana/web3.js';
const connection = new Connection('https://solana.api.onfinality.io/public');
const publicKey = new PublicKey('YourPublicKeyHere');
const balance = await connection.getBalance(publicKey);
console.log('Balance in lamports:', balance);
对于 WebSocket 订阅,您可以使用 Connection 对象的订阅方法:
const subscriptionId = connection.onAccountChange(publicKey, (accountInfo) => {
console.log('Account updated:', accountInfo);
});
常见的 JSON-RPC 错误及修复方法
Solana RPC 错误可能令人费解。以下是最常见的错误及其含义。
| 错误 | 原因 | 修复 |
|---|---|---|
-32002: Transaction simulation failed | 交易如果执行将会失败 | 检查日志,使用 preflightCommitment 模拟 |
-32003: Transaction precompile verification failure | 无效的程序或指令 | 验证程序 ID 和指令数据 |
-32004: Transaction signature verification failure | 签名无效 | 确保您使用正确的密钥对签名 |
-32005: Blockhash not found | 区块哈希过期或无效 | 获取新的区块哈希并重试 |
-32007: Transaction expired | 交易未及时确认 | 增加 maxRetries 或使用更新的区块哈希 |
-32602: Invalid params | 参数格式错误 | 检查方法预期的参数类型 |
调试技巧
- 始终先模拟:在发送之前使用
simulateTransaction捕获错误,而无需花费费用。 - 检查承诺级别:对于关键操作使用
confirmed或finalized。 - 使用浏览器:将交易签名粘贴到 Solana Explorer 以查看详细日志。
- 启用日志:对于程序错误,订阅日志或使用
encoding: "jsonParsed"的getTransaction。
Solana RPC 生产就绪检查清单
当您迁移到生产环境时,请验证以下几点以避免停机。
- 使用专用端点 – 公共端点对于生产环境不可靠。
- 设置故障转移 – 有一个备用端点以防主端点失败。
- 监控速率限制 – 跟踪您的使用情况并为峰值做好计划。
- 处理 WebSocket 重连 – 实现自动重连逻辑。
- 使用带重试的
getLatestBlockhash– 区块哈希很快过期。 - 选择正确的承诺级别 – 对于大多数应用,
confirmed是一个好的默认值。 - 需要存档数据? – 如果您需要历史状态,请确保您的提供商支持存档节点。
关键要点
- Solana JSON-RPC 是在 Solana 上读写数据的标准 API。
- 公共端点适合开发,但生产应用应使用专用节点。
- 学习核心方法:
getBalance、getAccountInfo、sendTransaction和getLatestBlockhash。 - 使用 WebSocket 订阅获取实时更新。
- 通过模拟交易和检查承诺级别来调试常见错误。
常见问题解答
Solana 上的 JSON-RPC 和 gRPC 有什么区别?
JSON-RPC 是标准的 HTTP/WebSocket API,而 gRPC 是一种用于流式数据的更新、更高效的协议。大多数应用程序使用 JSON-RPC;gRPC 用于高吞吐量索引器。
如何获取 Solana RPC 端点?
您可以使用公共端点,如 https://solana.api.onfinality.io/public,或通过 OnFinality 等提供商创建专用节点。有关选项,请参阅 Solana 网络页面。
使用的最佳承诺级别是什么?
对于大多数用例,confirmed 是速度和可靠性之间的良好平衡。仅在需要绝对确定性时使用 finalized。
我可以将 WebSocket 与 Solana RPC 一起使用吗?
是的,Solana 支持 WebSocket 订阅以获取实时更新。使用 wss:// 端点和诸如 accountSubscribe 之类的方法。
如何处理公共端点上的速率限制?
公共端点有限制。对于生产环境,请使用专用节点或提供更高限制的提供商。OnFinality 的 RPC 定价 页面有详细信息。
什么是区块哈希,为什么它会过期?
区块哈希是防止重放攻击的近期哈希。它在几个插槽后过期,因此您必须在每笔交易之前获取新的哈希。
如何调试失败的交易?
使用 simulateTransaction 在不发送的情况下查看错误。还可以通过浏览器或使用 encoding: "jsonParsed" 的 getTransaction 检查交易日志。
什么是 getProgramAccounts,为什么它很慢?
getProgramAccounts 返回程序拥有的所有账户。它可能很慢且资源密集,因此请谨慎使用,并考虑索引替代方案。
如何在共享节点和专用节点之间选择?
共享节点更便宜但有速率限制。专用节点提供更好的性能和隔离。评估您的流量和可靠性需求。
我在哪里可以找到 Solana RPC 文档?
官方 Solana 文档是一个好的开始。有关提供商特定的详细信息,请查看 OnFinality 的 Solana 网络页面。