1985年,三位MIT的研究者Shafi Goldwasser、Silvio Micali和Charles Rackoff向STOC会议提交了一篇论文。这篇题为《The Knowledge Complexity of Interactive Proof Systems》的论文提出了一个看似矛盾的问题:一个人能否在不泄露任何信息的情况下,让别人相信他确实知道某个秘密?

这个问题的答案不仅开创了一个全新的密码学领域,更在四十年后成为支撑数千亿美元区块链生态的核心技术。

三个看似不可能同时满足的性质

零知识证明需要同时满足三个性质:完整性(Completeness)——诚实的证明者总能让验证者接受;可靠性(Soundness)——作弊的证明者几乎不可能成功;零知识性(Zero-knowledge)——验证者除了知道"命题为真"之外,学不到任何其他信息。

这三者之间存在深刻的张力。要保证可靠性,验证者似乎必须深入检验证明者的秘密;要保证零知识性,验证者又必须对秘密一无所知。如何在不看的同时确认看见了什么?这个悖论困扰了密码学界多年。

GMR论文的突破性在于引入了交互的概念。证明者不直接展示秘密,而是与验证者进行多轮问答。验证者提出随机挑战,证明者必须正确响应。只要证明者真的知道秘密,就能应对所有挑战;如果证明者在作弊,总有一天会被某个挑战难住。

Schnorr协议:最优雅的零知识证明

1991年,Claus-Peter Schnorr提出了一个简洁的协议,至今仍是理解零知识证明的最佳入门案例。

假设Alice想向Bob证明她知道某个离散对数的值x,满足h = g^x,但不想泄露x本身。协议的流程如下:

  1. 承诺阶段:Alice选择一个随机数r,计算u = g^r,将u发送给Bob
  2. 挑战阶段:Bob随机选择一个挑战值c发送给Alice
  3. 响应阶段:Alice计算z = r + x·c,将z发送给Bob
  4. 验证阶段:Bob检验g^z 是否等于 u · h^c

这个协议的精妙之处在于:如果Alice真的知道x,她总能正确计算z;如果Alice不知道x,她最多只能猜对一轮挑战,连续猜对的概率随着轮数增加而指数下降。而Bob在验证过程中,除了确认Alice确实知道x之外,对x本身一无所知——因为r是随机的,z也是随机的,不泄露任何关于x的信息。

sequenceDiagram
    participant Alice as 证明者
    participant Bob as 验证者
    Alice->>Alice: 选择随机数r
    Alice->>Bob: 发送承诺 u = g^r
    Bob->>Bob: 选择随机挑战c
    Bob->>Alice: 发送挑战c
    Alice->>Alice: 计算响应 z = r + x·c
    Alice->>Bob: 发送响应z
    Bob->>Bob: 验证 g^z = u·h^c

但Schnorr协议有一个致命缺陷:它需要交互。在互联网时代,让证明者和验证者同时在线进行多轮通信是不现实的。更重要的是,一个证明只能对一个验证者有效——如果Alice想向多个验证者证明,每个验证者都需要独立进行一轮协议。

Fiat-Shamir变换:用哈希替代验证者

1987年,Amos Fiat和Adi Shamir提出了一个天才的想法:用密码学哈希函数替代验证者的角色

验证者做的事情本质上只有一个:产生随机挑战。既然哈希函数的输出在密码学意义上是"随机"的,为什么不让证明者自己计算挑战呢?具体做法是:证明者将承诺值u代入哈希函数,用哈希输出作为挑战值c。

c = Hash(g, h, u)

这个简单的变换将交互式协议转化为非交互式协议。证明者可以一次性生成整个证明,验证者只需检验哈希值是否正确即可。一个证明可以被任意多个验证者验证,而且可以公开发布。

