Logo
新用户订阅 RPC,首月享 6.5 折优惠查看优惠
OnFinality Learn
网络与协议指南阅读约 11 分钟

链应用架构:构建与运营 AppChain

一份实用的工程指南,涵盖链应用的设计、部署与运营,从执行环境选择到 RPC 访问与验证。

TL;DR

链应用(常称为 AppChain 或应用专用区块链)是一种区块链,其执行、治理和资源策略限定于单一产品或协议,而非跨任意租户共享。本指南阐释链应用背后的架构决策,演示可复现的部署与验证流程,并展示链上线后如何暴露和测试 RPC 访问。它将有文档记录的协议行为、工程建议以及你必须针对自身部署运行的测量区分开来。将其作为构建与运营检查清单,然后咨询 RPC Assistant 以做出具体的端点或提供商决策。

什么是链应用以及何时适用

链应用是专用于单一应用或范围严格限定的协议的区块链。该术语与 AppChain 和应用专用区块链重叠。其定义性特征不是共识算法或虚拟机,而是资源边界。区块空间、费用策略、升级节奏以及验证者或排序器治理都针对单一产品进行调整,而非由不相关的工作负载共享。

这与在通用链上部署智能合约不同。在共享链上,你的应用与所有其他租户竞争区块空间,继承主链的费用市场,并受其升级和治理规则约束。链应用将这些决策内部化。当你的工作负载有特殊的吞吐量、隐私、合规或费用要求时,这种控制很有价值;而当你没有运营能力来运行验证者、监控和升级时,它则是一种负担。

本文涵盖工程路径:选择执行模型、部署、暴露 RPC 以及验证行为。它不推荐特定端点;关于该决策,请参阅 选择 Web3 RPC 提供商 的 RPC Assistant 指南。

  • 当你需要专用区块空间、自定义费用逻辑或主权治理时,选择链应用。
  • 当你的工作负载适中且希望继承安全性和工具链时,留在共享链上。
  • 将验证者或排序器运营视为首要成本,而非事后考虑。

先决条件与假设

以下工作流程假设你拥有可用的本地环境,包含 Docker、较新的 Node.js 或 Python 运行时,并且如果你在现有链上进行原型设计,则拥有测试网络上已注资的账户。它假设你可以运行容器化节点或连接到托管 RPC 端点。它不假设你已选择共识客户端、执行客户端或数据可用性层。

本指南引用网络时,使用占位符如 RPC_URL 或你控制的测试网。不要将生产私钥粘贴到脚本中。关于节点托管模式及运行基础设施的运营方面,区块链节点托管指南 涵盖了同样适用于链应用的配置和生命周期问题。

架构心智模型:执行、结算与访问

链应用在你的设计中有三个值得分离的层。执行层运行你的应用逻辑,无论是 EVM、WASM 运行时还是自定义状态机。结算层提供最终性,在模块化设计中还提供数据可用性。访问层是客户端如何到达链:RPC 端点、索引器和桥接。

大多数早期设计错误源于混淆这些层。团队可能因为熟悉而选择执行环境,然后发现其结算假设强制要求特定的桥接或数据可用性提供商。在编写应用代码之前,先写下层之间的契约。决定链是主权的(拥有自己的验证者集)还是向父链提交的 rollup 式链。决定状态是存储在链上、数据可用性层还是链下带承诺。

对于在现有生态系统中构建的团队,网络目录 是在确定执行模型之前确认支持哪些链和运行时的最快方式。

  • 执行:虚拟机选择、gas 模型、预编译、升级机制。
  • 结算:最终性来源、验证者或排序器集、罚没与治理。
  • 访问:RPC 接口、索引、桥接合约和客户端 SDK。

为你的链应用选择执行环境

执行环境决定你的开发者工具、安全面和迁移成本。EVM 兼容运行时为你提供成熟的工具、钱包和审计员,代价是继承 EVM 的怪癖和拥挤的设计空间。WASM 运行时为自定义逻辑提供更多灵活性和通常更好的性能特征,但工具生态系统较小。自定义状态机提供最大控制权和最大维护负担。

一个实用的比较方法是根据四个标准对每个选项评分:工具成熟度、审计可用性、升级安全性和团队熟悉度。在决策会议之前记录评分。这可以防止常见的失败模式,即执行选择由最直言不讳的人做出,而非由将运营它的团队做出。

如果你先在公共链上进行原型设计,请确认运行时和 RPC 兼容性。多链 RPC 端点指南 解释了端点行为在不同运行时之间的差异,这在你后来迁移到自己的链时很重要。

部署工作流程:从本地链到可访问的 RPC

部署工作流程有五个阶段:本地创世、单节点运行、多节点测试网、RPC 暴露和验证。在继续之前完成每个阶段。跳过单节点阶段是多节点故障难以诊断的最常见原因。

从本地创世文件和单个节点开始。确认区块正在产生,并且你的应用合约或模块已部署。然后添加第二个节点并确认对等发现和状态同步。只有在那之后,才应向客户端暴露 RPC 端点。

以下配置片段展示了最小节点配置的结构。字段名称因客户端而异;将其视为模板,而非可直接使用的文件。

# node-config.toml (illustrative; field names vary by client)
[chain]
chain_id = 9001
genesis = "./genesis.json"

[rpc]
http_addr = "0.0.0.0"
http_port = 8545
ws_port = 8546
cors = ["https://app.example.com"]

