Logo
新用户订阅 RPC,首月享 6.5 折优惠查看优惠
OnFinality Learn
基础设施与运维阅读约 13 分钟

运行 Sui 全节点:RPC 端点设置与验证

配置、暴露并验证 Sui 全节点的 JSON-RPC 接口,包含可复现的健康检查和结果表。

TL;DR

Sui 全节点执行并索引交易,并提供读取 API,而验证者(权威节点)通常不公开暴露 RPC。暴露节点的 JSON-RPC 接口需要做出两个决定:启用哪些接口(HTTP JSON-RPC,以及可选的 WebSocket/流式接口)以及将它们绑定到哪个地址(位于代理之后的 localhost,或仅在具备防火墙和 TLS 时才使用可路由地址)。配置位于节点配置文件中,但字段名称和默认值会随 Sui 版本变化,因此运维人员必须对照当前的 Sui 全节点指南进行核对。在开始提供流量之前,通过调用 sui_getLatestCheckpointSequenceNumber 和 sui_getChainIdentifier 验证健康状态和网络身份,确认检查点持续推进,并将链标识符与官方主网值进行交叉核对。本文提供可运行的 curl 和 Node.js 探针、待填写的结果表,以及关于同步时间、检查点滞后和暴露风险的诚实局限性说明。

Sui 全节点在网络架构中的角色

Sui 将共识权威节点(验证者)与全节点分离。验证者参与共识并执行交易,但通常不提供公共 RPC 流量。全节点复制账本、执行并索引交易,并向客户端提供读取 API。这种分离正是希望提供 RPC 服务的运维人员应运行全节点,而不是试图暴露验证者的原因。

全节点可以直接提供 JSON-RPC API。当配置为索引器时,它还可以支持需要额外索引工作的更丰富的查询接口。Sui 全节点指南记录了运行节点并配置其接口的运维工作流程;请将该指南视为你所使用 Sui 版本的权威参考。

有关网络层面的背景信息和可用端点,请参阅 Sui 网络页面。如果你不想自行运维基础设施,托管的 Sui RPC 节点可以免除运维负担,但以下验证技术仍适用于你使用的任何端点。

  • 验证者:负责共识和执行;不是公共 RPC 提供者。
  • 全节点:复制账本、执行并索引、提供读取 API。
  • 索引器模式:可选,支持更丰富的查询接口。
  • 公共 RPC 暴露:属于全节点关注的问题,而非验证者关注的问题。

暴露 RPC 接口时的两个决定

第一个决定是启用哪些接口。JSON-RPC HTTP 接口是读取调用的主要接口。可选地,可以启用 WebSocket 或流式接口用于订阅和事件流。仅启用你需要的接口可以减少攻击面和资源消耗。

第二个决定是将这些接口绑定到哪个地址。对于位于反向代理之后的私有节点,绑定到 localhost 是安全的默认做法。只有在防火墙和 TLS 终止已就位时,绑定到可路由地址才是合适的。在没有代理和 TLS 的情况下将 RPC 接口直接暴露到互联网是不安全的,也是节点被入侵的常见原因。

这些决定是相互独立的:你可以在 localhost 上启用 HTTP JSON-RPC 而保持 WebSocket 禁用,也可以在代理之后同时启用两者。记录你选择的接口,以便验证步骤与你的配置相匹配。

  • 为标准读取调用启用 HTTP JSON-RPC。
  • 仅在需要订阅时启用 WebSocket/流式接口。
  • 对于代理之后的私有节点,绑定到 localhost。
  • 仅在防火墙和 TLS 就位时绑定到可路由地址。

文档化的配置面与版本漂移

节点配置文件包含 JSON-RPC 和指标部分,以及数据库路径和创世/网络选择。确切的字段名称和默认值会随 Sui 版本变化。旧教程可能引用已不存在或已移动的字段。运维人员必须对照当前的 Sui 全节点指南进行核对,而不是复制过时的配置。

创世和网络选择决定了节点跟随哪条链。主网节点必须使用主网创世;测试网节点使用测试网创世。混合使用会导致节点服务于错误的网络,这就是为什么在提供流量之前必须进行链身份验证。

数据库路径决定了磁盘使用和 I/O 特性。从创世区块进行完整同步可能消耗大量磁盘和时间。请相应规划容量,并在初始同步期间监控磁盘增长。

  • 配置文件:JSON-RPC 部分、指标部分、数据库路径、创世/网络。
  • 字段名称和默认值因 Sui 版本而异;请对照当前文档进行验证。
  • 创世选择决定主网还是测试网身份。
  • 数据库路径影响磁盘使用和 I/O;请为完整同步增长做好规划。

Sui 全节点的同步模式与磁盘规划