Fiat-Shamir变换成为现代零知识证明的基石,但也埋下了安全隐患。2022年,Trail of Bits安全团队披露了一系列被命名为Frozen Heart的漏洞,影响了包括SnarkJS、gnark在内的多个主流实现。这些漏洞的共同点是:Fiat-Shamir变换的实现没有将所有公开参数纳入哈希计算。攻击者可以利用这个遗漏,构造出能够通过验证的虚假证明。

从交互式到可验证计算

Fiat-Shamir变换解决了交互问题,但零知识证明真正的大规模应用还要等到2010年代。核心障碍在于:如何证明一般的计算,而不仅仅是证明知道某个离散对数?

答案在于将计算转化为约束系统。任何计算都可以表示为一个算术电路,进而转化为R1CS(Rank-1 Constraint System)——一组形如(a·b = c)的二次约束方程。更进一步,R1CS可以转化为QAP(Quadratic Arithmetic Program)——一种多项式形式,使得验证计算等价于验证多项式在某个点的取值。

这听起来很抽象,但关键洞察是:如果证明者声称多项式p(x)在某个秘密点τ处的取值是v,验证者不需要知道τ,只需要一个对这个多项式的"承诺"。这就是多项式承诺的用武之地。

KZG承诺:用椭圆曲线封装多项式

2010年,Kate、Zaverucha和Goldberg提出了KZG多项式承诺方案,成为现代SNARK系统的核心组件。

假设有一个多项式p(x) = a₀ + a₁x + a₂x² + … + aₙxⁿ。在可信设置阶段,系统生成一组椭圆曲线点:

[g¹, g^(τ²), g^(τ³), …, g^(τⁿ)]

其中τ是一个秘密值,生成后必须销毁——这就是著名的"toxic waste"。证明者可以计算承诺:

C = g^(p(τ)) = g^(a₀ + a₁τ + a₂τ² + …)

由于椭圆曲线的离散对数困难性,知道C无法反推出p(x)的系数。但证明者可以证明p(x)在某个公开点z处的取值确实是v。验证者只需要检验一个配对方程:

e(C - g^v, g) = e(π, g^(τ-z))

其中π是证明者提供的见证。这个验证的计算量与多项式次数无关,始终是常数时间!

KZG承诺的惊人之处在于:无论多项式有多复杂(百万次、千万次),承诺和证明的大小始终是一个椭圆曲线点(约48字节),验证时间始终是两次配对运算。这是零知识证明能够实用的数学基础。

Groth16:最小证明的黄金标准

2016年,Jens Groth发表了论文《On the Size of Pairing-based Non-interactive Arguments》,提出了以他名字命名的Groth16证明系统。这个系统至今仍是证明大小和验证速度的标杆。

Groth16的证明仅包含三个椭圆曲线群元素,总大小约192-288字节(取决于椭圆曲线选择)。验证只需要三次配对运算和若干群运算,耗时约10毫秒。这在区块链场景下极具吸引力——一个证明可以被永久存储在链上,验证成本极低。

但Groth16有一个重大缺陷:每个电路都需要独立的可信设置。如果你想证明"我知道一个满足条件X的秘密",就需要为X生成一套参数;如果你想证明"我知道一个满足条件Y的秘密",又需要为Y生成另一套参数。可信设置不仅繁琐,还存在安全风险——如果设置过程的参与者串通保留toxic waste,他们就可以伪造证明。

Zcash在2016年启动时进行了一场著名的可信设置仪式。六位参与者分别在各自的隔离环境中生成参数碎片,仪式完成后销毁所有设备。只要至少一位参与者诚实销毁了自己的碎片,整个系统就是安全的。但这种"信任少数人"的模式,与区块链"无需信任"的哲学存在根本冲突。

PLONK:通用设置的新范式

2019年,PLONK证明系统横空出世,解决了Groth16的最大痛点。PLONK引入了通用和可更新的可信设置——一套参数可以用于证明任意电路,而且任何人都可以添加新的随机性来更新参数,使之前的参与者无法再串通伪造证明。

