摘要
Solana NFT API 通过将链下索引数据与快速 RPC 访问相结合,然后将负载分散到缓存层、区域边缘节点和专用节点容量上,从而保持可扩展性和低延迟。对开发者来说,实际结果是即使底层链繁忙,元数据、所有权和铸造查询也能快速返回。
本文解释了这些保证背后的架构,展示了如何评估 NFT 数据提供商,并给出了使用 OnFinality 端点的 Solana 具体 RPC 模式,以便您可以自行测试延迟和吞吐量。
Solana NFT API 不是单一服务。它们是一个技术栈:一个监视链的索引器、一个保存派生 NFT 状态的存储层、一个吸收重复读取的缓存,以及一个回答实时链查询的 RPC 层。可扩展性和低延迟来自于这些层的组织方式,而不是任何单一技巧。
如果您正在构建 NFT 市场、钱包或分析工具,您需要知道哪一层负责哪项保证,以便评估提供商并调试慢响应。本文介绍了架构,然后为您提供了一种实用的测试方法。
在您承诺使用 NFT 数据提供商之前需要检查什么
在注册任何 Solana NFT API 之前,请确定您的工作负载实际需要什么。NFT 数据不是一种查询类型。它至少是四种:
- 元数据读取(名称、图像、属性)——通常由索引或缓存提供。
- 所有权和余额查询——需要当前状态,通常来自索引加上 RPC 确认。
- 铸造和集合查询——高扇出,受益于预计算索引。
- 实时链查询(账户状态、交易状态)——必须访问 RPC 节点。
在元数据方面快速的提供商可能在实时账户读取方面很慢,反之亦然。在集成之前请问这些问题:
- 提供商运行自己的 Solana 节点,还是转售另一个 RPC 提供商?
- 索引是按 slot、按区块更新,还是有延迟?
- 您能获得专用端点,还是共享公共池?
- 在网络拥塞或热门铸造期间延迟会发生什么变化?
- 是否有用于实时更新的 WebSocket 选项?
如果您同时需要索引的 NFT 数据和可靠的 RPC,您可以将 NFT 索引器与 OnFinality 的专用 Solana RPC 端点配对。这样您就可以控制链访问层,而索引器处理派生数据。
可扩展 Solana NFT API 背后的架构
大多数生产 Solana NFT API 遵循类似的管道:
- 摄取——节点流式传输区块和交易。
- 解析——解码器提取与 NFT 相关的指令(Metaplex、Token-2022、压缩 NFT)。
- 索引——派生状态写入以 mint、owner 和 collection 为键的数据库。
- 缓存——热查询从内存或边缘缓存提供。
- 服务——API 网关将请求路由到索引或 RPC。
可扩展性来自于将读路径与写路径分离。索引器可以稍微滞后而不影响读取,并且可以通过添加缓存节点来水平扩展读取。低延迟来自于保持缓存靠近用户,并避免在每个请求上进行全链扫描。
为什么索引比原始 RPC 速度更重要
原始 Solana RPC 节点可以快速回答 getAccountInfo,但如果没有扫描许多账户,它无法高效地回答“显示此钱包拥有的所有 NFT”。这就是 NFT API 存在的原因:它们预先计算答案。权衡是新鲜度。索引可能落后链尖几个 slot。对于大多数 NFT 用例来说这没问题;对于铸造狙击或实时交易,您需要 RPC 加 WebSocket。
实际减少延迟的缓存策略
- 边缘缓存用于很少更改的元数据。
- 短 TTL 缓存用于所有权余额,在新区块时失效。
- 请求合并,以便对同一 mint 的 1,000 个同时请求只访问数据库一次。
- 负缓存用于不存在的 mint,以避免重复未命中。
这些机制让提供商能够吸收流量峰值,而无需为每个请求添加节点。
Solana RPC 和 NFT API 如何协同工作
NFT API 不是 RPC 的替代品。它是补充。您仍然需要 RPC 来:
- 提交交易(铸造、转移、上架)。
- 确认交易状态。
- 当索引过期时读取实时账户状态。
- 通过 WebSocket 订阅账户或程序更改。
OnFinality 通过 HTTP 和 WebSocket 提供 Solana RPC。公共端点可用于测试:
curl https://solana.api.onfinality.io/public \
-X POST -H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"id": 1,
"method": "getAccountInfo",
"params": [
"<MINT_ADDRESS>",
{"encoding": "jsonParsed"}
]
}'
对于生产 NFT 工作负载,专用节点消除了嘈杂邻居效应,并为您提供可预测的吞吐量。有关端点详细信息,请参阅 Solana RPC API;有关容量选项,请参阅 专用节点。
用于实时 NFT 事件的 WebSocket 订阅
如果您的应用需要在铸造或转移发生时做出反应,请使用 WebSocket 订阅而不是轮询:
const WebSocket = require('ws');
const ws = new WebSocket('wss://solana.api.onfinality.io/public-ws');
ws.on('open', () => {
ws.send(JSON.stringify({
jsonrpc: '2.0',
id: 1,
method: 'accountSubscribe',
params: [
'<ACCOUNT_ADDRESS>',
{ encoding: 'jsonParsed', commitment: 'confirmed' }
]
}));
});
ws.on('message', (data) => {
const msg = JSON.parse(data);
if (msg.method === 'accountNotification') {
console.log('Account changed:', msg.params.result);
}
});
这种模式减少了索引器的负载,并为您提供比每几秒轮询更低的事件延迟。
Solana NFT 数据的提供商评估矩阵
使用此表在影响可扩展性和延迟的维度上比较提供商。OnFinality 作为 RPC 和专用节点选项列在首位;NFT 索引器是您可以与之组合的独立服务。
| 提供商类型 | 数据新鲜度 | 可扩展性模型 | 延迟概况 | 最适合 |
|---|---|---|---|---|
| OnFinality(RPC + 专用节点) | 链尖(RPC) | 共享或专用节点容量 | 低,取决于区域和节点负载 | 实时链读取、交易提交、WebSocket 事件 |
| 托管 NFT 索引器 API | slot 级到几个 slot 延迟 | 水平缓存 + 索引分片 | 索引读取低,实时读取较高 | 元数据、所有权、集合查询 |
| 自托管索引器 + RPC | 您控制新鲜度 | 您扩展两层 | 取决于您的基础设施 | 有严格数据控制需求的团队 |
| 仅公共 RPC | 链尖 | 共享,速率限制 | 负载下可变 | 原型设计、低流量应用 |
自行测试延迟和吞吐量
不要依赖营销声明。测量。一个简单的方法:
- 发送 100 个顺序
getAccountInfo调用并记录 p50 和 p95 延迟。 - 发送 100 个并发调用并检查错误或节流。
- 比较 HTTP 与 WebSocket 的事件传递。
- 从您的用户所在区域进行测试。
const fetch = require('node-fetch');
async function measure(url, n = 100) {
const times = [];
for (let i = 0; i < n; i++) {
const start = Date.now();
await fetch(url, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
jsonrpc: '2.0', id: i,
method: 'getSlot',
params: []
})
});
times.push(Date.now() - start);
}
times.sort((a, b) => a - b);
console.log('p50:', times[Math.floor(n * 0.5)], 'ms');
console.log('p95:', times[Math.floor(n * 0.95)], 'ms');
}
measure('https://solana.api.onfinality.io/public');
对您的候选端点运行此测试并比较。如果您需要一致的结果,专用节点消除了共享池的可变性。
常见故障模式及如何调试它们
| 症状 | 可能原因 | 修复 |
|---|---|---|
| 元数据返回但所有权过时 | 索引滞后 | 使用 RPC getTokenAccountsByOwner 确认 |
| 铸造事件期间 p95 延迟高 | 共享 RPC 拥塞 | 迁移到专用节点或添加缓存 |
| WebSocket 断开连接 | 空闲超时或网络 | 实现带退避的重连 |
| 429 响应 | 共享端点上的速率限制 | 减少轮询,使用 WebSocket,或升级计划 |
| 缺少 NFT | 索引器未解析压缩 NFT | 检查提供商对 cNFT 的支持 |
有关更广泛的提供商选择框架,请参阅 如何选择 RPC 提供商。
关键要点
- Solana NFT API 的可扩展性来自于分离索引、缓存和 RPC 层。
- 低延迟主要是缓存和邻近性问题,而不是原始节点速度问题。
- NFT API 补充 RPC;您仍然需要 RPC 来处理交易、实时状态和 WebSocket 事件。
- 在数据新鲜度、可扩展性模型和负载下的延迟方面评估提供商——而不仅仅是功能列表。
- 在承诺之前,用您自己的延迟和吞吐量测量进行测试。
- OnFinality 通过 HTTP 和 WebSocket 提供 Solana RPC,以及用于可预测吞吐量的专用节点。请参阅 RPC 定价 和 支持的 RPC 网络。
常见问题
我需要同时使用 NFT API 和 RPC 提供商吗?
通常是的。NFT API 处理索引查询,如所有权和元数据。RPC 处理交易提交、实时账户读取和 WebSocket 订阅。许多团队两者都使用。
来自索引器的 NFT 数据有多新鲜?
这各不相同。一些索引器按 slot 更新,另一些每几秒批量更新。向提供商询问他们的更新频率,并针对 RPC 上的 getSlot 进行测试。
没有专用节点我能获得低延迟吗?
对于中等流量,通常可以。共享端点可能很快,但在负载下延迟变得不太可预测。专用节点减少了这种可变性。
处理铸造高峰的最佳方式是什么?
将 WebSocket 订阅与缓存和专用 RPC 端点结合使用。避免在每个区块轮询每个钱包。
OnFinality 提供 NFT 索引吗?
OnFinality 专注于 RPC API 和专用节点基础设施。您可以将其与您选择的 NFT 索引器配对以获取派生数据。