隐私与技术

零知识证明怎么让 Zcash 隐藏转账信息?zk-SNARKs 与可信设置

完全屏蔽的交易在链上看不到付款方、收款方和金额,节点却能确认它合法,靠的是零知识证明。Halo 2 去掉了可信设置,但 2018 年发现的 Sprout 伪造漏洞和 2026 年的 Orchard 电路缺陷说明风险没有消失;进出屏蔽池的金额也始终公开。

一笔完全屏蔽的 Zcash 交易在链上看不到付款方、收款方和金额,全网节点却仍能确认这笔钱真实存在、没有被花过两次、收支相抵。完成这件事的工具是零知识证明。它并非没有前提:Sprout 和 Sapling 用的参数来自可信设置仪式,2022 年换上的 Halo 2 去掉了这一前提,可 2026 年 Orchard 电路仍被发现一处可靠性缺陷;资金转入、转出屏蔽池的金额,也一直是公开的。

屏蔽交易向网络证明了什么

比特币节点验证一笔交易时,能直接看到资金来自哪个地址、余额够不够、签名是否正确,这些信息本来就公开。Zcash 的屏蔽交易把这些内容加密了,节点看不到,但仍然要确认几个条件同时成立:花钱的人确实掌握这笔资金的花费密钥;这笔资金此前没有被花过;输入总额等于输出总额加手续费,没有凭空多出钱。

零知识证明的作用,是让付款方在本地生成一段很短的数据,也就是「证明」,随交易一起广播。节点运行验证算法,只能得到「条件全部成立」或「不成立」两种结论,得不到资金来自哪一笔记录、金额是多少。防止重复花费靠的是一个配套设计:屏蔽资金被花掉时,链上会留下一个作废标记(nullifier),节点只检查这个标记以前有没有出现过,却无法从标记反推出被花掉的是哪一笔。

可以用一个不太严谨的比方来理解。假设你要向门卫证明自己知道保险柜的密码,但不能把密码说出口。门卫往柜子里放一张写了字的纸条,你打开柜子念出纸条上的字,门卫就相信你知道密码,却始终不知道密码是什么。真实的零知识证明不需要门卫临场出题,但「证明自己知道,而不透露知道的内容」这一点是一样的。

zk-SNARKs 几个字母分别是什么意思

zk-SNARK 是 Zero-Knowledge Succinct Non-Interactive Argument of Knowledge 的缩写。z.cash 的 What are zk-SNARKs? 对它有逐词解释,拆开来看:

  • 零知识:验证者除了「这个陈述为真」之外,学不到其他信息。
  • 简洁(Succinct):按 z.cash 的说法,证明只有几百字节,即使对应的程序很大,也能在几毫秒内验证完。
  • 非交互(Non-Interactive):证明是证明方发给验证方的一条消息,不需要你问我答好几轮。
  • 知识论证(Argument of Knowledge):证明方不只是说明「存在满足条件的秘密」,而是表明自己确实掌握这个秘密,比如花费密钥。

「简洁」和「非交互」对一条公链很关键。每个全节点都要验证每笔交易,如果证明又大又慢,或者需要和付款方实时对话,网络就跑不起来。生成证明这一侧的成本也在下降:z.cash 的 Sapling 升级页 提到,向 Sapling 地址付款的交易只需几秒、约 40MB 内存就能构建完成,手机钱包使用屏蔽交易因此变得现实。

Sprout、Sapling、Orchard 到 Ironwood:屏蔽池为什么换了四代

Zcash 的屏蔽资金按协议版本存放在不同的池里。每一代池用的证明系统或参数不同,新池上线后,旧池通常会被逐步限制。

屏蔽池 启用 特点 截至 2026 年 10 月的状态
Sprout 2016 年主网上线 最初使用 BCTV14 证明系统,参数来自 2016 年可信设置 2020 年 Canopy 起不再接受新资金;NU7 草案拟让 v4 交易失效,届时 Sprout 资金将无法花费
Sapling 2018 年 10 月 Sapling 升级 构建交易更快、更省内存;引入完整查看密钥 仍在使用
Orchard 2022 年 5 月 31 日 NU5 升级 采用 Halo 2,不需要可信设置 2026 年 7 月 NU6.3 起只能转出,不能转入
Ironwood 2026 年 7 月 28 日 NU6.3 升级 新产生的屏蔽资金进入此池;输出票据采用 ZIP 2005 规定的量子可恢复格式 当前接收新屏蔽资金

依据:z.cash 网络升级页、ZIP 258、ZIP 259。

池与池之间有一道配套的保护,通常称为「旋转门」(turnstile)。ZIP 209 要求节点为每个屏蔽池记一本账:转入多少、转出多少,都由交易里公开的数值计算出来;任何一个池的余额都不允许变成负数,所有池加起来也不能超过总量上限。这样一来,即使某个池内部的证明出了问题,能从这个池转出去的总额也不可能超过当初转进去的总额。NU6.3 要求资金从 Orchard 经旋转门转入 Ironwood,z.cash 的说法是,这让流通总量的完整性可以被独立核验。

2016 年可信设置仪式:争议在哪里

Sprout 和 Sapling 使用的 zk-SNARKs 都需要一个初始化步骤,生成证明方和验证方共用的公开参数。z.cash 的 zk-SNARKs 页写到,Zcash 先后为 Sprout 和 Sapling 举行过两次精心设计的多方仪式来生成这些参数。

