Logo
新用户订阅 RPC,首月享 6.5 折优惠查看优惠
OnFinality Learn
可靠性与一致性阅读约 12 分钟

Solana getVersion 与运行时特性:探测节点能力

了解如何探测 Solana RPC 节点所声明的软件版本和活跃运行时特性集,以便在依赖新方法之前验证兼容性。

TL;DR

Solana getVersion RPC 方法返回节点所声明的 solana-core 版本,以及一个将特性门控标识符映射到激活槽位的特性集映射。这使客户端能够在调用依赖某个运行时特性的方法之前,确认节点是否知晓该特性。然而,所声明的特性集是节点自身的报告,如果节点落后,可能与集群的活跃特性集不同。将 getVersion 与 getHealth、getClusterNodes 和 getEpochInfo 结合使用,可以构建可靠的节点能力记录,并应按端点缓存。始终验证能力声明是否由靠近链尖的健康节点支持。

getVersion 在 Solana RPC 中的作用

getVersion RPC 方法是一个轻量级调用,返回你所连接的 Solana 节点的软件版本,以及一个 feature-set 映射。根据 Solana getVersion 文档,响应包含一个 solana-core 版本字符串和一个 feature-set 对象,其中每个键是一个特性门控标识符(base58 编码的公钥),每个值是该特性的激活槽位。对于需要在调用较新的 RPC 方法或解释依赖特定运行时特性的交易格式之前确保兼容性的客户端来说,这些信息至关重要。

与查询区块链状态的方法不同,getVersion 报告的是节点自身的软件配置。它不需要任何参数,通常响应很快。由于它反映节点所声明的能力,因此是构建 RPC 端点能力档案的第一步。你可以将其与其他健康和集群方法一起使用,以形成完整的图景,如 Solana API 指南(RPC Assistant) 中所述。

  • 返回 solana-core 版本字符串(例如 '1.18.22')。
  • 返回 feature-set 映射:特性 ID → 激活槽位。
  • 不需要参数;可以安全地频繁调用。
  • 如果节点未完全同步,所声明的特性集可能落后于集群。

理解 Solana 特性门控与激活

Solana 特性门控是运行时变更,一旦绝大多数质押投票启用,就会在特定槽位激活。每个特性由唯一的公钥标识,其激活槽位记录在链上。Solana 特性门控参考 说明,特性可以改变交易处理、添加新的 RPC 方法或改变现有方法的行为。当特性激活时,已升级到支持该特性的软件版本的节点将从激活槽位开始执行新行为。

由于特性激活在整个集群中协调进行,运行较旧软件的节点可能无法识别某个特性,并可能拒绝交易或对依赖该特性的方法返回错误。因此,在依赖某个特性之前,检查 getVersion 返回的 feature-set 有助于确定节点是否知晓该特性。然而,特性出现在 feature-set 中并不保证节点已完全激活它;激活槽位指示它应在何时变为活跃,但节点还必须健康且靠近链尖,才能正确处理交易。

  • 特性门控由公钥标识,并在特定槽位激活。
  • 激活需要质押加权投票和软件支持。
  • 运行较旧版本的节点可能在其特性集中不包含较新的特性。
  • 特性集存在是方法可用的必要条件,但并非充分条件。

使用 getVersion、getHealth、getClusterNodes 和 getEpochInfo 构建节点能力记录

单次 getVersion 调用会给出所声明的版本和特性集,但要信任这些信息,你需要确认节点健康且已同步。如果节点在集群的某个阈值范围内,getHealth 方法返回 'ok',而 getEpochInfo 提供当前 epoch、槽位和交易数量。getClusterNodes 列出集群中所有节点及其版本,这有助于将你的端点版本与集群多数版本进行比较。

通过组合这些调用,你可以构建一个能力记录,其中包括:节点的 solana-core 版本、其 feature-set、其健康状态、当前 epoch 和槽位,以及集群的版本分布。该记录应按端点缓存并定期刷新,因为节点可能被升级或落后。有关检测滞后的更深入讨论,请参阅 检测落后于链尖的 RPC 节点。

  • getVersion:版本和特性集。
  • getHealth:如果节点健康则返回 'ok'。
  • getEpochInfo:当前 epoch、槽位和交易数量。
  • getClusterNodes:集群节点及其版本的列表。
  • 按端点缓存组合记录并定期刷新。