PLONK还引入了Plonkish算术化方案,允许为特定操作设计自定义门,大幅提升效率。例如,椭圆曲线点乘可以设计专门的门,而不需要拆解成数百个基础门。

PLONK的核心是permutation argument——一种证明多个位置值相等的方法。这通过"grand product check"实现:将所有需要证明相等的位置排列成一个向量,证明这个向量的grand product(所有元素的乘积)等于某个公开值。

PLONK的成功催生了大量衍生系统:Aztec的Barretenberg、zkSync的Boojum、Polygon的Plonky2、Scroll的证明系统等。它们共享Plonkish算术化的核心思想,但在多项式承诺、哈希函数、递归验证等方面各有创新。

STARK:透明与量子抵抗的另一条路

当SNARK阵营在椭圆曲线上精雕细琢时,另一种思路正在悄然崛起。2018年,Eli Ben-Sasson等人提出了STARK(Scalable Transparent ARguments of Knowledge),完全抛弃椭圆曲线和可信设置,改用哈希函数作为唯一密码学假设。

STARK的核心是FRI协议(Fast Reed-Solomon Interactive Oracle Proof of Proximity)。它不依赖椭圆曲线配对,而是通过反复折叠多项式来证明其低次性质。每次折叠都将多项式的次数减半,最终得到一个可以直接验证的低次多项式。

STARK的优势显而易见:

  • 透明设置:不需要任何可信设置,不存在toxic waste
  • 量子抵抗:哈希函数被认为在量子计算机面前更安全
  • 证明生成快:对大规模计算,STARK的证明生成往往比SNARK更快

代价是证明大小。STARK证明的大小是O(log²n),其中n是电路规模。对于典型的区块链交易,证明大小在45-200KB之间,是Groth16证明的数百倍。这在以太坊上意味着更高的gas成本。

特性 zk-SNARK zk-STARK
证明大小 ~288字节(常数) ~100-200KB(对数级)
验证时间 ~10ms ~100ms
可信设置 需要 不需要
密码学假设 椭圆曲线离散对数 + 知识假设 抗碰撞哈希函数
量子抵抗
大规模证明生成 较慢 较快

实际应用中,两种技术正在走向融合。许多系统采用混合方案:用STARK生成大规模计算的证明,再用SNARK将STARK证明压缩成紧凑形式提交到链上。

zkRollup:区块链扩容的核心武器

零知识证明最成功的应用场景是区块链扩容。以太坊每秒只能处理约15笔交易,而Visa每秒处理数万笔。这个性能差距被称为"不可能三角"——去中心化、安全、可扩展三者不可兼得。

zkRollup提供了打破不可能三角的方案。核心思想是:将大量交易在链下执行,生成一个简洁的有效性证明,将证明和压缩后的状态数据提交到链上。链上验证者只需要验证证明,而不需要重新执行每笔交易。

一个zkRollup批次可能包含数千笔交易,但链上只需要存储一个约300字节的SNARK证明和几十KB的状态数据。验证时间约10毫秒,无论批次包含多少交易。理论上,zkRollup可以将以太坊吞吐量提升到每秒数千笔交易。

但zkRollup面临一个工程挑战:如何证明EVM(以太坊虚拟机)的执行?EVM是一个复杂的状态机,包含数百个操作码、几十个预编译合约、复杂的gas计算逻辑。证明EVM执行意味着将整个EVM规范转化为电路。

zkEVM:兼容性与效率的艰难抉择

2022年,Vitalik Buterin提出了zkEVM的分类框架,揭示了兼容性与效率之间的权衡。

Type 1(完全以太坊等价):不修改任何以太坊规范,直接证明现有以太坊区块。这是最理想的兼容性,但证明一个区块需要数小时。

Type 2(EVM等价):保持EVM语义不变,但可以修改状态树、区块结构等外围组件。例如,用Poseidon哈希替代Keccak。证明时间大幅缩短,但仍需数十分钟。

