旋转门机制
TL;DR
- 旋转门机制是一项公开的记账规则,用于追踪每个 shielded pool 有多少价值流入和流出
- 它让任何人都能验证某个池子支付出去的价值永远不会超过流入的价值,即使池内的交易是私密的
- 这能保护 ZEC 供应量免受隐藏漏洞影响,因为伪造的币如果要离开某个池子,就一定会破坏这项计数
- 池内支付保持私密。在池子之间转移 ZEC 的交易会显示其转移的金额
- 旋转门机制正是 Orchard 到 Ironwood 迁移能够证明 shielded 供应量健全的原因
这篇内容适合谁
- 想了解 Zcash 如何确保其隐私供应量可信的任何人
- 正在关注 Orchard 到 Ironwood 迁移,并想知道它如何证明供应量真实的用户
- 好奇一个隐私货币系统如何仍然能够被审计的新手
挑战是什么
Shielded Zcash 会隐藏金额、发送方和接收方。这正是它实现隐私的关键所在。但这也带来一个棘手的问题:如果没人能看到 shielded pool 内部,怎么知道其中 ZEC 的总量是正确的?你要如何审计一笔你看不见的钱?
如果某个漏洞曾让人能够在某个 shielded pool 内伪造币,那么这种伪造会被保护诚实用户的同一套隐私机制隐藏起来。没有保障机制,这种不确定性就会削弱人们对整体供应量的信心。旋转门机制就是解决这一问题的保障。
什么是旋转门机制
可以把每个 shielded pool 想象成一个只有一扇可计数门口的房间。每当有价值从外部进入池子,或从池子离开流向别处时,它都必须通过这扇门,并被公开计入总数。房间里的交易仍然是私密的,但门口的累计总额对所有人可见。
规则很简单:一个池子流出的价值绝不能多于流入的价值。节点会拒绝任何会让池子余额降到零以下的区块。人们始终知道某个池子被认为包含多少价值,因为它就是“总流入减去总流出”。这个公开累计值就是旋转门机制。
它如何运作
在 Zcash 的历史中,存在过多个 shielded pool,例如 Sprout、Sapling 和 Orchard。价值会在透明链和这些池子之间流动,有时也会在池子之间转移。旋转门机制会监视这些流动:
- 当 ZEC 进入某个 shielded pool 时,该金额会被加入这个池子的公开余额
- 当 ZEC 从某个池子流出时,该金额会被扣除
- 网络会拒绝任何会让某个池子余额变为负数的区块,这意味着流出的价值超过了历史上的总流入
- 每笔交易只显示其流入或流出某个池子的净流量,即其价值平衡。对于在同一个池子内完成的支付,这就只是手续费
网络会以这种方式追踪每个 value pool 的余额,包括 Sprout、Sapling、Orchard、新的 Ironwood pool,以及 transparent 和 lockbox 的余额。因此,即使某个池子的具体内容被隐藏,最终能流出的最大值也始终受限于它流入过多少价值。隐藏的通胀无法逃逸到流通中。
如何检查 value balance
门口的计数之所以可信,是因为每笔交易都必须证明它移动的是一个真实的金额,即使金额本身仍被隐藏。每笔 shielded 交易都会公布一个诚实的数字:它净流入或净流出该池子的价值,称为它的 value balance。正的 value balance 表示资金从池子流向透明侧,负的 value balance 表示资金流入池子。私密细节依然封存,但这个单一的净值是公开的,而旋转门机制正是把这些净值累加起来。
巧妙之处在于,交易如何在不暴露背后私密金额的前提下,证明这个公开数字是真实的。不同池子的机制并不相同,而这正是旋转门机制真正运作的核心。
在最初的 Sprout pool 中,每笔交易都会使用一个 JoinSplit。一个 JoinSplit 会花费两个隐藏 note,并创建两个新的 note,同时携带两个公开字段:vpub_old,表示从透明侧进入 shielded pool 的价值;vpub_new,表示从池子流回透明侧的价值。每个 JoinSplit 本身都必须平衡,而它的零知识证明会保证隐藏输入与隐藏输出的加总是正确的。Sprout 的池子余额,就是整条链上所有 vpub_old 减去所有 vpub_new 的累计总和。这也是为什么 Sprout 稍后会成为一个很有用的例子:因为 vpub_old 是价值进入该池子的唯一方式,所以只需一条把它关闭的规则,就可以永久封住这个池子。
在 Sapling、Orchard 和 Ironwood 中,余额是通过一种更聪明的方式来证明的,即 binding signature。与每次转账都单独平衡不同,整笔交易会使用 value commitment 对每个隐藏金额作出承诺。value commitment 就像一个封住数字的信封,它由同态 Pedersen commitment 构造而成,具有一个特殊性质:这些信封可以在不打开的情况下相加和相减。网络会把所有输入 commitment 相加,再减去所有输出 commitment,然后将结果与交易唯一声明的净值——它的 valueBalance 字段——进行比较。只有当交易中的隐藏金额确实与这个公开的 valueBalance 相匹配时,交易才能对组合后的 commitments 生成一个有效的 binding signature。如果有人试图转移超过其声明值的价值,那么这些 commitments 就无法对上,binding signature 就无法通过验证,交易也会被拒绝。Ironwood 使用与 Orchard 相同的协议,因此其工作方式也完全一样。
这也是为什么跨池转账能够被安全检查。当资金从一个 shielded pool 移动到另一个时,例如从 Orchard 进入 Ironwood,交易无法把这些金额从记账中隐藏起来。每个池子都有自己的 value balance,并且都必须由自身的证明来满足:Orchard 一侧必须通过它的 binding signature 展示对应的流出,Ironwood 一侧则必须通过它自己的证明展示对应的流入。离开一个池子的价值和进入另一个池子的价值,各自都是独立证明的,所以跨池转移本质上就是一次交易中发生了两次旋转门通行:一次流出,一次流入。即使底层金额保持私密,这两者仍然都会被公开计入总账。
因此,旋转门机制并不是建立在信任之上。每笔交易都会以数学方式证明它自身的净影响,网络会按池子汇总这些已被证明的净影响,而一条共识规则(ZIP 209)会拒绝任何让某个池子余额变为负数的区块。交易层证明,链层执行。
为什么它很重要
旋转门机制同时为 Zcash 带来了三件事。
第一,它将风险隔离开来。某个池子中的密码学漏洞会被限制在该池子内部,因为旋转门机制会阻止伪造价值流入更广泛的供应体系。
第二,它让社区能够事后验证供应量。如果后来发现了一个漏洞,旋转门记录会显示某个池子流出的价值是否曾超过流入的价值。干净的记录是“没有伪造被利用”的强有力证据。
第三,它在做到这一切的同时,保持池内支付的隐私。每笔交易只公开流入或流出某个池的净流量;对于同一池内的支付而言,这仅为手续费。池之间的转账,例如从 Orchard 到 Ironwood,会显示跨池金额。可审计性与隐私得以并存,这并不常见,也是 Zcash 一个低调但重要的优势。
旋转门机制的实际应用
旋转门机制并不新鲜,而且它在 Zcash 历史上的关键时刻已经被使用过。
当 Zcash 从最初的 Sprout pool 迁移到更新的 Sapling pool 时,旋转门机制就守护了这次过渡。后来,Sprout pool 被施加限制,不能再接收新的流入,这鼓励了用户迁移,同时旋转门机制继续保证记账诚实。多年后,Sprout 从未发生价值被不当转出的事实,本身就构成了有力证据,说明其早期密码学从未被成功利用。
同样的设计现在也在守护 Orchard 到 Ironwood 的迁移。2026 年,人们在 Orchard 证明系统中发现并修复了一个 soundness bug。没有任何证据表明它曾被利用过,但由于 shielded 活动本身是私密的,因此无法做到绝对确定。应对方案是封闭旧的 Orchard pool,让所有人通过旋转门机制把资金迁移到 Ironwood——一个采用修正后协议的新池子。强制资金通过旋转门,意味着任何假设存在但被遗留在原处的伪造币都无法跟着一起迁出;而一旦迁移完成,任何人都可以确认 shielded 供应量是健全的。
单向弃用池子
旋转门机制使得安全地淘汰一个旧池子成为可能,而且只能单向进行,同时绝不会破坏供应量保证。诀窍在于关闭入口,同时保留出口开放。
Sprout 是最清晰的例子。为了弃用它,ZIP 211 增加了一条单独的共识规则:从其激活高度开始,每个 JoinSplit 的 vpub_old 字段都必须为零。由于 vpub_old 是价值进入 Sprout 的唯一方式,强制它为零就意味着再也不会有新价值流入,同时价值仍然可以流向透明侧,或者继续流向 Sapling。这个池子于是变成了单向池。它只能排空,不能再填满。旋转门机制会在整个过程中持续计数,因此余额可以随着资金流出而下降,但绝不会上升,也绝不会变成负数。
Orchard 到 Ironwood 的迁移使用的是同样的思路。在 NU6.3 升级中,Orchard pool 将关闭新的流入,而钱包会被引导把 Orchard 资金通过旋转门机制发送到新的 Ironwood pool。Orchard 会变成一个只能排空的单向池。由于每一次流出都必须是一次经过证明的旋转门通行,因此任何假设存在并被遗留在 Orchard 中的伪造价值,都无法悄悄跟随诚实资金一起流出。它会被困在一个只能排空、并且门口受到监视的池子里。随着时间推移,这会让旧池子逐步趋近清空,并让任何人都能确认:流出来的价值从未超过诚实流入的价值。
这就是旋转门机制之所以重要的更深层原因,超越了简单记账本身。它是一种机制,使 Zcash 能够弃用一个 shielded pool——无论是像 Sprout 那样为了降低复杂度,还是像 Orchard 那样为了从已发现的漏洞中恢复——同时继续维持关于供应量的连续、公开、可证明保证。
常见误解
- 旋转门机制不会泄露谁向谁发送了什么。它会显示任何在池子之间转移 ZEC 的交易金额
- 它并不会点名识别伪造者。它限制的是一个池子最多能流出多少价值,而这正是保护供应量的关键
- 它不是专为 Ironwood 发明的新机制。它一直在守护 Zcash 历史上每一次主要的 shielded pool 迁移
- 池子公开的总量不会削弱池内支付的隐私。在池子之间转移 ZEC 会显示转移金额,这正是 ZIP 318 要求钱包随着时间推移按标准金额迁移的原因
资源
- ZIP 209:禁止超出范围的链上 Value Pool 余额 - 旋转门机制背后的共识规则
- ZIP 211:禁用向 Sprout 链上 Value Pool 添加新价值 - Sprout pool 如何被关闭以阻止新存入
- ZIP 258:NU6.3 - 引入 Ironwood pool 并引导价值通过旋转门机制流动的升级
- 针对伪造的旋转门机制执行 - 来自 Electric Coin Company 的原始解释
- Zcash 协议规范 - 完整细节请参阅其中关于 balance 和 binding signature 的章节
- Value Pools,Zebra Book - 节点如何追踪每个池子的 value balance
相关页面