摘要
Solana 质押集成不是单个 API 调用。你需要结合 RPC 访问来读取质押账户和提交交易、质押程序接口(原生质押或流动性质押协议)以及钱包或签名器层。RPC 端点是基础,因为每个质押、委托、停用和提取操作都是 Solana 交易,必须通过 RPC 节点构建、模拟和确认。
本文梳理了你实际需要的 API 表面,展示了如何通过 JSON-RPC 读取和构建质押交易,并解释了如何选择 RPC 提供商,以便随着用户群增长保持质押流程的响应性。OnFinality 提供 Solana RPC 和专用节点基础设施,你可以将质押集成指向它们。
从钱包 UI 看,Solana 质押似乎很简单:选择验证者、输入金额、确认。但在底层,它是一系列针对 Solana 质押程序的链上交易,而每一笔交易都必须通过 RPC 节点构建、模拟、签名和确认。所以,对于“哪个 API 集成 Solana 质押”这个问题,诚实的答案是:没有单一的质押 API。它是一组 API 的堆栈,而 RPC 层是你无法跳过的一层。
本页将该堆栈分解为各个部分,展示你最常调用的 JSON-RPC 方法,并为你提供一种决定基于哪个提供商构建的方法。
你实际需要哪一层?
在选择提供商之前,先确定你正在构建哪种类型的质押集成。API 表面会因答案不同而有很大差异。
- 原生质押(你自己的 UI): 你自己构建并提交质押程序指令。你需要完整的 RPC 访问权限以及一个签名器。这给你最大的控制权,也带来最大的责任。
- 流动性质押协议集成: 你调用协议的 program 或 SDK,它会铸造一个收据代币。你仍然需要 RPC 来读取状态和提交交易,但质押逻辑存在于协议中。
- 托管或管理型质押: 提供商处理密钥和委托。你集成他们的 API,但你仍然应该了解 RPC 层以进行监控和对账。
如果你正在构建原生质押,你的 RPC 提供商实际上是你产品的一部分。如果你正在集成流动性质押协议,你的 RPC 提供商是你的可靠性层。无论哪种方式,下一节都是相同的。
每个质押操作背后的 RPC 方法
Solana 的 JSON-RPC API 是你读取质押状态和推送交易的方式。以下方法涵盖了核心质押工作流。
| 任务 | JSON-RPC 方法 | 说明 |
|---|---|---|
| 读取质押账户 | getAccountInfo | 解码质押账户状态(已委托、激活中、活跃、停用中) |
| 列出钱包的质押账户 | getProgramAccounts | 按质押程序和所有者过滤;可能很重,因此要严格限定过滤器范围 |
| 获取最新区块哈希 | getLatestBlockhash | 你构建的每笔交易都需要 |
| 发送前模拟 | simulateTransaction | 在花费费用之前捕获指令错误 |
| 提交交易 | sendTransaction | 返回一个签名,然后你确认它 |
| 确认交易 | getSignatureStatuses 或 getTransaction | 轮询直到在你选择的 commitment 级别确认 |
| 检查 epoch 和时间 | getEpochInfo | 质押激活和停用受 epoch 限制 |
| 读取验证者信息 | getVoteAccounts | 发现验证者及其当前质押量 |
典型的读取路径如下所示:
curl https://solana.api.onfinality.io/public \
-X POST -H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"id": 1,
"method": "getEpochInfo",
"params": []
}'
交易提交如下所示:
curl https://solana.api.onfinality.io/public \
-X POST -H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"id": 1,
"method": "sendTransaction",
"params": ["<base64-signed-transaction>", {"encoding": "base64", "skipPreflight": false}]
}'
在 JavaScript 中,你通常会使用 @solana/web3.js 并让库处理编码:
import { Connection, PublicKey, Transaction } from "@solana/web3.js";
const connection = new Connection("https://solana.api.onfinality.io/public", "confirmed");
// Read the current epoch before building a stake or deactivate instruction
const epoch = await connection.getEpochInfo();
console.log("Current epoch:", epoch.epoch);
// Simulate before sending to surface instruction errors early
const sim = await connection.simulateTransaction(transaction);
if (sim.value.err) {
throw new Error("Simulation failed: " + JSON.stringify(sim.value.err));
}
const signature = await connection.sendTransaction(transaction, [signer]);
await connection.confirmTransaction(signature, "confirmed");
注意,这些都不是质押特有的。质押只是你通过这些通用方法组装和发送的一组指令。这就是为什么你的 RPC 端点质量比任何单一的“质押 API”都更重要。
你将基于其构建的质押程序接口
一旦你可以通过 RPC 读写,你就需要实际的质押指令。主要有两条路径。
原生质押程序。 Solana 内置的质押程序暴露了用于创建质押账户、委托给验证者、停用和提取的指令。你在客户端构建这些指令,并像任何其他交易一样提交它们。这是最直接的集成,让你完全控制用户体验、费用和账户管理。
流动性质押协议。 这些协议将原生质押包装在自己的程序和 SDK 后面。你调用它们的指令,作为回报,你的用户会收到一个可转让的收据代币。权衡是你继承了协议的智能合约风险和费用模型,但避免了自己管理质押账户。
对于大多数团队来说,决定是:如果质押是你的产品,就构建原生质押;如果质押是更大产品中的一个功能,就集成流动性质押协议。
为质押工作负载选择 RPC 提供商
质押流程有特定的流量模式。读取频繁且突发(仪表板、epoch 转换),而写入对延迟敏感,因为过时的区块哈希意味着交易失败。公共端点适合原型设计,但在这种模式下往往会退化。
以下是针对质押集成比较选项的方法:
| 评估内容 | 为什么对质押很重要 |
|---|---|
| 突发读取下的吞吐量 | Epoch 边界和仪表板刷新会产生峰值 |
| 写入延迟和区块哈希新鲜度 | 过时的区块哈希会导致交易被丢弃 |
| WebSocket 支持 | 让你订阅账户和 slot 变化,而不是轮询 |
| 专用 vs 共享容量 | 共享节点在高峰负载时可能成为吵闹的邻居 |
| 环境覆盖 | 你需要 devnet 用于测试,mainnet 用于生产 |
| 监控和告警 | 你需要知道确认时间何时漂移 |
OnFinality 通过 HTTP 和 WebSocket 提供 Solana RPC,并在你需要隔离容量时提供专用节点选项。你可以查看 RPC 定价 和 支持的 RPC 网络 来了解什么适合你的工作负载,并在迁移到 mainnet 之前从 Solana Devnet 开始。
实用的集成顺序
质押集成通常遵循以下顺序。按此顺序构建,你将尽早发现大多数问题。
- 连接并读取。 指向一个 RPC 端点,确认你可以调用
getEpochInfo和getAccountInfo。 - 发现质押账户。 使用
getProgramAccounts并加上严格的过滤器来列出钱包的质押账户。 - 构建交易。 组装质押指令,获取新的区块哈希,并签名。
- 模拟。 发送前始终模拟。这是捕获错误指令的最便宜方式。
- 发送并确认。 提交,然后轮询
getSignatureStatuses直到确认。 - 处理 epoch 时间。 记住激活和停用跨 epoch 生效,所以你的 UI 应该反映待处理状态。
- 添加监控。 跟踪确认延迟和错误率,以便在用户之前注意到性能下降。
常见故障模式及如何调试
质押集成会以可预测的方式失败。以下是一个快速参考。
| 症状 | 可能原因 | 首先检查什么 |
|---|---|---|
| 交易从未确认 | 过时的区块哈希 | 重新获取 getLatestBlockhash 并重新发送 |
| 委托时模拟错误 | 错误的质押账户状态 | 使用 getAccountInfo 读取账户 |
getProgramAccounts 超时 | 过滤器太宽泛 | 添加 owner 和 dataSize 过滤器 |
| 质押长时间显示为待处理 | 未达到 epoch 边界 | 检查 getEpochInfo 并在 UI 中显示待处理状态 |
| 间歇性 429 响应 | 共享端点速率限制 | 迁移到专用容量或使用重试退避 |
一个有用的调试习惯是为每笔交易记录区块哈希、模拟结果和签名。当生产环境出现故障时,该日志通常足以识别问题是你的指令、你的时间安排还是你的端点。
关键要点
- 没有单一的“Solana 质押 API”。质押由通用 RPC 方法加上质押程序指令构建。
- RPC 层是不可或缺的:你需要它来读取质押状态、获取区块哈希、模拟、发送和确认。
- 原生质押给你控制权;流动性质押协议给你集成速度,但代价是增加协议风险。
- 质押流量是突发性的且对延迟敏感,因此提供商选择比只读应用更重要。
- 发送前模拟,在 UI 中处理 epoch 时间,并监控确认延迟。
- OnFinality 通过 HTTP 和 WebSocket 提供 Solana RPC 以及专用节点选项;请参阅 RPC 定价 和 支持的 RPC 网络。
常见问题
我需要为 Solana 质押使用特殊的 API 吗? 不需要。你使用标准的 Solana JSON-RPC API 来读取状态和提交交易,并针对质押程序或流动性质押协议构建质押指令。
我可以仅使用公共 RPC 端点集成质押吗? 对于原型设计,可以。对于生产环境,公共端点通常难以应对突发读取流量和延迟敏感的写入,因此托管或专用端点通常是更好的选择。
质押交易失败的最常见原因是什么? 过时的区块哈希。在签名和发送之前,始终获取新的区块哈希。
如何在不冒真实 SOL 风险的情况下测试质押? 使用 devnet。OnFinality 提供了一个 Solana Devnet 端点,你可以在迁移到 mainnet 之前基于它进行开发。
质押需要 WebSocket 支持吗? 严格来说不是必需的,但 WebSocket 订阅让你可以响应账户和 slot 变化,而不是轮询,这提高了质押仪表板的响应性。
在哪里可以看到 OnFinality 支持哪些 Solana 端点? 请参阅 Solana 网络页面 了解端点详细信息和传输支持。