检测落后于发布的节点

当新特性发布时,未升级的节点不会在其 feature-set 中声明它。如果你尝试使用依赖该特性的方法,节点可能返回 'method not found' 错误,或以不支持的版本拒绝交易。要检测此类滞后,请将节点的 solana-core 版本与 getClusterNodes 报告的多数版本进行比较。如果你的端点明显落后,它可能不支持较新的交易格式或 RPC 方法。

此外,检查你所需特性的激活槽位。如果来自 getEpochInfo 的当前槽位已超过激活槽位,但该特性在节点的 feature-set 中缺失,则节点很可能运行的是过时软件。在这种情况下,你应该切换到其他端点或等待节点升级。监控工具可以自动执行此检查;有关策略,请参阅 监控 RPC 端点。

  • 将节点版本与 getClusterNodes 中的集群多数版本进行比较。
  • 检查当前槽位是否大于特性激活槽位但特性缺失。
  • 滞后的节点可能拒绝较新的交易格式。
  • 如果检测到滞后,切换端点或等待升级。

可运行的 Node.js 示例:探测 getVersion 和特性集

以下 Node.js 脚本连接到 Solana RPC 端点,调用 getVersion,提取特性集键,并检查特定特性 ID。它还会打印所声明的版本。你可以通过替换 FEATURE_ID 常量来适配你感兴趣的自己的特性。此示例使用 @solana/web3.js 库,但你也可以使用原始 HTTP 请求。

运行前,请确保已安装 Node.js 和 @solana/web3.js 包。该脚本使用公共 RPC 端点进行演示;请将其替换为你自己的端点 URL。输出将显示版本以及该特性是否存在。

const { Connection } = require('@solana/web3.js');

// Replace with your RPC endpoint
const RPC_URL = 'https://api.mainnet-beta.solana.com';
const FEATURE_ID = '3a8f5b7c9d2e1f0a4b6c8d0e2f4a6b8c0d2e4f6a8b0c2d4e6f8a0b2c4d6e8f0a'; // example feature ID

async function probeNode() {
  const connection = new Connection(RPC_URL, 'confirmed');
  try {
    const versionInfo = await connection.getVersion();
    console.log('solana-core version:', versionInfo['solana-core']);
    const featureSet = versionInfo['feature-set'];
    const featureKeys = Object.keys(featureSet);
    console.log('Number of features advertised:', featureKeys.length);
    if (featureKeys.includes(FEATURE_ID)) {
      console.log(`Feature ${FEATURE_ID} is present, activation slot: ${featureSet[FEATURE_ID]}`);
    } else {
      console.log(`Feature ${FEATURE_ID} is NOT present in the advertised feature-set.`);
    }
  } catch (err) {
    console.error('Error probing node:', err);
  }
}

probeNode();

使用 getHealth 和 getSlot 验证能力声明

仅凭特性集条目并不能保证节点会成功处理使用该特性的交易。节点还必须健康且靠近链尖。在调用 getVersion 之后,调用 getHealth 以确保节点返回 'ok',并调用 getSlot 检查当前槽位。如果节点落后,它可能尚未处理最新区块,并可能无法正确模拟或发送交易。

例如,如果你即将发送一个依赖最近激活特性的版本化交易,你应该验证节点的槽位与集群最高槽位相差几个槽位以内。你可以从 getClusterNodes 或通过查询多个端点获取集群最高槽位。只有当节点健康且其槽位接近链尖时,才信任能力声明。这种做法是稳健的 Solana 承诺级别与交易确认 策略的一部分。

  • 在 getVersion 之后调用 getHealth;期望返回 'ok'。
  • 调用 getSlot 并与集群最高槽位比较。
  • 如果节点落后,能力声明不可靠。
  • 在发送交易前结合健康检查和槽位检查。

结果表:测量你的端点能力档案

