Solana RPC 节点:设置、供应商与最佳实践
Complete guide to Solana RPC nodes. Learn how they work, compare top providers like Helius and QuickNode, and fix rate limit errors for production dAp...
Solana RPC 节点提供了应用程序用于与网络通信的读取、提交和订阅接口。供应商的功能、限制、定价、硬件要求和性能数据会随着时间的推移而变化,因此生产决策应根据当前的文档和工作负载测试进行验证。
最近更新:2025年7月
Solana 的公共端点对于开发可能很有用,但不是通用的生产服务保证。如果 dApp 返回 429 错误、账户查询停滞或在负载下出现提交问题,则其 RPC 路径是需要调查的一个组成部分,同时还需检查交易构建、费用、交割、网络和集群状况。
本指南涵盖了什么是 Solana RPC 节点、它与验证者节点的区别、请求如何流经系统、从哪里获取公共端点 URL、哪些 RPC 方法最重要、如何通过 @solana/web3.js 进行连接、哪些托管供应商值得评估、自行托管的实际要求,以及如何修复您可能已经看到的速率限制错误。
摘要: 对于开发,请使用免费的 Solana 基金会公共端点。对于生产环境,请使用托管供应商,如 Helius、QuickNode、Alchemy 或 Triton One。自行托管提供更多的操作控制权,但仍需要容量规划、访问策略、监控和最新的硬件指导。
跳转至:
- 什么是 Solana RPC 节点?
- RPC 节点与验证者节点对比
- Solana RPC 节点的工作原理
- Solana RPC 节点的类型
- 为什么 RPC 节点质量很重要:DeFi、NFT 和 dApp 性能
- 最佳 Solana RPC 节点供应商
- 使用 @solana/web3.js 连接您的应用
- Solana RPC 方法:您可以查询的内容
- 如何运行您自己的 Solana RPC 节点
- 常见的 Solana RPC 错误及修复方法
- 常见问题解答
- 选择正确的 Solana RPC 策略
什么是 Solana RPC 节点?
Solana RPC 节点是实现 Solana JSON-RPC API 的服务器,负责接收来自客户端应用程序的请求并返回区块链状态数据。dApp、钱包、区块浏览器和自动化脚本使用这些节点来读取账户余额、提交交易并订阅链上事件,而无需维护账本的本地副本。
历史资料引用了接近 65,000 TPS 的理论 Solana 吞吐量和接近 400 毫秒的目标插槽(slot)持续时间。这两者都不是保证的实时结果:交易定义、跳过的插槽、投票流量、工作负载、集群状况和软件版本都会影响观察到的性能。目标节奏和账户状态量仍对 RPC 基础设施提出了巨大需求。
远程过程调用 (RPC) 是一种通信模式,其中一台机器上的程序调用另一台机器上的函数,就像在本地调用一样,网络复杂性被抽象掉了。您的 dApp 可以针对远程节点查询账户状态和提交交易,而不是维护自己的账本副本。Solana 使用 JSON-RPC 2.0 作为其线路协议:这是一种轻量级格式,通过 HTTP 或 WebSocket 按方法名称路由调用,而不是像 REST API 那样通过基于资源的 URL 路径。
Solana 基金会在 https://api.mainnet-beta.solana.com 以及 devnet 和 testnet 的等效 URL 运行免费的公共端点。这些端点对每个 IP 地址实施速率限制。当您的应用程序超过这些限制时,它会收到 HTTP 429 Too Many Requests 错误,导致在高负载下出现间歇性故障和用户体验下降。
RPC 节点 vs. 验证者节点:了解差异
RPC 节点通过 JSON-RPC API 向外部客户端提供区块链数据。验证者节点参与共识并对区块有效性进行投票。这是 Solana 上的两种主要节点类型,它们有着不同的用途。
| 属性 | RPC 节点 | 验证者节点 |
|---|---|---|
| 主要角色 | 通过 JSON-RPC API 向外部客户端提供区块链数据 | 参与 Tower BFT 共识;在每个插槽对区块有效性进行投票 |
| 共识参与 | 无 | 是 —— 在每个插槽投票 |
| 质押 / 奖励 | 无需质押;无区块奖励 | 需要质押 SOL;赚取 SOL 质押奖励 |
| RAM 内存要求 | 最低 256 GB(保存完整账户状态以用于查询响应) | 较低的 RAM;优先考虑低延迟网络以进行投票 |
| 访问方式 | 通过 HTTP 或 WebSocket 端点 URL | 通过投票账户公钥识别 |
验证者节点参与 Tower BFT 共识,这是一种基于权益证明(PoS)的投票机制。历史证明 (PoH) 是 Solana 的加密排序机制(而非其共识协议),它在投票投出前建立排序。Tower BFT 是共识层;PoH 处理计时。
Gulf Stream 是 Solana 的交易转发协议,它将交易直接发送给当前和即将到来的领导者节点,绕过了其他区块链使用的内存池。验证者处理此转发过程,而 RPC 节点则不处理。
运行 RPC 节点不需要质押 SOL。一些运营商在同一台物理机器上运行验证者和 RPC 功能,但这两个角色在逻辑上保持独立:一个在共识中投票,另一个为客户端查询提供服务。对于自行托管 RPC 节点所涉及的硬件要求,RAM 和存储需求大大高于仅作为验证者的要求。
Solana RPC 节点如何工作:架构与数据流
Solana RPC 节点维护账本和账户状态的本地副本,并将该数据提供给任何发送有效 JSON-RPC 请求的客户端。
JSON-RPC 请求生命周期
- 客户端应用程序(dApp、钱包或脚本)向 RPC 节点的端点 URL 发送 HTTP POST 请求或 WebSocket 消息。
- 请求体包含一个具有四个字段的 JSON-RPC 2.0 负载:
jsonrpc、id、method、params。 - RPC 节点接收请求并根据
method字段将其路由到适当的内部处理程序。 - 节点在其本地账本副本或账户状态存储中查询所请求的数据。
- 节点返回一个 JSON 编码的响应,其中包含请求的数据或结构化的错误对象。
一个具体的 getBalance 示例:
// 请求
{
"jsonrpc": "2.0",
"id": 1,
"method": "getBalance",
"params": ["YourPublicKeyBase58Here", {"commitment": "confirmed
}// 响应
{
"jsonrpc": "2.0",
"result": {
"context": {"slot": 285823400},
"value": 5000000000
},
"id": 1
}
// 注意:value 的单位是 lamports。除以 1,000,000,000 可转换为 SOL。与使用基于资源的 URL 的 REST API 不同,JSON-RPC 使用 method 字段通过单一端点路由每次调用。具有以太坊经验的开发人员会识别出这种请求结构。Solana 在三个关键方面有所不同:没有内存池(交易直接发送给当前的领导者)、状态存在于账户中而不是 EVM 合约存储中,以及 400 毫秒的插槽比以太坊 12 秒的区块时间快大约 30 倍。
承诺级别(Commitment Levels):processed, confirmed, finalized
每个读取状态的 RPC 调用都接受一个 commitment 参数:
processed:节点看到的最新插槽。速度最快,但在理论上该插槽可能会被回滚。confirmed:该插槽已获得绝大多数验证者的投票。对于大多数 dApp 用例来说,具有很强的最终性。finalized:该插槽永久成为链的一部分。用于高风险操作。
Solana RPC 节点存储的内容
节点持有两类数据。当前账户状态驻留在 RAM 中:即最新确认插槽中每个活跃账户的快照,这是快速查询响应所必需的。历史账本数据驻留在 NVMe SSD 上:所有按插槽组织的交易记录。Solana 在主网 (mainnet-beta) 上每天累积大约 100 到 200 GB 的账本数据。存储量的增长,加上 400 毫秒的插槽时间,解释了为什么 RPC 节点至少需要 256 GB 的 RAM 和数个 TB 的高速存储。
有关完整的 Solana JSON-RPC API 参考,请参阅 docs.solana.com/api.
HTTP 与 WebSocket:选择合适的传输协议
| 传输协议 | 模型 | 典型用途 | 示例方法 |
|---|---|---|---|
| HTTP / HTTPS | 请求-响应(无状态,拉取) | 一次性查询、交易提交 | getBalance, getAccountInfo, sendTransaction |
| WebSocket / WSS | 持久连接(有状态,推送) | 实时事件订阅 | accountSubscribe, logsSubscribe, signatureSubscribe |
Solana RPC 节点类型:公共、私有和自托管
访问 Solana RPC 节点有三种方式:通过 Solana 基金会的免费公共端点、通过托管的私有提供商,或通过您直接运营的自托管节点。
| 类型 | 运营商 | 成本 | 频率限制 (Rate Limits) | 服务目标 | 典型用途 |
|---|---|---|---|---|---|
| 公共端点 | Solana 基金会 | 免费 | 是(按 IP 执行) | 无 | 开发与测试 |
| 托管提供商 | Helius, QuickNode, Alchemy, Triton One | 提供付费层级 | 付费方案限制更高或无限制 | 有(付费方案) | 生产级 dApp |
| 自托管 | 您自己 | 硬件 + 运营成本 | 无(由您控制) | 由您定义 | 大型协议、交易所 |
公共 Solana RPC 端点(免费)
Solana 基金会运营着四个公共 RPC 端点,每个网络集群一个。所有端点均免费,但会针对每个 IP 地址执行频率限制。
| 集群 | HTTP 端点 URL | WebSocket 端点 URL | 使用场景 |
|---|---|---|---|
| mainnet-beta | https://api.mainnet-beta.solana.com | wss://api.mainnet-beta.solana.com | 生产网络(“beta”标签是历史遗留;这是 Solana 的实时主网) |
| devnet | https://api.devnet.solana.com | wss://api.devnet.solana.com | 开发与测试;可获取免费 SOL 空投 |
| testnet | https://api.testnet.solana.com | wss://api.testnet.solana.com | 预生产压力测试 |
| localnet | http://localhost:8899 | ws://localhost:8900 | 本地开发;由 solana-test-validator 生成(非官方公共集群) |
公共端点执行每 10 秒每个 IP 地址约 100 个请求的频率限制。超过此阈值将返回 HTTP 429 Too Many Requests。这些端点适用于开发和测试。对于生产用途,请参阅下方的 Solana RPC 提供商对比。
有关完整的集群文档,请参阅 docs.solana.com/clusters.
私有及托管 RPC 节点提供商
托管 RPC 提供商可能会提供专用端点、更高的发布限制、WebSocket 支持、服务目标和多个地区;确切的功能取决于当前的方案。Solana 的四个主要提供商:
- Helius:Solana 原生提供商,具有增强的 RPC API 和 Webhook 通知功能
- QuickNode:多链提供商,具有地理分布和附加组件市场
- Alchemy:多链提供商,具有企业级开发工具
- Triton One:Solana 原生专家,专注于机构工作负载的原始 RPC 性能
定价、WebSocket 支持和差异化优势的全面对比请见提供商对比章节。
自托管 Solana RPC 节点
自托管让您能够完全控制 RPC 基础设施且无频率限制,但硬件成本起价数千美元,且持续的运维工作非常繁重。完整要求和设置概览请见《如何运行您自己的 Solana RPC 节点》。
为什么 RPC 节点质量至关重要:DeFi、NFT 和 dApp 性能
RPC 节点的质量直接决定了您的应用程序在生产环境下能否正常运行。以下四个使用场景使这一点更加具体。
DeFi 交易与套利下单机器人
Solana 上的 DeFi 协议处理对时间敏感的交易,延迟决定了结果。通过受频率限制的公共端点调用 getLatestBlockhash 和 sendTransaction 的交易机器人,在 429 超时期间面临区块哈希失效或交易被丢弃的风险。在 Solana 400 毫秒的插槽时间线上,50 毫秒的 RPC 响应时间差异就可以决定一笔交易是落入目标插槽还是完全错过它。
Jupiter (聚合器)、Raydium (AMM/DEX)、Drift (永续合约) 和 Marginfi (借贷) 都依赖于低延迟的 RPC 访问。与以太坊的 DeFi 不同,Solana 交易通过 Gulf Stream 完全跳过内存池,直接发送给当前的 Leader。如果您的 RPC 调用到达较晚,没有排序队列可以退而求其次。
NFT 铸造与市场监控
高需求的 NFT 铸造会产生来自竞争有限供应的买家的数百个并发 sendTransaction 调用爆发。上限约为每秒 10 个请求的公共端点在高峰投放期间会向大多数参与者返回 429 错误。Magic Eden 和 Tensor 等 NFT 市场使用 WebSocket logsSubscribe 订阅来实时检测铸造事件,这需要一个能够大规模处理稳定 WebSocket 连接的提供商。
钱包和投资组合仪表板
钱包应用程序为用户持有的每项资产调用 getBalance 和 getTokenAccountBalance,并调用 getAccountInfo 来读取链上元数据。一个服务于 10,000 名活跃用户的钱包每分钟可发出数万次 RPC 查询。具有足够 QPS(每秒查询数)能力的私有 RPC 提供商可以确保这些查询在不降低用户体验的情况下得到解析。这里的 QPS 指的是 RPC 请求吞吐量,而非 Solana 网络层级的交易吞吐量。
链上分析、索引器和交易所集成
分析平台和索引器重复调用 getBlock 以复制 Solana 账本的完整交易历史。完整的历史同步会按顺序发出数千个 getBlock 请求。自托管 RPC 节点或专用的企业级方案是可靠维持这一容量的唯一选择。运行自有 Solana RPC 节点的中心化交易所使用类似的高吞吐量模式来核对用户余额并大规模检测充值。
与以太坊约 12 秒的区块时间相比,Solana 400 毫秒的插槽时间意味着在同等操作下,Solana dApp 单位时间内查询 RPC 的频率大约高出 30 倍,这使得 RPC 节点性能在这里比大多数其他网络更为关键。如果您在生产流量下遇到频率限制,升级到私有 RPC 提供商是最直接的解决方法。
Solana RPC 节点提供商对比
对于大多数生产级 dApp,问题不在于是否使用托管 RPC 提供商,而在于哪一个适合您的工作负载。该表以 Solana 基金会的免费公共端点为基准,涵盖了四个主要选项。
| 供应商 | Solana 原生 | 免费套餐 | 付费套餐 (约) | 专用节点 | WebSocket | 区域 | 主要区别 |
|---|---|---|---|---|---|---|---|
| Helius | 是 | 是 | ~$49-$499/月 | 是 | 是 | 美国, 欧盟 | 增强型 API:Webhook、交易解析、NFT API |
| QuickNode | 否 (多链) | 是 (试用) | ~$49-$399/月 | 是 | 是 | 美国, 欧盟, 亚洲+ | 附加组件市场;广泛的多链覆盖 |
| Alchemy | 否 (多链) | 是 | ~$49-$399/月 | 是 | 是 | 美国, 欧盟 | 企业级开发者工具;Notify Webhook |
| Triton One | 是 | 否 | 定制/企业级 | 是 | 是 | 美国, 欧盟, 亚洲 | 机构级性能;联系获取价格 |
| Solana 基金会 (公共) | 是 | 免费 (有速率限制) | 不适用 | 否 | 是 (有速率限制) | 美国 | 仅用于开发和测试 |
表格中的定价信息在发布时是准确的。提供商的计划、定价和功能经常变化。在做出选择前,请直接在其网站上核实最新详情。
最后更新:2025 年 7 月
Helius 提供专注于 Solana 的 RPC 方法、Webhook 和交易解析功能。能力、配额、定价、区域和服务条款应直接在 helius.dev 上查看,并针对预期工作负载进行测试。
QuickNode 提供多链 RPC 基础设施、区域端点和可选的附加组件。请在 quicknode.com 上核实当前的 Solana 覆盖范围、配额、定价和服务条款,然后对所需的方法和区域进行基准测试。
Alchemy 提供包括 Solana 支持的多链开发者基础设施。在将其视为等同于其他提供商之前,请在 alchemy.com 上确认当前的方法覆盖范围、WebSocket 行为、限制、区域和定价。
Triton One 提供用于更高吞吐量工作负载的 Solana 基础设施。其延迟、可用性、地理覆盖范围、限制和商业条款需要直接在 triton.one 上验证,并进行工作负载特定测试。
GenesysGo 以前在 Shadow 品牌下运营 Solana RPC 服务。在评估之前,请在 genesysgo.com 上核实当前状态。
所有主要提供商都提供足以满足开发和测试需求的免费套餐或试用计划。当您的应用程序规模化服务真实用户时,速率限制才会成为生产环境中的问题。
如何评估 Solana RPC 提供商
合适的提供商取决于您的工作负载:
| 您的情况 | 评估起点 |
|---|---|
| 单独开发者或小型团队,预算有限 | Helius 免费套餐或 QuickNode 免费试用;达到速率限制时升级 |
| 仅在 Solana 上运行的生产 dApp | Helius (Solana 原生,增强型 API) 或 Triton One (如果 p99 延迟是首要关注点) |
| 多链团队 (Solana 加上以太坊或其他链) | QuickNode 或 Alchemy (两者都支持一个账户下的多条链) |
| 具有严格 SLA 要求的大型企业 | QuickNode (企业套餐) 或 Alchemy (企业声誉) |
| 高频 DeFi 协议或 MEV 操作 | Triton One (机构重点) 或自托管 RPC 节点 |
| 最大控制,无速率限制,大型 DevOps 团队 | 自托管 RPC 节点 (参见硬件要求和设置概述) |
提供商的延迟声明不可互换。p50 是中位数响应时间,而 p99 捕获了最慢的 1% 请求,这对于对时间敏感的操作可能很重要。实际结果取决于方法的组合、负载、地理邻近度、缓存和计划限制,因此在选择付费计划之前,请对预期请求模式进行基准测试。
使用 @solana/web3.js 将您的应用程序连接到 Solana RPC 节点
从 Solana 基金会的公共端点切换到私有提供商只需要更改应用程序中的一行:传递给 Connection 构造函数的 URL 字符串。
版本说明: 本节中的代码示例使用 @solana/web3.js v1.x,这是当前的生产标准。Solana Labs 正在开发 v2.0,其 API 有显著不同。如果您使用的是 v2.0,请参阅官方 v2.0 文档以获取等效方法。
安装和连接
第 1 步:安装包
npm install @solana/web3.js第 2 步:实例化连接并查询 余额
import { Connection, PublicKey, LAMPORTS_PER_SOL } from "@solana/web3.js";
// 从环境变量中获取端点 — 切勿硬编码私有 URL
const RPC_ENDPOINT = process.env.RPC_URL ?? "https://api.devnet.solana.com";
const connection = new Connection(RPC_ENDPOINT, "confirmed");
async function getWalletBalance(address: string): Promise<void> {
const publicKey = new PublicKey(address);
// getBalance 返回 lamports;除以 LAMPORTS_PER_SOL (10^9) 即可得到 SOL
const balanceLamports = await connection.getBalance(publicKey);
const balanceSOL = balanceLamports / LAMPORTS_PER_SOL;
console.log(`余额:${balanceSOL} SOL`);
}
**第 3 步:读取账户数据**
async function getAccountData(address: string): Promise<void> {
const publicKey = new PublicKey(address);
// 如果账户不存在,getAccountInfo 返回 null
const accountInfo = await connection.getAccountInfo(publicKey);
if (!accountInfo) {
console.log("未找到账户");
return;
}
console.log("所有者程序:", accountInfo.owner.toBase58());
console.log("数据长度 (字节):", accountInfo.data.length);
console.log("Lamports:", accountInfo.lamports);
}
**第 4 步:发送交易**
import {
Transaction,
SystemProgram,
Keypair,
sendAndConfirmTransaction,
} from "@solana/web3.js";
async function transferSOL(
sender: Keypair,
recipientAddress: string,
amountSOL: number
): Promise<string> {
const recipient = new PublicKey(recipientAddress);
const lamports = amountSOL * LAMPORTS_PER_SOL;
const transaction = new Transaction().add(
SystemProgram.transfer({
fromPubkey: sender.publicKey,
toPubkey: recipient,
lamports,
})
);
// sendAndConfirmTransaction 在解析前等待 "confirmed" 承诺
const signature = await sendAndConfirmTransaction(connection, transaction, [sender]);
return signature;
}
**第 5 步:配置基于环境的端点切换**
设置一个配置模块,通过环境变量切换集群,而不是修改应用程序代码:
// config/rpc.ts
const RPC_ENDPOINTS: Record<string, string> = {
"mainnet-beta": "https://api.mainnet-beta.solana.com",
"devnet": "https://api.devnet.solana.com",
"private": process.env.PRIVATE_RPC_URL ?? "",
};
const NETWORK = process.env.SOLANA_NETWORK ?? "devnet";
export const connection = new Connection(RPC_ENDPOINTS[NETWORK], "confirmed");安全提示: 切勿在客户端 JavaScript 中硬编码您的私有 RPC 端点 URL。暴露在浏览器中的 URL 会将您的 API 密钥泄露给检查网络流量的任何人。应通过服务器端代理或后端 API 路由来处理。
有关完整的 @solana/web3.js API 参考,请参阅 solana-labs.github.io/solana-web3.js.
HTTP 与 WebSocket RPC 连接:何时使用
| 场景 | 使用 HTTP | 使用 WebSocket |
|---|---|---|
| 仅一次获取钱包 余额 | 是 | 否 |
| 提交交易 | 是 | 否 |
| 监视账户的实时更改 | 否 | 是 |
| 实时流式传输某个程序的交易日志 | 否 | 是 |
| 跟踪特定签名的确认 | 否 | 是 |
WebSocket 连接使用 wss:// 而不是 https://。大多数托管提供商在同一计划下提供两种端点。
// WebSocket 订阅:实时监视账户更改
const publicKey = new PublicKey("YourAccountPublicKeyHere");
const connectionWithWS = new Connection(
process.env.RPC_URL ?? "https://api.devnet.solana.com",
{
commitment: "confirmed",
wsEndpoint: process.env.WSS_URL ?? "wss://api.devnet.solana.com",
}
);
// onAccountChange 返回一个订阅 ID,稍后用于清理工作
const subscriptionId = connectionWithWS.onAccountChange(
publicKey,
(accountInfo, context) => {
console.log("账户在 slot 发生变化:", context.slot);
console.log("新的 lamport 余额:", accountInfo.lamports);
},
"confirmed"
);
// 不再需要时移除订阅:
// connectionWithWS.removeAccountChangeListener(subscriptionId);处理速率限制和 429 错误
来自 Solana 公共端点的 429 Too Many Requests(请求过多)错误表示您的应用程序已超过每个 IP 的速率限制。有三种策略可以解决此问题:
- 切换到托管私有提供商。 Helius、QuickNode、Alchemy 和 Triton One 提供的方案规格足以应对生产流量。请参阅私有 Solana RPC 提供商对比。
- 实施指数退避。 收到 429 响应时,通过每次尝试都加倍的延迟进行重试(参见下方代码)。
- 使用
getMultipleAccounts批量读取账户。 在一次调用中获取 20 个账户仅消耗一个请求,而不是 20 个。
// 适用于任何 RPC 调用的指数退避封装器
async function withRetry<T>(
fn: () => Promise<T>,
maxRetries: number = 5
): Promise<T> {
let attempt = 0;
while (attempt < maxRetries) {
try {
return await fn();
} catch (error: any) {
const is429 = error?.message?.includes("429");
if (is429 && attempt < maxRetries - 1) {
// 等待 500 毫秒,然后 1 秒,2 秒,4 秒,最后 8 秒
const waitMs = 500 * Math.pow(2, attempt);
await new Promise((resolve) => setTimeout(resolve, waitMs));
attempt++;
} else {
throw error;
}
}
}
throw new Error("超过最大重试次数");
}Solana RPC 方法:您可以查询的内容
Solana 的 JSON-RPC API 公开了 80 多个方法。下表涵盖了大多数 dApp 开发者经常使用的方法。
HTTP RPC 方法
| 类别 | 方法 | 描述 | 常见用例 |
|---|---|---|---|
| 账户数据 | getAccountInfo | 返回存储在账户中的所有数据 | 读取程序拥有的账户状态 |
| 账户数据 | getBalance | 返回公钥的 SOL 余额(单位为 lamports) | 钱包余额显示 |
| 账户数据 | getTokenAccountBalance | 返回代币账户的 SPL 代币余额 | 代币钱包余额 |
| 账户数据 | getMultipleAccounts | 在一次调用中返回多个账户的数据 | 批量读取(减少速率限制风险) |
| 交易 | sendTransaction | 向网络提交已签名的交易 | 任何写入操作 |
| 交易 | simulateTransaction | 在不广播的情况下模拟交易 | 执行前校验 |
| 交易 | getTransaction | 通过签名返回已确认的交易详情 | 交易历史查询 |
| 区块 / Slot | getSlot | 返回当前的 Slot 高度 | 链进度监控 |
| 区块 / Slot | getLatestBlockhash | 返回最新的区块哈希和最后一个有效 Slot | 发送任何交易前必需 |
| 区块 / Slot | getBlock | 返回给定 Slot 中的所有交易 | 链上分析和索引 |
getRecentBlockhash 已被弃用。请改用 getLatestBlockhash。替代方法还会返回 lastValidBlockHeight,从而实现可靠的交易过期处理。
WebSocket 订阅方法
| 方法 | 功能 | 常见用例 |
|---|---|---|
accountSubscribe | 当特定账户发生变化时推送更新 | 实时余额监控 |
logsSubscribe | 流式传输匹配过滤器的交易日志 | DeFi 事件监控,NFT 铸造检测 |
signatureSubscribe | 当交易签名被确认时通知 | 交易确认跟踪 |
WebSocket 订阅适用于任何需要在无需轮询的情况下对链上事件做出反应的 dApp。accountSubscribe 在特定账户的数据发生变化时触发,可用于跟踪用户钱包或 Solana 程序(相当于以太坊上的智能合约)的状态账户。logsSubscribe 流式传输匹配程序 ID 过滤器的交易日志,被 Jupiter 和 Raydium 等 DeFi 协议用于实时检测交换事件。
Anchor 是最广泛使用的 Solana 程序开发框架,它生成的 TypeScript 客户端在底层通过 @solana/web3.js 调用这些方法。RPC 配置同样适用于基于 Anchor 的 dApp。
有关包含参数、返回类型和错误代码的完整方法参考,请参阅 Solana RPC API 文档.
如何运行您自己的 Solana RPC 节点:要求和设置概览
自托管 Solana RPC 节点可让您获得完全控制权、无速率限制以及最高的数据隐私。硬件投资达数千美元,且保持节点健康需要专门的 DevOps 能力。大型协议、交易所和具备现有基础设施能力的团队是此路径的目标受众。
硬件要求
| 组件 | 最低配置 | 生产环境推荐配置 |
|---|---|---|
| CPU | 12 核,3.5 GHz 或更高 | 24 核,高时钟频率 |
| RAM | 256 GB DDR4 ECC | 512 GB DDR4 ECC |
| 存储 | 2 TB NVMe SSD | 2x 2 TB NVMe SSD(独立的账本和账户卷) |
| 网络 | 1 Gbps 专用,低延迟 | 10 Gbps 专用 |
| 操作系统 | Ubuntu 20.04 LTS | Ubuntu 22.04 LTS |
硬件要求随网络增长而变化。在配置硬件之前,请对照 docs.solana.com/running-validator) 处的官方 Solana 文档验证当前规格。
Solana 的基于账户的模型将所有程序状态存储在单个账户中。全量 RPC 节点必须在 RAM 中保存每个活跃账户的当前账户状态以实现快速查询响应,并在 NVMe SSD 上保存历史账本数据。主网 beta 上每天 100 到 200 GB 的存储增长意味着操作员必须计划持续的账本轮转。
设置流程概览
需要七个阶段。每个步骤都链接到官方 Solana 文档以获取完整的配置详情。
- 准备硬件,使其达到或超过上述规格。
- 安装操作系统并配置 Linux 内核参数:提高 ulimit 文件描述符限制,并针对 Solana 的高 UDP 流量调节 sysctl 网络设置。
- 从官方 Solana Labs 发布渠道安装 Solana CLI 和
agave验证器二进制文件(原名为solana-validator)。 - 通过传递
--no-voting标志来禁用共识参与,从而将节点配置为 RPC 模式,并设置--rpc-port 8899(HTTP) 和--rpc-pubsub-port 8900(WebSocket)。 - 从 Solana 基金会的快照存储库下载快照,从最近的状态引导同步,而不是从创世区块开始回放。
- 启动节点并监控同步进度,使用
solana catchup跟踪节点落后于集群顶端的程度。 - 配置防火墙规则,仅向授权的 IP 地址开放 8899 和 8900 端口。不要在没有身份验证的情况下公开您的 RPC 端口。
同步时间和日常维护
在推荐硬件上,快照同步需要 1 到 3 天。从创世区块开始同步耗时明显更长,且不推荐这样做。
裸机成本通常为每月 500 至 1,500 美元,具体取决于规格和数据中心地理位置。由于存储密集型工作负载的虚拟化开销,云等效方案的成本更高。每天 100 到 200 GB 的存储增长迫使人们在预分配海量卷或自动化账本修剪之间做出选择。
对于评估“自建还是购买”决策的团队,在致力于硬件采购之前,请先在提供商对比章节中对比托管提供商的成本。
常见 Solana RPC 错误及修复方法
429 请求过多
您的应用程序已超过 Solana 公共端点对每个 IP 的速率限制。要解决此问题:
- 切换到托管私有供应商。 Helius、QuickNode、Alchemy 和 Triton One 提供针对生产流量规模的方案。请参阅私有 Solana RPC 供应商对比。
- 实施指数退避。 收到 429 响应时,以每次翻倍的延迟重试。速率限制处理章节中有代码示例。
- 使用
getMultipleAccounts批量读取账户。 在一次调用中获取 20 个账户仅消耗一个请求,而非 20 个。
交易确认超时
通过 sendTransaction 提交的交易未成功上链。Blockhash 可能已过期,或者网络可能已拥塞。要解决此问题:
- 在构建交易之前立即调用
getLatestBlockhash。不要使用getRecentBlockhash(已废弃)。 - 检查响应中的
lastValidBlockHeight,并在达到该高度之前重试。 - 使用
sendAndConfirmTransaction而不是原始的sendTransaction,以便在发生暂时性错误时自动重试。
getProgramAccounts 速率限制失败
getProgramAccounts 是最消耗资源的 RPC 调用之一。公共端点通常会因为其对共享基础设施造成的负载而限制或完全拒绝此类调用。如果您在这些调用中特别看到 403 或超时错误,请升级到明确支持大型程序账户查询的私有 RPC 供应商。
常见问题解答:Solana RPC 节点
什么是 Solana RPC 节点?
Solana RPC 节点是实现 Solana JSON-RPC API 的服务器,接受来自客户端应用程序的请求并返回区块链状态数据。dApp、钱包和区块浏览器使用它们来读取账户余额、获取交易历史记录以及向网络提交已签名的交易,而无需运行本地账本副本。
Solana RPC 节点和验证者节点有什么区别?
两者承担不同的角色。RPC 节点通过 JSON-RPC API 为外部客户端提供数据,不参与共识,也不赚取质押奖励。验证者节点在每个插槽(Slot)中对区块有效性进行投票,需要质押 SOL,并为正确的投票赚取 SOL 奖励。一些运营商在同一硬件上运行两者,但角色在逻辑上保持独立。
Solana 公共 RPC 端点是免费使用的吗?
是的。Solana 基金会在 api.mainnet-beta.solana.com、api.devnet.solana.com 和 api.testnet.solana.com 提供的公共端点是免费的。它们对每个 IP 地址执行约每 10 秒 100 个请求的速率限制。这些端点足以用于开发和测试,但不适用于为真实用户服务的生产级 dApp。
如何避免 Solana 公共 RPC 的速率限制?
三种方法协同工作:针对生产流量切换到托管私有 RPC 供应商;实施指数退避以增加等待间隔来重试失败的请求;以及将多个账户读取批量化为单个 getMultipleAccounts 调用,而不是为每个账户发出一个 getAccountInfo。
最低要求:12 核 CPU、256 GB DDR4 RAM、2 TB NVMe SSD 和 1 Gbps 专用网络连接。生产环境建议:24 核 CPU、512 GB RAM、2x 2 TB NVMe SSD 和 10 Gbps 网络。请对照 Solana 验证者文档,) 验证当前规格,因为要求会随着网络增长而增加。
同步一个 Solana RPC 节点需要多长时间?
在推荐硬件上使用最近的快照,预计需要 1 到 3 天。从创世区块(Genesis)开始同步需要相当长的时间。Solana 基金会提供官方快照以加速该过程。
Solana 上 HTTP 和 WebSocket RPC 连接有什么区别?
HTTP RPC 使用无状态的请求-响应模型。您的应用程序发送一个请求并接收一个响应,适用于 getBalance 或 sendTransaction 等一次性查询。WebSocket RPC 使用带有订阅模型的持久连接。您的应用程序订阅链上事件,并在这些事件发生时接收推送通知。对于 dApp 中的任何实时功能,请使用 WebSocket。
生产级 dApp 应该如何评估 Solana RPC 供应商?
Helius 和 QuickNode 是两个经常被讨论的选项,但社区知名度并不代表其适用性或性能。Helius 适合专门在 Solana 上构建且需要 Solana 原生增强型 API 的团队。QuickNode 适合在一个账户下支持多个区块链的团队。Triton One 是追求 p99 延迟为主要约束的机构级工作负载的首选。正确的选择取决于您的工作负载,以及 Solana 特定功能或多链支持哪个更重要。
相关 Solana 指南
在 Bybit 探索 SOL
读者可以查看 当前 SOL 市场信息) 或 SOL/USDT 现货市场.)。这些链接提供市场信息和访问权限;它们不验证技术主张,也不暗示 SOL 适合每一位读者。
为您的使用场景选择合适的 Solana RPC 策略
存在三条路径,大多数团队会立即识别出哪一条适合他们当前的阶段。
| 情况 | 路径 |
|---|---|
| 本地构建或测试 | 使用 Solana 基金会在 devnet 或 testnet 上的免费公共端点 |
| 为用户提供服务的生产级 dApp | 根据您的工作负载使用托管私有供应商:Helius、QuickNode、Alchemy 或 Triton One |
| 具有 DevOps 能力的大型协议、交易所或团队 | 评估自托管:完全控制,无速率限制,但有显著的硬件和运营成本 |
RPC 的可靠性会影响应用程序的读取和交易提交,但目标插槽持续时间并不是确认保证,RPC 延迟只是交易是否上链的一个因素。选择与您当前规模匹配的级别,并计划在速率限制成为面向用户的问题之前进行升级。
后续步骤:
- 注册免费开发层级:helius.dev 或 quicknode.com
- 查看完整的 Solana JSON-RPC 方法参考:docs.solana.com/api
- 在为自托管配置资源之前查看硬件规格:如何运行您自己的 Solana RPC 节点