摘要
标准 Solana JSON-RPC 节点暴露 getAccountInfo 和 getProgramAccounts 等核心方法,但它们不返回解码后的 NFT 元数据、集合分组或压缩 NFT(cNFT)状态。包含增强 API 的提供商在原始节点之上添加了索引化、NFT 感知的端点,因此您无需编写自己的 DAS 索引器即可查询资产、集合和代币元数据。OnFinality 提供 Solana RPC 和专用节点基础设施,支持 HTTP 和 WebSocket 传输,您可以将其与索引层配对以进行 NFT 特定读取。
快速推荐
如果您的应用需要解码后的 NFT 元数据、集合成员资格或压缩 NFT(cNFT)状态,普通的 Solana JSON-RPC 节点无法提供。您需要一个在节点之上叠加索引化、NFT 感知 API 的提供商。实际上,这意味着以下两种设置之一:
- 具有内置增强 NFT API 的提供商(通常是数字资产标准,即 DAS 端点),可在一次调用中返回资产、集合和元数据。
- 原始 Solana RPC 提供商加上您自己的索引器,您运行节点和一个单独的索引服务,该服务读取链上状态并提供 NFT 查询。
OnFinality 通过 HTTP 和 WebSocket 提供 Solana RPC 和专用节点基础设施,这是两种设置都依赖的节点层。如果您希望在不运行索引器的情况下进行 NFT 感知读取,请在承诺之前确认提供商的增强 API 表面。如果您希望完全控制 NFT 数据的塑造方式,请通过 OnFinality 等提供商运行节点并添加自己的索引层。
为什么标准 Solana RPC 无法满足 NFT 数据需求
Solana 的基础 JSON-RPC 是面向账户的,而不是面向资产的。节点可以告诉您账户中存储的原始字节,但它不知道某个特定账户是 NFT、属于哪个集合,或者其链下元数据是什么。这种解码工作是索引器的职责。
这很重要,因为大多数 NFT 读取不是单账户查找。它们是诸如“此钱包拥有的所有 NFT”、“此集合中的每个项目”或“此压缩 NFT 树的当前状态”之类的查询。从原始 RPC 回答这些问题意味着扫描许多账户并自行解析元数据,这在大规模下既慢又昂贵。
增强 NFT API 的存在就是为了弥补这一差距。它们维护资产索引并暴露返回结构化结果的方法,因此您的客户端不必从原始账户重建 NFT 状态。
“用于 NFT 数据的增强 API”实际意味着什么
这个短语涵盖了几种不同的东西,提供商们使用得很宽松。当您评估提供商时,请区分这些层:
| 层 | 返回内容 | 典型方法形式 |
|---|---|---|
| 原始节点 RPC | 账户字节、余额、槽位 | getAccountInfo、getProgramAccounts |
| 代币/元数据 RPC | SPL 代币和 Metaplex 元数据账户 | getTokenAccountsByOwner、元数据账户读取 |
| 增强资产 API(DAS 风格) | 解码后的资产、集合、所有权、cNFT | getAssetsByOwner、getAsset、getAssetsByGroup |
| 自定义索引器 | 您定义的任何模式 | 您自己的 HTTP/GraphQL 端点 |
DAS 风格的层是大多数开发者所说的“增强 NFT API”。它是一个索引服务,而不是节点方法,因此它可以位于同一提供商或单独的提供商。
NFT 工作负载的提供商评估矩阵
使用此表在实际影响 NFT 读取的维度上比较提供商。根据您的应用提供多少 NFT 数据,为每一行赋予自己的权重。
| 评估领域 | 需要确认的内容 | 为什么对 NFT 数据重要 |
|---|---|---|
| 增强/DAS API | 是否提供索引化资产 API,以及哪些方法 | 决定您是否可以在没有自己的索引器的情况下查询资产 |
| cNFT 支持 | 压缩 NFT 是否被索引 | 标准 RPC 无法高效枚举 cNFT |
| 原始节点访问 | HTTP 和 WebSocket 可用性 | 写入、订阅和回退读取所需 |
| 传输 | HTTP、WebSocket 以及任何 gRPC 风格选项 | 订阅和实时铸造需要 WebSocket |
| 专用容量 | 是否可以获得专用节点 | 将繁重的 getProgramAccounts 扫描与共享流量隔离 |
| 数据新鲜度 | 索引更新频率 | 过时的索引在转移后返回错误的所有权 |
| 故障转移 | 当一个端点降级时如何切换 | NFT 市场无法承受静默读取失败 |
OnFinality 位于原始节点和专用容量行:它通过 HTTP 和 WebSocket 提供 Solana RPC,并为需要隔离容量的工作负载提供专用节点。对于增强资产层,请确认您计划使用的索引服务以及它如何连接到您的节点。
连接到 Solana RPC
无论您选择哪种增强层,它最终都从 Solana 节点读取。OnFinality 为 Solana 主网暴露了一个公共 HTTP 端点和一个匹配的 WebSocket 端点:
# HTTP JSON-RPC
curl https://solana.api.onfinality.io/public \
-X POST -H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"getHealth"}'
// WebSocket subscription for account changes (e.g. a mint or metadata account)
import WebSocket from "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: [
"<METADATA_ACCOUNT_PUBKEY>",
{ encoding: "jsonParsed", commitment: "confirmed" }
]
}));
});
ws.on("message", (data) => {
console.log("account update:", data.toString());
});
对于生产环境,请将您的应用指向专用或托管端点,而不是公共端点。有关当前端点详细信息,请参阅 Solana RPC;有关容量选项,请参阅 RPC 定价。
在没有增强 API 的情况下读取 NFT 数据
如果您决定运行自己的索引器,节点仍然承担繁重的工作。一种常见模式是获取钱包的代币账户,然后解析每个铸币的元数据账户:
// 1. Get token accounts owned by a wallet
const owner = "<WALLET_PUBKEY>";
const res = await fetch("https://solana.api.onfinality.io/public", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
jsonrpc: "2.0",
id: 1,
method: "getTokenAccountsByOwner",
params: [owner, { programId: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" }, { encoding: "jsonParsed" }]
})
});
const { result } = await res.json();
console.log(result.value.length, "token accounts");
从那里,您为每个铸币派生 Metaplex 元数据 PDA 并读取它,或者将铸币列表交给您的索引器。这比调用 getAssetsByOwner 更费力,但它使您独立于任何单一提供商的增强 API。
何时使用增强 API 与自己的索引器
没有普遍正确的答案。权衡是控制与运营负载。
- 选择提供商的增强 NFT API 当您希望快速上市、您的查询适合提供商的方法集,并且您愿意依赖他们的索引新鲜度和模式时。
- 在托管节点上运行自己的索引器 当您需要自定义 NFT 字段、跨程序连接或您的产品拥有的模式,并且您可以吸收索引和回填工作时。
- 两者都用 当您希望增强 API 用于常见读取,自己的索引用于产品特定查询,并以节点作为共享的真相来源时。
混合设置在市场中很常见:增强 API 用于发现和搜索,自己的索引用于排名、定价和分析。
生产就绪检查清单
在将 NFT 流量路由到任何提供商之前,请确认以下事项:
- 端点隔离。 繁重的
getProgramAccounts或元数据扫描不应与延迟敏感的读取共享容量。考虑使用专用节点。 - 传输覆盖。 您同时拥有 HTTP 和 WebSocket 端点,并且您的客户端处理重连。
- 索引新鲜度预期。 您知道在转移或铸造后,所有权变更在增强 API 中出现的速度。
- 故障转移路径。 您可以在不重新部署的情况下切换到第二个端点或提供商。
- 承诺级别。 您了解
processed、confirmed和finalized如何影响您看到的 NFT 状态。 - 速率和突发行为。 您知道您的提供商在铸造或空投期间如何处理流量高峰。
- 可观测性。 您记录请求延迟、错误率和索引延迟,以便及早发现降级。
Solana 上 NFT 数据的常见故障模式
- 过时的所有权。 增强索引尚未跟上最近的转移,因此应用显示错误的所有者。通过为所有权关键操作读取最终状态来缓解。
- cNFT 枚举缺口。 压缩 NFT 并非总是被每个提供商索引。如果您的应用使用它们,请明确确认 cNFT 支持。
- 元数据获取失败。 链下元数据 URI 可能缓慢或不可用;积极缓存并处理超时。
getProgramAccounts过载。 对共享端点的广泛扫描可能缓慢或被限流。严格限定过滤器范围或迁移到专用节点。- 模式漂移。 增强 API 响应形状可能在版本之间变化。将您的客户端固定到已知版本并测试升级。
关键要点
- 标准 Solana RPC 不返回解码后的 NFT 数据;增强 API 是叠加在节点之上的索引服务。
- “增强 API”通常意味着 DAS 风格的资产 API,具有
getAssetsByOwner和getAssetsByGroup等方法。 - 您可以从提供商的增强 API 获取 NFT 数据,也可以针对原始节点运行自己的索引器。
- OnFinality 通过 HTTP 和 WebSocket 提供 Solana RPC 以及专用节点,这是两种方法都需要的节点层。
- 在增强 API 覆盖、cNFT 支持、传输、专用容量、索引新鲜度和故障转移方面评估提供商。
- 在承诺之前确认索引新鲜度和 cNFT 支持,并保持故障转移端点就绪。
常见问题解答
OnFinality 是否包含增强 NFT API? OnFinality 通过 HTTP 和 WebSocket 提供 Solana RPC 和专用节点基础设施。对于 NFT 特定的增强读取,请确认您计划使用的索引层以及它如何连接到您的节点。有关端点详细信息,请参阅 Solana RPC。
我可以从标准 Solana RPC 节点获取 NFT 元数据吗? 您可以读取原始代币和元数据账户,但必须自行解码和索引它们。标准节点不返回结构化的资产或集合数据。
什么是 DAS API?
数字资产标准(DAS)是用于查询索引化 Solana 资产(包括 NFT 和压缩 NFT)的常见接口,具有 getAsset 和 getAssetsByOwner 等方法。
NFT 工作负载需要专用节点吗?
不总是,但繁重的元数据扫描或 getProgramAccounts 查询受益于隔离容量,以免影响其他流量。请参阅 专用节点。
如何在不破坏应用的情况下切换提供商? 保持端点配置外部化,支持多个端点,并测试故障转移。简短的 提供商选择清单 可帮助您在迁移前比较选项。
在哪里可以看到 OnFinality 支持哪些网络? 浏览 支持的 RPC 网络 并查看 RPC 定价 以了解容量和计划详情。