nullifier 是什么?Zcash 屏蔽池不靠余额怎么防双花 图 1
nullifier 是什么?Zcash 屏蔽池不靠余额怎么防双花 · 图 1

屏蔽池里的钱没有余额表。Zcash 的shielded pool(屏蔽池)不像银行账户那样记录”某人有多少钱”,它维护两样东西:一份所有被铸造过的票据承诺清单,和一份所有被花掉的票据作废凭证清单。每一笔私有余额都是一枚”note”(票据),花费它的唯一方式是公开一枚由这枚票据派生的 nullifier(作废凭证)。整个防双花体系就压在一条规则上:同一枚 nullifier 只允许上链一次。

nullifier 是什么

在 Zcash 的屏蔽池中,接收一笔付款会生成一枚票据,票据内含金额、收款地址和一个唯一性数据。票据本身不直接出现在链上——链上只发布它的承诺(commitment),一个绑定全部内容的哈希值,塞进一棵承诺树。花费时,交易必须附带一个零知识证明,证明的内容是:我知道承诺树里某枚票据的全部字段,我知道它的持有人私钥,而且我要公布这枚票据的 nullifier。nullifier 由票据的秘密数据和承诺值共同参与计算,同一枚票据算出的 nullifier 恒定,不同的票据之间又相互无法关联——看的人无法从 nullifier 反推出它对应承诺树里的哪一枚。

防双花怎么完成

机制示意(图片由 Agnes 生成,非产品界面或链上数据图)

节点验证一笔涉及屏蔽池的交易时做两件事:第一,验证零知识证明,确认输入票据真实存在于承诺树、金额收支平衡、签名正确;第二,检查这组 nullifier 是否已经在链上出现过。任何一枚 nullifier 命中已有记录,交易直接拒收。这意味着”同一枚票据花两次”在协议层不可能:两次花费必然公布同一枚 nullifier,第二笔永远过不了节点校验。整个过程中,旁观者只知道”某枚票据被花了”,不知道是哪一枚、谁花的、付给了谁。这就是隐私和防双花如何共存——作废凭证替代了余额扣减,去掉了身份与金额,保留了唯一性。

换代中的形状变化

这套机制从最早的 Sprout 协议一路延续到当前主力 Orchard 协议,但细节有明确的版本差异。ZIP 224 规范记载,Orchard 票据把 nullifier 本身作为同一次操作中生成票据的唯一性输入,确保票据与 nullifier 一一对应;其 nullifier 的计算使用 Poseidon 哈希加承诺值,与更早的 Sapling 采用不同曲线和不同公式。跨协议搬家也不是改写旧记录:资金从一个池进入另一个池要走透明的”价值平衡”字段,等于经过一次可见的进出。评估钱包时值得知道这一点——旧池票据不会因为升级自动出现在新池里。

隐私的真实边界

nullifier 机制隐藏的是”哪枚票据被花”,不隐藏交易本身。链上能看到每笔屏蔽池交易的证明大小、时间、以及进出池的金额:官方规范特别指出,把 Orchard 池的余额花给非 Orchard 地址会让该笔金额公开,这是透明池边界的必然代价,缓解办法是让尽量多的活动留在池内、使暴露交易成为少数。此外,各屏蔽池的匿名集互相独立,池子越新、活跃交易越少,可关联性分析的空间越大——这是 ZIP 224 在安全与隐私考量中直接写明的性质,而不是传闻。

小结

用一句话概括:屏蔽池把”防双花”从”核对余额”改写成”核对作废凭证的唯一性”。它让你不需要账户也能证明钱只花了一次,代价是找回、审计与合规全都系在查看密钥和证明系统上。看懂 Zcash 类隐私链的核验顺序也因此很清晰:先确认池子档位(透明还是屏蔽、哪一代协议),再确认跨池边界的金额暴露,最后才是证明系统本身的可信初始化与版本。顺带一提,这套”发布作废凭证”的思路并不专属 Zcash:任何采用承诺加 nullifier 结构的隐私方案,包括以太坊上把 ERC-20 与隐私模式并联的双轨代币设计,防双花的成败都落回同一处——链上是否严格维护那枚凭证的全集。本文只解释协议机制,不涉及任何资产价值判断,不构成投资建议。