[p2p]
listen_addr = "0.0.0.0:30303"
bootnodes = ["NODE_ID@BOOTNODE_HOST:30303"]

[metrics]
enabled = true
addr = "0.0.0.0:9090"

暴露和测试 RPC 访问

一旦链产生区块,客户端就需要 RPC 接口。在具有速率限制的反向代理后面暴露 HTTP 和 WebSocket 端点,并将节点的 admin 和 debug 命名空间保持在公共接口之外。对于生产流量,托管端点或专用节点通常比直接暴露验证者更可取。

以下 curl 和 JavaScript 片段验证基本链健康。将 RPC_URL 替换为你的端点。这些调用是只读的,可以安全地对测试网运行。

curl -s -X POST RPC_URL \
  -H 'Content-Type: application/json' \
  -d '{"jsonrpc":"2.0","id":1,"method":"eth_chainId","params":[]}'

curl -s -X POST RPC_URL \
  -H 'Content-Type: application/json' \
  -d '{"jsonrpc":"2.0","id":2,"method":"eth_blockNumber","params":[]}'

验证程序与预期结果

验证应脚本化,以便在每次部署后运行。以下程序检查链身份、区块进展和合约读取。将输出记录在结果表中,以便随时间比较部署。

按顺序运行检查。如果链 ID 与你的创世不匹配,停止;所有下游检查都无意义。如果区块号在相隔三十秒的两次采样中没有前进,在测试合约之前调查区块生产。如果合约读取失败,对照你的部署产物确认合约地址和 ABI。

下表是待填写的模板。不要复制其他环境的数字;测量你自己的。

// verify.mjs
const RPC_URL = process.env.RPC_URL;
const call = async (method, params = []) => {
  const res = await fetch(RPC_URL, {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({ jsonrpc: '2.0', id: 1, method, params }),
  });
  const json = await res.json();
  if (json.error) throw new Error(json.error.message);
  return json.result;
};

const chainId = await call('eth_chainId');
const blockA = await call('eth_blockNumber');
await new Promise(r => setTimeout(r, 30000));
const blockB = await call('eth_blockNumber');

console.log({ chainId, blockA, blockB, advancing: blockA !== blockB });

每次部署需填写的结果表

检查项方法预期观察值通过
链身份eth_chainId与创世链 ID 匹配记录是/否
区块生产eth_blockNumber(两次采样)区块号增加记录是/否
合约读取eth_call返回预期值记录是/否
对等节点数net_peerCount至少一个对等节点记录是/否
RPC 延迟计时请求在你的 SLO 内记录是/否

从你自己的运行中填充“观察值”列。“预期”列是设计目标,不是基准。如果你需要比较不同提供商的端点性能,请遵循 RPC 端点指南 中的可复现测量方法,而不是依赖供应商声明。

排查常见的链应用故障

大多数故障分为四类:创世不匹配、对等发现失败、RPC 配置错误和状态分歧。创世不匹配表现为节点之间的链 ID 或区块哈希不一致。对等发现失败表现为零对等节点和区块停滞。RPC 配置错误表现为连接被拒绝或来自客户端的 CORS 错误。状态分歧表现为节点在相同高度报告不同的区块哈希。

对于每个类别,在重启之前捕获日志。重启分歧节点而不保留日志会破坏你需要的证据。对于 RPC 特定问题,检查反向代理配置并确认节点的 HTTP 命名空间已启用。如果你使用托管端点,确认端点支持你的客户端调用的方法;一些提供商限制 debug 和 trace 命名空间。

当问题在于端点可靠性而非你的链时,RPC Assistant 关于 可靠 RPC 端点 的指南说明了评估标准,尽管该页面针对的是不同的网络。

  • 创世不匹配:比较所有节点的创世哈希。
  • 无对等节点:验证引导节点 ID、防火墙规则和 P2P 端口。
  • RPC 错误:检查 CORS、速率限制和启用的命名空间。
  • 分歧:在重启之前比较相同高度的区块哈希。

局限性、权衡与运营成本

链应用以共享安全性和工具链换取控制权。你需负责验证者或排序器运营、升级、监控和事件响应。这一成本是真实且经常性的。对于小型团队,运营负担往往超过主权带来的好处。

还存在生态系统权衡。新的链应用开始时钱包支持、桥接流动性和索引器覆盖有限。计划一个引导期,在此期间你提供自己的工具。如果你需要专用基础设施而不自己运行验证者,专用节点 选项值得与自托管进行评估。

最后,在优化之前进行测量。不要假设你的链应用需要自定义执行环境,直到你在共享链上分析了工作负载。API 服务 和 RPC 定价 页面帮助你推理该决策的成本方面。

后续步骤:加固与扩展

验证通过后,加固部署。为区块高度、对等节点数和 RPC 错误率添加指标和告警。设置一个镜像生产配置的暂存链,以便升级在到达验证者之前得到测试。记录升级程序,包括谁可以暂停链以及治理如何批准变更。

对于扩展,尽早决定是垂直扩展(更大的节点)、水平扩展(负载均衡器后面的更多 RPC 副本),还是将读取卸载到索引器。每种都有不同的故障模式。每次更改后重新运行验证表,并保留结果,以便随时间比较部署。

当你准备为链应用选择具体端点或提供商时,使用 RPC Assistant 获取简短推荐,并返回此处了解方法论。

永远不用担心基础设施

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

开始