Type 3(几乎EVM等价):移除一些难以证明的预编译合约,对内存和栈处理做小幅修改。Scroll和Polygon的当前版本属于这一类。

Type 4(高级语言等价):直接从Solidity编译到ZK友好的虚拟机,跳过EVM字节码。zkSync采用这种方案。证明速度最快,但与现有以太坊工具链存在兼容性问题。

这个分类揭示了一个深层洞察:以太坊原本不是为ZK证明设计的。Keccak哈希函数对ZK证明极不友好,需要约200,000个约束才能证明一次哈希计算。而ZK友好的哈希函数如Poseidon只需要几百个约束。

zkEVM类型对比:Type 1到Type 4在兼容性与证明效率之间的权衡

图片来源: vitalik.eth.limo

安全的阴影:Frozen Heart与信任危机

2022年4月,Trail of Bits安全团队披露了一系列影响多个ZKP实现的漏洞,统称为Frozen Heart。这个名字是"Forging Of Zero Knowledge proofs"的首字母缩写。

漏洞根源是Fiat-Shamir变换的不正确实现。在PLONK协议中,挑战值zeta应该通过对所有公开参数(包括电路描述、公开输入、之前的承诺值)进行哈希计算得出。但多个实现忽略了公开输入:

zeta = Hash(transcript) // 正确做法 zeta = Hash(commitments) // 错误做法

这个看似微小的遗漏让攻击者可以构造恶意输入,使验证者接受虚假证明。问题的严重性在于:这是实现层面的漏洞,而非协议本身的缺陷。即使论文描述正确,实现者仍可能犯错。

Frozen Heart漏洞影响了SnarkJS(Iden3)、gnark(ConsenSys)、plonk(Dusk Network)等多个主流库。这些库在漏洞披露后迅速发布修复版本,但有多少使用这些库的应用及时更新,仍是未知数。

更广泛地看,零知识证明系统是密码学中最复杂的工程之一。一个典型的证明系统包含数千行高度优化的代码,涉及椭圆曲线运算、多项式运算、随机数生成等多个安全敏感模块。任何一处的实现错误都可能导致灾难性后果。

性能的边界:证明生成的代价

零知识证明的实用性最终取决于性能。以下是一些来自生产环境的基准数据:

Groth16(使用rapidsnark)

  • 证明生成:约2.3秒(百万约束)
  • 证明大小:~288字节
  • 验证时间:~10毫秒

PLONK(使用Halo2)

  • 证明生成:约5-10秒(百万约束)
  • 证明大小:~1-2KB
  • 验证时间:~50毫秒

STARK(使用Winterfell)

  • 证明生成:约1.6秒(百万约束)
  • 证明大小:~100KB
  • 验证时间:~100毫秒

证明生成是主要瓶颈。对于复杂的zkEVM电路(数千万约束),证明生成可能需要数分钟甚至更长。这意味着用户发起交易后,需要等待较长时间才能看到交易被确认。

硬件加速正在改变这一局面。GPU可以将证明生成速度提升5-10倍,FPGA和ASIC则有更大的潜力。2024年的研究表明,专用硬件可以将证明生成压缩到秒级。

递归证明是另一个重要优化方向。核心思想是:将一个大证明分解为多个小证明,每个小证明由不同的机器并行生成,最后用一个聚合证明将它们合并。这种方法可以将证明生成时间从线性降低到对数级。

市场与生态:从理论到产业

零知识证明已从学术研究演变为一个蓬勃的产业。根据Grand View Research的数据,全球零知识证明市场规模在2024年约为12.8亿美元,预计到2033年将达到75.9亿美元,年复合增长率约22%。

在区块链领域,zkRollup已成为主流扩容方案:

  • zkSync Era:每月处理超过1000万笔交易,费用比以太坊主网低10-50倍
  • StarkNet:采用STARK技术,TVL(总锁仓价值)超过十亿美元
  • Polygon zkEVM:基于PLONK,已部署数百个DeFi应用
  • Scroll:Type 2 zkEVM,正在向Type 1演进