为了系统地评估 RPC 端点,创建一个结果表来记录能力探测的输出。定期运行探测并将观察到的值填入表中。这有助于你跟踪随时间的变化并比较多个端点。下面是一个你可以使用的模板;请将示例值替换为你自己的测量值。

该表应包含端点 URL、时间戳、solana-core 版本、特性集中的特性数量、特定特性是否存在、健康状态、当前槽位以及集群最高槽位。你还可以添加一列表示节点槽位与集群最高槽位之间的差值,以便快速发现滞后。

  • 端点 URL:例如 https://api.mainnet-beta.solana.com
  • 时间戳:ISO 8601 格式。
  • solana-core 版本:来自 getVersion。
  • 特性数量:feature-set 中的键数量。
  • 特性 X 存在:是/否。
  • 健康:'ok' 或错误。
  • 节点槽位:来自 getSlot。
  • 集群最高槽位:来自 getClusterNodes 或其他来源。
  • 槽位差:节点槽位 - 集群最高槽位。

所声明能力的局限性与权衡

getVersion 返回的 feature-set 是节点自身的报告,如果节点落后或配置错误,可能不反映集群的活跃集。节点可能声明某个特性,但由于内部错误或不完整同步,仍然无法处理使用该特性的交易。此外,一些 RPC 方法受节点配置而非特性门控的限制;例如,运营商可能出于安全或性能原因禁用某些方法。此行为因节点而异,因此你不能仅因为特性存在就假设方法可用。

另一个局限是负载均衡端点可能将请求路由到不同版本的节点。单次 getVersion 调用可能命中一个节点,而后续交易被发送到另一个节点。为缓解此问题,你应使用专用端点或在每个请求上执行能力检查,尽管后者会增加开销。对于生产系统,考虑使用在跨区域提供一致节点版本的提供商,例如 RPC 定价 中所述的那些。

  • 所声明的特性集是节点的自我报告;可能落后于集群。
  • 方法可用性可能受配置限制,而不仅仅是特性。
  • 负载均衡器可能路由到不同版本。
  • 专用端点或每请求检查可降低风险。

排查常见的 getVersion 和特性集问题

如果 getVersion 返回错误,端点可能已关闭或不是 Solana RPC 节点。检查 URL 并确保它支持 JSON-RPC 2.0。如果特性集为空或缺少预期特性,节点可能运行较旧版本或未完全同步。在这种情况下,与 getClusterNodes 比较以查看集群的版本分布。如果你的节点是唯一缺少某个特性的节点,它很可能已过时。

如果在调用本应可用的方法时收到 'method not found' 错误,请验证该方法是否受配置限制。一些提供商默认禁用某些方法。此外,确保你使用的是正确的方法名和参数。对于版本化交易,检查节点是否支持所需特性,以及你的交易格式是否正确;有关详细信息,请参阅 Solana 版本化交易与 getBlock 解析。

  • getVersion 出错:端点可能已关闭或无效。
  • 特性集为空:节点可能已过时或未同步。
  • 方法未找到:可能是配置限制或版本不匹配。
  • 检查方法名和参数;查阅提供商文档。

后续步骤:将能力检查集成到你的工作流中

为确保可靠性,将能力检查集成到应用程序的启动和定期健康检查中。按端点缓存能力记录,并每隔几分钟或在关键操作前刷新。使用结果决定是继续交易还是回退到其他端点。有关 Solana RPC 的更广泛概述,请参阅 Solana API 指南(RPC Assistant) 和 OnFinality Learn 中心。

如果你正在构建依赖特定特性的服务,考虑使用多个 RPC 提供商并基于能力进行负载均衡。OnFinality 提供具有一致版本的 Solana API 端点和用于可靠访问的 API 服务。始终针对最新集群特性测试你的集成,并监控变化。

  • 按端点缓存能力记录;定期刷新。
  • 在关键交易前使用检查。
  • 考虑多个提供商以实现冗余。
  • 监控集群特性激活和升级时间线。

永远不用担心基础设施

OnFinality 消除了 DevOps 的繁重工作,让您能够更聪明、更快地构建。

开始