跳过导航
XChain 文档

5 · 安全

最后更新: 2026/08/07阅读约 1 分钟

XChain 的安全是按资产计,而不是按链计。每项资产都带一个最低安全等级,而高价值资产根本无法存在于数据域中。这让「降级」攻击在结构上不可能发生,也把价值的安全建立在密码学与资本之上,而不是建立在信任一个小型验证者集合之上。

面向高价值的三层

对于高价值(T0–T1),三层叠加:

  1. ZK 有效性证明 —— 即便委员会被完全攻陷,也无法伪造出无效状态;它失去的是活性,不是安全性。
  2. 全局 restaking —— 任何一条链上的欺诈都会罚没全局资本。
  3. Watcher / 欺诈证明 —— 侦测与挑战。

低价值数据(T3–T4)只由发布证明(proof-of-publication)来保障。三个链安全等级覆盖了整个区间,而 pessimistic proof 在其上提供故障隔离:一条出问题的链最多只能损失它自己的那一份。

安全等级适用于由什么支撑可以承载高价值吗?
SOVEREIGNT3–T4 · 数据域自己的验证者 + 发布证明不可以 —— 由 UAC 在结构上禁止
SHAREDT1–T2 · ExecutionPartial Set Security —— 借来的验证者集合可以,以其等级为上限
ZK_SECUREDT0–T1 · Settlement / Value强制有效性证明 + 全局 restaking + watchers可以 —— 最高等级

图 5 — 安全按价值投入:价值域用三层叠加,边缘只用发布证明。

验证实际要花多少

「验证,而不是重新执行」在有人真去测量之前只是一个论断,所以这里是数字。它们来自真实的 Groth16/BN254 验证路径——就是已经合并进 master 并在 devnet 节点上端到端得到证明的那条。⚠️ 它们不是对公开测试网的描述,那里仍然运行着升级前的二进制和 MOCK prover;这个区分记录在 现状与实时网络,这里不做含糊处理。

测得项数值为什么要紧
验证一份状态转移证书~1.19 毫秒(一次 BN254 配对,纯 Go,在 DeliverTx 内部)3,000 毫秒 的出块节奏下,每个块可以验证约 2,500 份证书,验证才会成为瓶颈
计算公开输入 MiMC(prev,tx,new)~14 微秒由链自己推导,所以一份证明被绑定在唯一一次状态转移上,无法挪去用于另一次
groth16.Verify 的成本与电路规模的关系恒定 —— 与公开输入的数量、与约束数都无关因此 1.19 毫秒这个数字同样代表真实的 SP1 验证密钥,而不只是当前的替身电路
生成一份证明(SP1 wrap → Groth16)~1,597 万条约束,~21.5 GB 内存按构造就在链下——它从不在验证者上运行。 生成证明需要一个 prover 网络,或一台 ≥64 GB 的机器

这种不对称正是整套架构的要义。生成一份证明重到必须有专用基础设施;检查一份证明轻到对出块节奏毫无影响。这就是为什么当边缘数据量增长时,Root 的成本能几乎保持恒定——而这也正是为什么 prover 的供给被坦白列为一项尚未解决的经济难题写在 开放问题 里,而不是被当作已经解决。

做硬在实际中是什么样子

有三项性质承重,而每一项都是被检验过的,不是被断言的:

确定性。 验证器不使用浮点,也不使用随机数。这不是锦上添花:如果某个验证者算出不同的结果,app hash 就会分叉,链会停下。这一点通过重复同一次验证多次得到相同结果来验证,外加一次端到端运行——两个验证者在块内验证一份真实证明之后得到相同的 app hash。

优雅地拒绝垃圾。 任何从交易里来的东西都是敌意输入,而在 DeliverTx 内部,一次 panic 或一次挂死就是链停。模糊测试找到了一个真实案例:证明解码器读取了一个不受信任的 nbCommitments 字段并据此分配内存,于是攻击者把它设成大约四十亿,就能触发一次 ~256 GB 的分配——这是一次逐笔交易的拒绝服务,足以让链停下。修复方式是在证明抵达密码学库之前施加一道确定性的形状守卫(长度必须恰好符合预期,commitment 数为 0);超时方案被否决,因为它会破坏确定性。修复之后:426 万次干净的模糊测试执行,那个曾经导致挂死的输入被留作回归测试,如今在一秒内跑完;在活节点上,恶意输入被拒绝而节点继续出块。

为自己造成的开销付费。 一个更微妙的发现:真实证明与 MOCK 之间的 gas 差额(约 48,191 对约 40,638)几乎完全来自存储一份更大的证明,而不是来自验证实际花掉的那 ~1.19 毫秒 CPU —— 因为 gas 是按存储操作计量的,而不是按处理器内部的纯计算计量的。攻击者因此可以靠刷格式正确但无效的证明,用很低的价钱买到真实的 CPU。修复方式是在执行验证之前显式收取这笔费用,让手续费反映被强加的成本。

这些都不是靠在设计上推演出来的,而是靠把它跑起来才发现的。这一段就是一个公开测试网存在的理由。

要点: 把安全等级绑定到每一项资产上是那块拱心石——它把「别把价值放错地方」从一条建议变成了一项结构性保证。到目前为止点出的每一项保证——域边界、READ/WRITE 拆分、按资产分级——都必须在某个小到可以审计、可以信任的地方被强制执行。那个地方就是窄腰:七个原语,下一节详述。