在隐私保护领域:

  • Zcash:首个大规模应用zk-SNARK的隐私币,已从Sprout升级到Sapling再到Orchard
  • Tornado Cash:使用zk-SNARK实现链上隐私交易(虽然其开发者已被美国司法部起诉)
  • Aztec Network:隐私Layer2,允许在保持隐私的同时与DeFi交互

在身份验证领域,零知识证明正在革新传统的KYC流程。用户可以证明自己满足某些条件(如年龄超过18岁、在白名单国家)而不暴露具体身份信息。

未竟的征程

四十年过去,零知识证明从理论雏形发展为支撑数千亿美元生态的技术基础。但挑战依然存在:

证明生成速度:对于复杂的智能合约,证明生成仍是分钟级的延迟。用户习惯了秒级响应,证明延迟成为zkRollup广泛采用的障碍。

开发工具成熟度:编写ZK电路仍是一门专业技能。与普通编程相比,ZK开发需要理解约束系统、算术化、多项式承诺等深奥概念。

安全审计难度:ZKP协议的安全审计比传统软件审计困难得多。Frozen Heart漏洞表明,即使是顶级团队也可能犯错。

标准化缺失:目前存在数十种不同的证明系统,互操作性差。一个证明系统生成的证明无法被另一个系统验证。

未来几年,我们可能看到以下趋势:

证明系统的收敛:多种技术路线可能融合,形成少数几个主流方案。例如,用STARK生成证明、用SNARK压缩证明的混合方案。

硬件加速普及:专用芯片可能成为验证节点标配,使证明生成从分钟级压缩到秒级。

开发者工具平民化:更好的编译器和调试器将降低ZK开发的门槛,使其成为普通开发者可以掌握的技能。

应用场景扩展:除区块链外,零知识证明可能在隐私AI、可验证计算、安全多方计算等领域找到新的应用。

零知识证明的故事提醒我们:深刻的技术创新往往需要数十年才能成熟。1985年的GMR论文提出的是一个数学概念,而今天,这个概念正在重塑数字世界的信任基础设施。证明而不揭示——这个悖论式的目标,已经成为可能。


参考资料

  1. Goldwasser, S., Micali, S., & Rackoff, C. (1985). The knowledge complexity of interactive proof-systems. SIAM Journal on Computing.
  2. Schnorr, C. P. (1991). Efficient signature generation by smart cards. Journal of Cryptology.
  3. Kate, A., Zaverucha, G. M., & Goldberg, I. (2010). Constant-size commitments to polynomials and their applications. ASIACRYPT.
  4. Groth, J. (2016). On the size of pairing-based non-interactive arguments. EUROCRYPT.
  5. Gabizon, A., Williamson, H., & Ciobotaru, O. (2019). PLONK: Permutations over Lagrange-bases for Oecumenical Noninteractive arguments of Knowledge. IACR Cryptology ePrint Archive.
  6. Ben-Sasson, E., et al. (2018). Scalable, transparent, and post-quantum secure computational integrity. IACR Cryptology ePrint Archive.
  7. Trail of Bits. (2022). The Frozen Heart vulnerability in PlonK. Trail of Bits Blog.
  8. Buterin, V. (2022). The different types of ZK-EVMs. Vitalik’s Blog.
  9. Dankrad Feist. (2020). KZG polynomial commitments. Dankrad Feist’s Blog.
  10. LambdaClass. (2024). Our highly subjective view on the history of Zero-Knowledge Proofs. LambdaClass Blog.
  11. ZKDocs. Schnorr’s identification protocol. ZKDocs.
  12. ConsenSys. (2021). Zero-Knowledge Proofs: STARKs vs SNARKs. ConsenSys Blog.
  13. Garima Singh. ZK-SNARKs vs. ZK-STARKs: A Detailed Cryptographic Comparison.
  14. Grand View Research. (2024). Zero Knowledge Proof Market Size Report.