Sui 全节点支持不同的同步模式,这些模式在首次可用检查点的时间与磁盘占用和 I/O 之间进行权衡。从创世区块进行完整同步会重放整个账本历史,因此需要最多的磁盘和最长的初始追赶窗口。需要节点快速提供当前数据的运维人员,如果其 Sui 版本支持,可以考虑基于快照或基于检查点的同步,但确切的模式名称和可用性会随版本变化,必须对照当前的 Sui 全节点指南进行确认。

磁盘规划不仅仅关乎最终账本大小。在同步期间,节点会写入检查点、交易效果和索引数据,并且可能临时保存比稳态占用更多的数据。请在预期最终大小之上预留余量,以便压缩、索引和未来账本增长不会耗尽卷空间。在初始同步期间持续监控磁盘使用情况,因为磁盘满可能导致节点停滞,并产生与网络问题相同的检查点滞后症状。

I/O 特性与原始容量同样重要。同时进行同步和提供 RPC 的节点会争抢磁盘吞吐量,这可能同时拖慢同步和查询延迟。如果你计划提供生产流量,请根据预期读取负载以及同步工作负载来规划存储规模,并避免与无关的高 I/O 进程共享该卷。

配置文件中的数据库路径决定了这些数据的存放位置。尽可能将其放在专用卷上,并记录该路径,以便验证和监控步骤可以引用正确的位置。由于字段名称和默认值会在版本之间漂移,请在每次升级后重新检查数据库和同步相关配置,而不是假设之前的设置仍然适用。

  • 从创世区块完整同步:磁盘需求最大,追赶时间最长。
  • 基于快照或检查点的同步:如果版本支持,可以更快提供当前数据。
  • 在预期最终账本大小之上预留余量,用于压缩和增长。
  • 在初始同步期间监控磁盘使用情况;磁盘满可能导致节点停滞。
  • 在提供生产流量时,将同步 I/O 与查询 I/O 分离。
  • 将数据库路径放在专用卷上,并在升级后重新检查配置。

验证节点健康状态和网络身份

在将节点置于流量之前,请验证其健康并服务于正确的网络。调用 sui_getLatestCheckpointSequenceNumber 以确认节点正在产生检查点,并调用 sui_getChainIdentifier 以确认网络身份。Sui JSON-RPC 参考记录了这些方法及其返回类型。

确认检查点编号随时间递增。仍在追赶的节点将返回过时的检查点;卡住的节点则完全不会推进。将链标识符与官方 Sui 主网标识符进行交叉核对,以免在主网端点上提供测试网数据。

这些检查成本低廉,应作为部署门禁的一部分。如果任一检查失败,请勿将流量路由到该节点。

  • sui_getLatestCheckpointSequenceNumber:确认检查点生产。
  • sui_getChainIdentifier:确认网络身份。
  • 检查点必须在连续调用中递增。
  • 链标识符必须与目标网络的官方值匹配。

使用 curl 的可运行探针序列

JSON-RPC 2.0 信封由 JSON-RPC 2.0 规范定义。探针是一个 POST 请求,其 JSON 正文包含 jsonrpc、method、params 和 id。以下序列从你已使用所选接口启动的节点开始,然后使用 curl 对其进行探测。

将 URL 替换为你的节点绑定的地址和端口。如果你绑定到 localhost,请使用 http://127.0.0.1:<port>。如果你绑定在代理之后,请使用代理 URL。响应确认节点可达并提供预期的方法。

# Probe 1: latest checkpoint sequence number
curl -s -X POST http://127.0.0.1:9000 \
  -H 'Content-Type: application/json' \
  -d '{"jsonrpc":"2.0","id":1,"method":"sui_getLatestCheckpointSequenceNumber","params":[]}'

# Probe 2: total transaction blocks
curl -s -X POST http://127.0.0.1:9000 \
  -H 'Content-Type: application/json' \
  -d '{"jsonrpc":"2.0","id":2,"method":"sui_getTotalTransactionBlocks","params":[]}'

# Probe 3: chain identifier
curl -s -X POST http://127.0.0.1:9000 \
  -H 'Content-Type: application/json' \
  -d '{"jsonrpc":"2.0","id":3,"method":"sui_getChainIdentifier","params":[]}'

用于检查点增长率的 Node.js 轮询器

单次检查点读取是不够的;你需要知道检查点高度是否在推进。以下 Node.js 代码片段以固定间隔轮询 sui_getLatestCheckpointSequenceNumber 并打印增长率。针对你的节点 RPC URL 运行它。

该脚本使用现代 Node.js 中内置的 fetch API。根据你的监控需求调整间隔和持续时间。在持续窗口内增长率接近零表明节点停滞或仍在同步。

const RPC_URL = process.env.SUI_RPC_URL || 'http://127.0.0.1:9000';
const INTERVAL_MS = 5000;
const DURATION_MS = 60000;