麻烦在于,生成过程中会产生一份秘密数据,ECC 的文章称之为「有毒废料」(toxic waste)。ECC 在 2016 年 10 月 26 日发布的 The Design of the Ceremony 说明了设计:六个人各自完成仪式的一部分,只要其中至少一人成功删除了自己那份密钥碎片,有毒废料就无法被重建。文章还写明,假如有人真的拿到了有毒废料,能做的只有伪造货币,无法破坏他人的隐私,也无法偷走别人的 ZEC。

争议在于这件事很难从外部验证。参与者是否真的删除了碎片,局外人只能选择相信;屏蔽池里的金额又是加密的,即便发生伪造,也不会在单笔交易上露出痕迹。同一篇文章也提醒,伪造风险不只来自有毒废料,其他缺陷同样可能导致伪造。

这一提醒后来应验过一次。ECC 在 2019 年 2 月 5 日发布的 Zcash Counterfeiting Vulnerability Successfully Remediated 中披露了编号 CVE-2019-7167 的漏洞:2018 年 3 月 1 日,ECC 的密码学家 Ariel Gabizon 发现 Sprout 所用的 BCTV14 证明系统存在可被用来伪造的缺陷;2018 年 10 月的 Sapling 升级把 Sprout 迁到 Groth16 证明系统,问题随之修复。ECC 表示,没有证据显示其他人发现过这一漏洞或发生过伪造,对 Sprout 池总额的监测也未见异常。

Halo 2 去掉可信设置,风险就消失了吗

2022 年 5 月 31 日,NU5 在区块高度 1,687,104 激活。ECC 当天的博客 NU5 activates on mainnet 说明,这次升级采用 Halo 证明系统的 2.0 版本 Halo 2(Halo 最早见于 2019 年的论文),此后新的 Orchard 屏蔽交易不再依赖参数生成仪式,「有毒废料」这一信任前提也就不存在了。

去掉可信设置,消除的是一类特定风险,电路本身写错的可能性仍然存在。ZIP 257 记录了 2026 年的一次事件:5 月 29 日,安全研究者 Taylor Hornby 报告 Orchard 电路存在一处可靠性(soundness)缺陷,原因是可变基标量乘法组件缺少一项约束,理论上可能导致余额违规和资金被盗。应对分两步:先通过紧急版本从区块高度 3,363,426 起暂停 Orchard 交易,再由 NU6.2 换上修正后的电路和新的验证密钥。z.cash 记载 NU6.2 于 2026 年 6 月 3 日在区块高度 3,364,600 激活。

Zodl 网站 2026 年 6 月 2 日发布的 Orchard Vulnerability Successfully Remediated 补充了几点:Orchard 交易暂停约 24 小时后恢复;没有证据显示漏洞被利用;借助旋转门所做的分析没有发现未经授权的价值创造,ZEC 总量不受影响;用户隐私不受这一漏洞影响,Sapling 和透明交易照常运行。随后的 NU6.3 新增 Ironwood 池,把新的屏蔽资金从 Orchard 引了过去。

把 2018 年和 2026 年两次事件放在一起,可以得出一个比较稳妥的判断:零知识证明系统的风险分布在参数、电路和实现几个层面,换掉其中一层并不能一劳永逸;旋转门这类在链上公开记账的机制,是事后确认总量没有被破坏的依据。

查看密钥,以及屏蔽交易保护不到的地方

屏蔽并不等于对谁都不可见。按 ZIP 316,持有人可以导出统一完整查看密钥(UFVK),让对方看到全部收支;也可以只导出统一收入查看密钥(UIVK),让对方只看到收入。企业年度审计、个人向税务顾问说明资金来源,都可以这样完成,不必把资金转回透明地址。

屏蔽交易保护的范围也有边界,下面几类信息仍然可能被看到:

  • 透明地址的一切:t 开头地址的收发记录和余额,与比特币一样公开。
  • 进出屏蔽池的金额:旋转门按公开数值记账,所以一笔交易往屏蔽池转入或转出多少,链上可见。透明地址先收到一笔钱、随后同额转入屏蔽池,这两步可以被关联起来。
  • 使用习惯:Kappos、Yousaf、Maller、Meiklejohn 在 2018 年 USENIX Security 发表的 An Empirical Analysis of Anonymity in Zcash 指出,利用可识别的使用模式,靠简单的启发式规则就能明显缩小匿名集。这项研究早于之后的多次升级,但资金进出屏蔽池会暴露信息这一思路,至今仍有参考价值。
  • 设备与网络层面:z.cash 的 Useful Tips when using Zcash 建议保护好设备、考虑运行自己的节点、不随意透露身份信息,这些都在协议之外。

屏蔽交易在全部交易中占多大比例,会随时间变化。想看当前情况,可以查区块浏览器或社区统计页,并留意它统计的是交易笔数还是池内余额。

隐私保护有正当用途:企业不想让竞争对手从链上看到供应商名单和付款金额,个人不想让工资、医疗开支被陌生人随意查看。监管方的关切同样真实,各地规则见 ZEC 价格为什么波动大?流动性、交易所下架和隐私币监管。在交易所买入后提币该选哪类地址,见 ZEC 在哪买、能不能提到屏蔽地址?购买和提币前要确认的事;各类地址本身的区别,见 Zcash 是什么。

延伸阅读

  • z.cash:What are zk-SNARKs?:zk-SNARK 各个词的含义,以及 Zcash 为 Sprout、Sapling 生成参数的多方仪式。
  • ZIP 209:每个屏蔽池怎样按公开数值记账、为什么余额不能变成负数。
  • ZIP 257:2026 年 Orchard 电路缺陷的成因和 NU6.2 的修复步骤。
  • ZIP 316:统一地址,以及统一完整查看密钥(UFVK)、统一收入查看密钥(UIVK)的定义。