摘要
Solana 节点 API 是一个 JSON-RPC 接口,允许应用程序读取网络状态、发送交易并订阅实时更新。本指南涵盖集群端点、请求格式、承诺级别和常见故障模式,以便您能够可靠地连接到 Solana 主网或开发网。
快速决策指南:您应该使用哪个 Solana 端点?
在编写任何代码之前,请决定哪个 Solana 集群和访问模式适合您的工作负载。答案取决于您是在构建生产应用、运行 QA 流水线,还是仅在本地进行原型开发。
| 工作负载 | 推荐端点 | 原因 |
|---|---|---|
| 本地开发 | http://localhost:8899 (solana-test-validator) | 快速迭代、明确的速率限制、完全控制 |
| 在 devnet 上原型开发 | 公共 devnet 端点或托管 devnet RPC | 从水龙头获取免费 SOL,共享基础设施适合低流量 |
| 生产主网应用 | 托管 RPC 提供商或专用节点 | 公共端点有速率限制,不适合生产环境 |
| 高吞吐量或重型方法(getProgramAccounts) | 专用节点或具有专用容量的托管提供商 | 避免 429 错误并提供一致的性能 |
如果您刚刚开始,请使用托管 RPC 提供商(如 OnFinality 的 Solana API)来获得稳定的端点,而无需运行自己的节点。对于生产环境,请评估专用节点选项以避免共享速率限制。
什么是 Solana 节点 API?
Solana 节点 API 是一个 JSON-RPC 2.0 接口,封装了验证器内部功能。它允许您读取账户状态、发送交易、模拟执行以及通过 WebSocket 订阅实时更新。大多数请求是带有 JSON 主体的 HTTP POST,响应是 JSON 对象。
与其他一些链不同,Solana 的 API 不兼容以太坊。您使用 getAccountInfo、getBalance、sendTransaction 和 getLatestBlockhash 等方法,而不是 eth_getBalance 或 eth_sendRawTransaction。这意味着您的工具和 SDK 必须支持 Solana。
Solana 集群和公共端点
Solana 有三个公共集群:主网、开发网和测试网。每个都有公共端点,但这些是共享基础设施,不适用于生产流量。官方文档警告说,公共端点可能返回 429(速率限制)或 403(被阻止)当过度使用时。
| 集群 | 公共端点 | 用例 |
|---|---|---|
| 主网 | https://api.mainnet.solana.com | 具有真实 SOL 的生产网络 |
| 开发网 | https://api.devnet.solana.com | 开发者测试,从水龙头获取免费 SOL |
| 测试网 | https://api.testnet.solana.com | 验证器测试 |
对于生产环境,您应该使用托管 RPC 提供商或运行自己的节点。OnFinality 在 https://solana.api.onfinality.io/public 提供公共 Solana 端点,并在 wss://solana.api.onfinality.io/public-ws 提供 WebSocket 端点。这些适用于开发和轻度生产使用,但对于重负载,请考虑 专用节点。
发起您的第一个 Solana RPC 调用
Solana RPC 使用 JSON-RPC 2.0。以下是一个基本的 curl 示例,用于获取当前 slot:
curl https://solana.api.onfinality.io/public \
-X POST \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"getSlot"}'
响应如下:
{"jsonrpc":"2.0","result":123456789,"id":1}
大多数方法需要参数。例如,要获取账户余额:
curl https://solana.api.onfinality.io/public \
-X POST \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"getBalance","params":["GgPpTKg78vmzgvPmNsDnN7hKs4q5WzJfPmZ3gY7hKJpX"]}'
将地址替换为真实的 Solana 公钥。
理解承诺级别
Solana RPC 方法接受 commitment 参数,该参数控制节点返回数据前区块必须被最终确认的程度。这对于应用程序的一致性至关重要。
| 承诺级别 | 描述 | 用例 |
|---|---|---|
processed | 节点最近处理的区块。可能被回滚。 | 实时监控,但不适合金融交易 |
confirmed | 由超级多数权益投票的区块。 | 大多数应用程序使用此级别作为速度和安全性之间的平衡 |
finalized | 区块已最终确定,具有最大锁定。 | 高价值交易,不可逆性不可接受 |
例如,要获取具有 confirmed 承诺级别的余额:
curl https://solana.api.onfinality.io/public \
-X POST \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"getBalance","params":["GgPpTKg78vmzgvPmNsDnN7hKs4q5WzJfPmZ3gY7hKJpX",{"commitment":"confirmed"}]}'
使用 WebSocket 订阅
对于实时更新,Solana 提供 WebSocket 订阅。您可以订阅账户变更、程序更新、slot 变更等。以下是使用 wscat 的示例:
wscat -c wss://solana.api.onfinality.io/public-ws
然后发送订阅请求:
{"jsonrpc":"2.0","id":1,"method":"accountSubscribe","params":["GgPpTKg78vmzgvPmNsDnN7hKs4q5WzJfPmZ3gY7hKJpX",{"commitment":"confirmed"}]}
您将收到一个订阅 ID,然后随着账户变更收到通知。
您将使用的常见 Solana RPC 方法
以下是最常用的 HTTP 方法:
| 类别 | 方法 |
|---|---|
| 账户 | getAccountInfo, getBalance, getMultipleAccounts |
| 交易 | sendTransaction, simulateTransaction, getTransaction, getSignatureStatuses |
| 区块 | getBlock, getBlocks, getBlockHeight |
| 程序 | getProgramAccounts |
| 集群 | getSlot, getEpochInfo, getHealth, getVersion |
| 代币 | getTokenAccountBalance, getTokenSupply |
有关完整列表,请参阅 Solana RPC HTTP 方法 参考。
调试常见的 Solana RPC 错误
当您的调用失败时,错误消息通常会告诉您需要修复什么。以下是常见问题:
| 错误 | 可能原因 | 修复 |
|---|---|---|
429 Too Many Requests | 您超出了共享端点上的速率限制 | 使用具有更高限制的托管提供商或专用节点 |
403 Forbidden | 端点阻止了您的 IP 或流量模式 | 检查您的请求量并考虑使用私有端点 |
-32602 Invalid params | 缺少或格式错误的参数 | 验证方法签名和参数顺序 |
-32005 Node is unhealthy | 节点落后或正在同步 | 等待并重试,或切换到健康的端点 |
Transaction simulation failed | 交易在链上会失败 | 在发送前使用 simulateTransaction 进行调试 |
对于交易失败,始终先模拟:
curl https://solana.api.onfinality.io/public \
-X POST \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"simulateTransaction","params":["base58-encoded-tx"]}'
使用 JavaScript 构建:使用 @solana/web3.js
与 Solana 交互的最常见方式是使用 @solana/web3.js 库。以下是最小示例:
import { Connection, PublicKey } from '@solana/web3.js';
const connection = new Connection('https://solana.api.onfinality.io/public', 'confirmed');
const address = new PublicKey('GgPpTKg78vmzgvPmNsDnN7hKs4q5WzJfPmZ3gY7hKJpX');
const balance = await connection.getBalance(address);
console.log('Balance:', balance / 1e9, 'SOL');
对于 JS 中的 WebSocket 订阅,使用 connection.onAccountChange:
connection.onAccountChange(address, (accountInfo) => {
console.log('Account changed:', accountInfo);
});
何时使用专用 Solana 节点
如果您的应用程序依赖重型方法(如 getProgramAccounts,可能代价高昂)或需要一致的低延迟,共享公共端点可能不够。专用节点为您提供:
- 不受其他用户速率限制的影响
- 重型查询的一致性能
- 对节点配置的完全控制
- 如果需要,可访问归档数据
OnFinality 提供 专用 Solana 节点,您可以在几分钟内部署。您还可以比较 Solana RPC 提供商 以了解权衡。
关键要点
- Solana 的节点 API 是基于 HTTP 和 WebSocket 的 JSON-RPC 2.0,具有 Solana 特定的方法。
- 公共端点适合开发,但不适合生产流量。
- 承诺级别(
processed、confirmed、finalized)控制数据一致性。 - 在发送交易前使用
simulateTransaction调试交易失败。 - 对于生产环境,考虑使用托管 RPC 提供商或专用节点以避免速率限制并确保可靠性。
常见问题解答
Solana RPC 和 Solana 节点 API 有什么区别?
它们指的是同一件事:允许您与 Solana 节点交互的 JSON-RPC 接口。这两个术语可以互换使用。
我可以在 Solana 上使用以太坊 RPC 方法吗?
不可以。Solana 使用自己的一套方法。您需要 Solana 特定的 SDK 和工具。
如何为 devnet 获取免费 SOL?
使用 Solana 水龙头 https://faucet.solana.com 请求 devnet SOL。
避免 429 错误的最佳方法是什么?
使用具有更高速率限制的托管 RPC 提供商或专用节点。公共端点是共享的,容易被限流。
OnFinality 是否支持 Solana WebSocket?
是的,OnFinality 在 wss://solana.api.onfinality.io/public-ws 提供 WebSocket 端点用于订阅。
有关支持的网络和定价的更多详细信息,请参阅 支持的 RPC 网络 和 RPC 定价。