async function getCheckpoint() {
  const res = await fetch(RPC_URL, {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({
      jsonrpc: '2.0',
      id: 1,
      method: 'sui_getLatestCheckpointSequenceNumber',
      params: []
    })
  });
  const json = await res.json();
  if (json.error) throw new Error(JSON.stringify(json.error));
  return Number(json.result);
}

(async () => {
  const start = Date.now();
  let first = await getCheckpoint();
  let last = first;
  console.log(`start checkpoint: ${first}`);
  while (Date.now() - start < DURATION_MS) {
    await new Promise(r => setTimeout(r, INTERVAL_MS));
    last = await getCheckpoint();
    const elapsed = (Date.now() - start) / 1000;
    const rate = (last - first) / elapsed;
    console.log(`checkpoint: ${last} | elapsed: ${elapsed.toFixed(1)}s | rate: ${rate.toFixed(2)} cp/s`);
  }
  console.log(`final checkpoint: ${last}`);
})();

用于可复现验证的结果表

将你的验证结果记录在表格中,以便跨节点、版本和时间进行比较。下表是模板;请用你自己的测量值填写。不要依赖本文中的数字,因为它们不是测量值。

对每一行使用相同的探针序列,以便比较有意义。如果你更改了 Sui 版本或接口,请添加新行而不是覆盖旧行。

  • Sui 版本:你正在运行的版本。
  • 启用的接口:HTTP JSON-RPC、WebSocket 或两者。
  • 绑定地址:localhost 或可路由地址和端口。
  • 是否公开暴露?:是/否,以及是否已就位代理和 TLS。
  • 链标识符:sui_getChainIdentifier 返回的值。
  • 检查点是否推进?:是/否,基于重复探针。
  • 同步滞后:你的检查点与网络尖端之间的差异(如果已知)。

局限性与运维权衡

从创世区块进行完整同步可能需要很长时间和大量磁盘。仍在追赶的节点将返回过时的检查点,如果你过早路由流量,可能会误导客户端。检查点滞后是正常的稳态状况,必须监控而不是假设为零。

在没有代理和 TLS 的情况下暴露 RPC 接口是不安全的。即使有代理,速率限制和身份验证也是你的责任。自运行节点在可用性或地理分布方面很少能与托管提供商匹敌。如果你的应用需要全球低延迟读取,托管端点可能更合适;请参阅 RPC 定价和 API 服务了解选项。

有关更深入的运维主题,请参阅 Sui RPC 延迟、Sui RPC 速率限制和计算单元、Sui 检查点流和账本服务以及 Sui 归档节点和历史 RPC。

  • 完整同步:持续时间长且磁盘使用量大。
  • 过时检查点:追赶期间是预期现象;不要过早提供流量。
  • 检查点滞后:正常的稳态;应监控而不是假设为零。
  • 暴露风险:公共端点必须使用代理和 TLS。
  • 可用性:自运行节点很少能与托管提供商的分布相匹配。

排查常见验证失败

如果 curl 返回连接被拒绝错误,则节点未在你探测的地址和端口上监听。确认配置中的绑定地址以及节点进程正在运行。如果你绑定到 localhost,请确保从同一主机进行探测。

如果 JSON-RPC 响应包含错误对象,请阅读错误代码和消息。方法未找到错误可能表明接口已禁用,或者方法名称在你的 Sui 版本中已更改。请对照 Sui JSON-RPC 参考进行核对。

如果检查点编号不推进,节点可能正在同步、停滞或与对等节点断开连接。检查节点日志和指标。如果链标识符与你的目标网络不匹配,则你运行了错误的创世;请在提供流量之前停止并重新配置。

  • 连接被拒绝:检查绑定地址、端口和进程状态。
  • 方法未找到:验证接口已启用以及你的版本中的方法名称。
  • 检查点不推进:检查同步状态、日志和对等节点连接。
  • 链标识符不匹配:创世错误;在提供服务之前重新配置。

生产就绪的后续步骤

一旦验证通过,将节点置于具有 TLS 和速率限制的反向代理之后。添加对检查点高度、同步滞后和资源使用情况的监控。对停滞的检查点和磁盘压力设置告警。

如果你需要超出节点保留期的历史数据,请考虑归档节点或托管服务。查看 OnFinality Learn 中心获取相关运维指南,并在 Sui 网络页面和 RPC 定价上比较托管选项。

保持你的 Sui 版本最新,并在每次升级后重新运行验证序列,因为配置字段和默认值可能会在版本之间发生变化。

  • 部署在具有 TLS 和速率限制的反向代理之后。
  • 监控检查点高度、同步滞后和资源使用情况。
  • 对停滞的检查点和磁盘压力设置告警。
  • 每次 Sui 升级后重新运行验证。

永远不用担心基础设施

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

开始