摘要
构建 Solana 索引器需要在基于 Geyser 插件的 DIY 管道和抽象化流与存储的托管服务之间做出选择。本文比较了自托管与基于提供商的方法,包括 RPC 轮询、Yellowstone gRPC、Webhook 和数据仓库集成。在选择技术栈之前,评估数据新鲜度、吞吐量和运营开销。
Solana 索引器决策清单
构建 Solana 索引器涉及多个关键选择。使用此清单评估你的选项:
- 数据新鲜度要求:你需要实时(亚秒级)还是近实时(秒到分钟级)?
- 吞吐量:你的应用需要消耗多少每秒事务数?是否有突发流量?
- 运营容忍度:你的团队能否管理验证器节点、Kafka 和 ClickHouse,还是更倾向于托管管道?
- 成本模型:考虑基础设施成本(验证器、存储、计算)与 API 订阅费用。
- 数据量与保留期:需要存储多少历史数据,保留多久?
- 查询模式:你将运行即席 SQL 查询、GraphQL,还是仅预定义的聚合?
- 团队技能:你的团队是否有 Rust、Node.js 或流式基础设施(如 Kafka)的经验?
索引 Solana 数据的方法
由于账户模型和高吞吐量(数千 TPS),索引 Solana 与 EVM 链有着根本区别。主要有三种方法:
- RPC 轮询 – 最简单,但大规模时缓慢且昂贵。
- Geyser 插件 + gRPC 流 – 实时、高效,但需要验证器访问。
- 托管 Webhook / 流 – 用控制换取便利。
RPC 轮询
使用 getSignaturesForAddress 和 getTransaction 获取程序或账户的事务。适用于低流量 dApp,但在公共 RPC 上很快会达到速率限制。
curl https://api.mainnet-beta.solana.com -X POST -H "Content-Type: application/json" -d '
{
"jsonrpc": "2.0",
"id": 1,
"method": "getSignaturesForAddress",
"params": ["Vote111111111111111111111111111111111111111", {"limit": 5}]
}'
缺点:
- 大多数 RPC 提供商限制速率。
- 非实时;必须定期轮询。
- 大型程序的请求成本高。
Geyser 插件 + Yellowstone gRPC
这是实时索引的黄金标准。运行一个带有 Geyser 插件的 Solana 验证器,该插件通过 gRPC 流式传输账户更新、事务和日志。Yellowstone gRPC 插件是最流行的。
要求:
- 一个 Solana 验证器节点(或访问一个)。
- 编译并配置 Geyser 插件。
- gRPC 客户端(例如,使用 Node.js、Rust 或 Go)。
示例 Node.js gRPC 客户端:
const grpc = require('@grpc/grpc-js');
const protoLoader = require('@grpc/proto-loader');
const package = protoLoader.loadSync('geyser.proto');
const geyser = grpc.loadPackageDefinition(package).geyser;
const client = new geyser.Geyser('localhost:10000', grpc.credentials.createInsecure());
const call = client.subscribe();
call.write({
slots: { filterByCommitment: { commitmentLevel: 1 } },
transactions: { filter: { accounts: { any: ['Vote111111111111111111111111111111111111111'] } } }
});
call.on('data', (data) => console.log(data));
优点: 实时、低延迟、高效流式传输。 缺点: 需要运行验证器(高运营成本)或为托管 gRPC 流服务付费。
托管 Webhook / 流
像 Helius、QuickNode Streams 和 Shyft 等服务提供托管管道。它们处理验证器/Geyser 的复杂性,并通过 Webhook 或 gRPC 流交付数据。
Webhook 示例(Helius 风格):
POST /webhook
{
"webhookURL": "https://your-backend.com/solana-webhook",
"transactionTypes": ["ANY"],
"accountAddresses": ["TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"],
"webhookType": "enhanced"
}
优点: 无需基础设施管理,内置重试机制,数据丰富。 缺点: 供应商锁定,成本随数据量增长,控制有限。
Solana 索引器基础设施评估标准
| 标准 | 检查什么 | 为什么重要 |
|---|---|---|
| 数据新鲜度 | 交付是亚秒级还是批量? | 实时应用需要低延迟;分析可以容忍秒级。 |
| 吞吐量容量 | 最大事件/秒;突发处理 | Solana 可产生超过 10K TPS;管道必须跟上。 |
| 运营开销 | 验证器管理、队列设置、数据库运维 | 直接影响团队速度和基础设施成本。 |
| 可扩展性 | 消费者和存储的水平扩展 | 数据量会随着程序和用户呈指数增长。 |
| 查询灵活性 | SQL、GraphQL 或预聚合视图 | 分析师需要即席查询;仪表板需要快速聚合。 |
| 成本可预测性 | 固定订阅 vs. 可变计算/存储 | 托管服务按事件收费;DIY 有硬件+DevOps 成本。 |
| 可靠性与故障转移 | 重试逻辑、重放能力、SLA | 索引器停机意味着数据丢失;必须支持回填。 |
| 数据保留 | 热存储 vs. 冷存储;归档策略 | 历史数据支持趋势分析,但增加存储成本。 |
常见陷阱与故障排除
- 速率限制: 公共 RPC 会限制轮询;始终使用具有更高限制的专用 RPC 进行索引工作负载。OnFinality 提供适合中等轮询需求的可扩展 RPC 端点。
- 遗漏事务: Geyser 插件在高负载下可能丢失事件。确保管道具有回填机制(例如,定期从 RPC 批量获取)。
- 模式漂移: 程序更新可能改变指令布局。使用 IDL 解析或处理动态解码。
- 存储扩展: Solana 每月产生约 1 TB 的事务数据。计划冷存储或数据剪枝。
- gRPC 连接断开: 使用带有指数退避的重连逻辑;许多托管流包括自动重连。
关键要点
- 对于实时应用,避免 RPC 轮询;使用 Geyser gRPC 或托管流。
- 评估总成本:DIY 验证器 + 流式基础设施 vs. 托管 API 订阅。
- 始终规划回填:即使最好的流也可能在中断期间错过事件。
- 选择符合查询模式的存储后端:ClickHouse 用于分析,Postgres 用于事务查询。
- 托管服务减少运维,但引入可变成本;DIY 提供控制但需要专门的 DevOps。
常见问题
什么是 Solana 索引器? Solana 索引器摄取链上数据(事务、账户、日志)并将其存储在可查询格式(数据库、数据仓库)中,用于分析、仪表板或应用程序功能。
我可以使用标准 RPC 端点进行索引吗? 可以,适用于低流量场景。但生产索引需要更高的吞吐量和实时流,因此 Geyser 插件或托管 Webhook 更可取。
我需要运行自己的验证器来索引 Solana 吗? 不一定。你可以使用托管的 gRPC 流或使用专用节点进行 RPC 轮询。然而,为了最大的灵活性和控制,运行带有 Geyser 插件的验证器很常见。
OnFinality 如何支持 Solana 索引? OnFinality 提供 Solana RPC 端点,适用于轮询和事务获取,以及为需要自定义验证器设置的团队提供 专用节点基础设施。参见我们的 RPC 定价 了解速率限制和计划。
Geyser 和 Yellowstone 有什么区别? Geyser 是 Solana 的插件接口,发出账户和事务更新。Yellowstone 是一个特定的开源 Geyser 插件,暴露 gRPC 流。它们通常一起使用。
我应该使用 Webhook 还是 gRPC 流? Webhook 更易于设置,但延迟较高且没有排序保证。gRPC 流提供有序、低延迟的数据,推荐用于实时用例。