零知识证明(Zero-Knowledge Proof, ZKP)允许证明者(prover)在不泄露任何额外信息的前提下,使验证者(verifier)确信某个命题为真。自 Goldwasser、Micali 与 Rackoff 在 1985 年提出交互式零知识证明的形式化定义以来,该领域经历了从理论探索到大规模工程落地的跨越式发展。如今,零知识证明已成为区块链扩容(scaling)与链上隐私保护(on-chain privacy)的核心基础设施:以太坊(Ethereum)生态中的 zkRollup 方案依赖零知识证明将数千笔交易压缩为单条链上证明,隐私币(privacy coin)项目借助零知识证明隐藏交易金额与参与方身份,去中心化身份(decentralized identity)协议利用零知识证明实现选择性披露。
本文是密码学百科系列的第 43 篇,在第 25 篇对零知识证明基础概念的介绍之上,系统比较当前三大主流零知识证明系统——zk-SNARKs、zk-STARKs 与 Bulletproofs——的构造原理、性能特征及应用场景,并深入讨论递归证明(recursive proof)、证明聚合(proof aggregation)等前沿方向。
一、零知识证明系统概览
回顾第 25 篇的核心定义:一个零知识证明系统需要同时满足三条性质——完备性(completeness)、可靠性(soundness)与零知识性(zero-knowledge)。完备性要求诚实的证明者总能使验证者接受真命题;可靠性要求恶意的证明者无法使验证者接受假命题(除以可忽略的概率);零知识性要求验证者在交互过程中除了”命题为真”这一比特信息外,无法获取关于证明者秘密的任何知识。
从交互模式来看,零知识证明可分为交互式(interactive)与非交互式(non-interactive)两大类别。交互式证明需要证明者与验证者之间进行多轮通信,而非交互式零知识证明(Non-Interactive Zero-Knowledge, NIZK)仅需证明者发送一条消息即可完成验证。Fiat-Shamir 变换(Fiat-Shamir heuristic)是将交互式证明转化为非交互式证明的标准技术手段:它使用密码学哈希函数(cryptographic hash function)模拟验证者的随机挑战,从而消除交互需求。在区块链场景中,证明必须能够被链上智能合约(smart contract)以非交互方式验证,因此当代的零知识证明系统几乎都是非交互式的。
按照技术路线的不同,当前主流非交互式零知识证明系统可划分为三大流派:
第一类是 zk-SNARKs(Zero-Knowledge Succinct Non-Interactive Arguments of Knowledge)。“Succinct”意味着证明尺寸(proof size)极小,通常为常数级别(数百字节),且验证时间远低于直接执行计算本身。zk-SNARKs 的代表方案包括基于配对(pairing-based)的 Groth16 与 PLONK。大多数 zk-SNARKs 依赖结构化参考字符串(Structured Reference String, SRS),即需要可信设置(trusted setup)阶段。
第二类是 zk-STARKs(Zero-Knowledge Scalable Transparent Arguments of Knowledge)。“Transparent”表示不需要可信设置,所有公共参数均可由公开的随机性生成。zk-STARKs 仅依赖抗碰撞哈希函数(collision-resistant hash function),具有后量子安全(post-quantum security)的潜力,但代价是证明尺寸显著大于 SNARKs(通常数十至数百千字节)。
第三类是 Bulletproofs。它同样不需要可信设置,证明尺寸对数级别增长(logarithmic in the statement size),尤其适用于范围证明(range proof)等特定场景。然而,Bulletproofs 的验证时间与计算规模线性相关,不具备简洁性(succinctness),因此不适合超大规模计算的验证。
下表从五个关键维度对比三大流派的核心特征:
| 维度 | zk-SNARKs(Groth16) | zk-SNARKs(PLONK) | zk-STARKs | Bulletproofs |
|---|---|---|---|---|
| 可信设置 | 电路特定(per-circuit) | 通用可更新(universal/updatable) | 无需(transparent) | 无需 |
| 证明尺寸 | ~192 字节 | ~400 字节 | 数十至数百 KB | ~700 字节(64 位范围证明) |
| 验证时间 | 毫秒级(常数) | 毫秒级(常数) | 毫秒级(对数多项式) | 线性于电路规模 |
| 密码学假设 | 双线性配对 + 知识假设 | 双线性配对 + 知识假设 | 抗碰撞哈希 | 离散对数 |
| 后量子安全 | 否 | 否 | 是 | 否 |
笔者认为,上面这张对比表有一个读者必须意识到的特性:它的「保质期」大约只有 18 个月。零知识证明系统的技术迭代速度之快,在整个密码学领域中几乎没有先例。2018-2020 年,Groth16 是几乎所有 ZKP 项目的默认选择;2020-2022 年,PLONK 凭借通用可信设置迅速取代了 Groth16 的统治地位;2022 年至今,Halo2、Nova 等折叠方案以及各种 STARK 变体又在重塑格局。每一次迭代不仅是性能的改进,更是底层范式的转变——从 R1CS 到 Plonkish 到 AIR,从 KZG 到 FRI 到 IPA,从传统递归到折叠方案。这意味着,任何基于当前「最优方案」做出的工程选型,都必须为两年后可能出现的更优方案预留迁移空间。从这个角度看,选择一个抽象层良好的证明框架(如支持多种后端的 halo2 或 arkworks),可能比选择当前性能最优的具体方案更重要。
二、算术电路与 R1CS
要将一个任意的计算问题转化为零知识证明,第一步是将其表示为某种标准化的代数约束系统。最基础也最广泛使用的表示方法是算术电路(arithmetic circuit)。
算术电路是定义在有限域(finite field)上的有向无环图(directed acyclic graph, DAG)。图中的每个节点代表一个加法门(addition gate)或乘法门(multiplication gate),输入节点对应公开输入(public input)或秘密见证(private witness),输出节点对应需要满足的约束。将一个高级语言编写的程序编译为算术电路的过程,类似于传统编译器将源代码编译为机器指令:需要处理条件分支(通过算术选择器实现)、循环展开、以及变量的赋值与引用。
Rank-1 Constraint System(R1CS)是算术电路的矩阵化表示。一个 R1CS 实例由三个矩阵 A、B、C 定义,每个矩阵的行数等于约束数量,列数等于变量数量(包括常数 1、公开输入和所有中间变量)。满足 R1CS 意味着对于见证向量 w,有 (A · w) ⊙ (B · w) = C · w,其中 ⊙ 表示逐元素乘法(Hadamard product)。每一行约束的形式为:(a₁w₁ + a₂w₂ + … ) × (b₁w₁ + b₂w₂ + … ) = (c₁w₁ + c₂w₂ + … ),即”左输入的线性组合”乘以”右输入的线性组合”等于”输出的线性组合”。
以一个具体的例子来说明:我们希望证明”我知道一个 x 使得 x³ + x + 5 = 35”,而不泄露 x 的值(答案是 x = 3)。首先将计算拆分为逐步的乘法门:
- 引入中间变量 v₁ = x × x(即 x²)
- 引入中间变量 v₂ = v₁ × x(即 x³)
- 最终约束 v₂ + x + 5 = 35,即 (v₂ + x - 30) × 1 = 0
对应的变量向量为 w = [1, x, v₁, v₂, out],其中 out = 35。每个乘法门产生一行 R1CS 约束。下面的 Python 代码演示了这一过程:
import numpy as np
# 变量索引: 0=one, 1=x, 2=v1(x^2), 3=v2(x^3), 4=out
num_vars = 5
# 约束 1: x * x = v1
A1 = [0, 1, 0, 0, 0] # 左输入: x
B1 = [0, 1, 0, 0, 0] # 右输入: x
C1 = [0, 0, 1, 0, 0] # 输出: v1
# 约束 2: v1 * x = v2
A2 = [0, 0, 1, 0, 0] # 左输入: v1
B2 = [0, 1, 0, 0, 0] # 右输入: x
C2 = [0, 0, 0, 1, 0] # 输出: v2
# 约束 3: (v2 + x + 5) * 1 = out
A3 = [5, 1, 0, 1, 0] # 左输入: 5*one + x + v2
B3 = [1, 0, 0, 0, 0] # 右输入: 1 (one)
C3 = [0, 0, 0, 0, 1] # 输出: out
A = np.array([A1, A2, A3])
B = np.array([B1, B2, B3])
C = np.array([C1, C2, C3])
# 见证向量: one=1, x=3, v1=9, v2=27, out=35
w = np.array([1, 3, 9, 27, 35])
# 验证 R1CS: (A·w) ⊙ (B·w) == C·w
lhs = (A @ w) * (B @ w)
rhs = C @ w
assert np.array_equal(lhs, rhs), "R1CS 约束不满足"
print("R1CS 约束验证通过")
print(f" A·w = {A @ w}")
print(f" B·w = {B @ w}")
print(f" (A·w)⊙(B·w) = {lhs}")
print(f" C·w = {rhs}")运行这段代码将输出:A·w = [3, 9, 35]、B·w = [3, 3, 1]、(A·w)⊙(B·w) = [9, 27, 35]、C·w = [9, 27, 35],验证通过。
在实际的 zk-SNARKs 构造中,R1CS 还需进一步转化为二次算术程序(Quadratic Arithmetic Program, QAP)。QAP 将矩阵的每一列转化为一个多项式,使得 R1CS 的乘法约束等价于在特定求值点上的多项式整除关系。这一转化是将”逐行检查约束”简化为”单个多项式等式验证”的关键步骤。
三、Groth16:最简洁的 SNARK
Groth16 由 Jens Groth 于 2016 年提出,至今仍是证明尺寸最小、验证效率最高的零知识证明方案之一。Zcash(Sapling 升级)正是选择了 Groth16 作为其隐私交易的核心证明系统。
Groth16 的构造基于双线性配对(bilinear pairing)。设 G₁、G₂ 为两个素数阶椭圆曲线群(elliptic curve group),G_T 为目标群,配对映射 e: G₁ × G₂ → G_T 满足双线性性。Groth16 的证明仅包含三个群元素:两个 G₁ 元素和一个 G₂ 元素,总共约 192 字节(在 BN254 曲线上)。验证过程只需计算三次配对运算,时间复杂度为常数级别,与电路规模无关。
然而,Groth16 的代价在于其可信设置。在设置阶段,一个可信的第三方(或多方计算仪式)需要生成与特定电路绑定的证明密钥(proving key)和验证密钥(verification key)。设置过程中使用的随机数(通常称为”有毒废物”,toxic waste)必须在仪式结束后被彻底销毁;若任何参与者保留了这些随机数,就可以伪造证明。更重要的是,Groth16 的 SRS 是电路特定的(circuit-specific):每当电路发生任何修改,整个可信设置仪式都必须重新执行。
Zcash 社区为 Groth16 的可信设置举行了著名的”Powers of Tau”仪式,共有数百名参与者贡献随机性。该仪式的安全性基于”至少有一名诚实参与者”的假设——只要有一个参与者正确销毁了自己的随机份额,整个 SRS 就是安全的。
Groth16 的证明生成过程可概括为:证明者根据见证向量 w 和 QAP 多项式,在椭圆曲线群上计算三个承诺值作为证明。验证者利用配对运算检查这三个值之间的代数关系是否成立。由于配对运算的特殊性质,验证者无需重新执行整个计算,仅通过常数次群运算即可判断命题的真伪。
Groth16 的知识可靠性(knowledge soundness)依赖于”通用群模型”(Generic Group Model, GGM)下的知识假设(knowledge assumption)。这意味着安全性证明并非基于标准的计算假设(如离散对数假设),而是需要更强的假设。这一点在密码学理论界曾引发讨论,但在实际工程部署中尚未发现安全问题。
从工程实践来看,可信设置的争论是整个 ZKP 领域的密码学哲学缩影。Groth16 的电路特定设置(per-circuit setup)在理论上最干净——证明最小、验证最快——但运维上极其脆弱:电路的任何一行修改都意味着重新执行多方计算仪式,而仪式本身的安全性依赖于「至少一个参与者是诚实的」这一无法验证的假设。STARKs 走向了另一个极端——完全透明、无需任何设置——但代价是证明尺寸膨胀了两到三个数量级。PLONK 的通用可更新设置恰好处于这一光谱的务实中点:一次仪式可以服务于任意电路,新参与者可以随时追加随机性以增强安全性。笔者认为,工业界最终收敛到 PLONK 系列方案,不是因为它在任何单一维度上最优,而是因为它在所有维度上都「足够好」——这种工程上的均衡性,往往比理论上的极致性更有实用价值。
四、PLONK 与通用可信设置
PLONK(Permutations over Lagrange-bases for Oecumenical Noninteractive arguments of Knowledge)由 Gabizon、Williamson 与 Ciobotaru 于 2019 年提出,是当前最具影响力的通用 SNARK 方案之一。相较于 Groth16,PLONK 的核心优势在于其通用且可更新的结构化参考字符串(universal and updatable SRS):同一套 SRS 可用于验证任意电路(只要电路规模不超过 SRS 的上限),且任何新参与者都可以随时为现有 SRS 追加随机性以增强安全性,无需从头开始执行仪式。
PLONK 的约束系统不同于 R1CS。它采用所谓的”算术化”(arithmetization)方案,将电路中的每个门描述为形如 qₗ · a + qᵣ · b + qₒ · c + qₘ · a · b + q_c = 0 的等式,其中 qₗ、qᵣ、qₒ、qₘ、q_c 是选择器多项式(selector polynomial),a、b、c 分别对应门的左输入、右输入和输出。通过调整选择器的值,同一个等式模板既可以表达加法门(令 qₘ = 0)、也可以表达乘法门(令 qₗ = qᵣ = 0),甚至可以表达更复杂的自定义门(custom gate)。
PLONK 的另一个关键创新是置换论证(permutation argument)。在电路中,同一条导线(wire)可能连接多个门的输入或输出——例如,门 A 的输出可能同时是门 B 的左输入和门 C 的右输入。PLONK 通过一种基于乘积检验(grand product check)的置换论证来确保所有导线约束的一致性。具体而言,它将”所有导线值在指定位置处相等”转化为”某个特定多项式在所有求值点处等于 1”的检验。
在 PLONK 的基础上,后续工作引入了查找论证(lookup argument),其中最具代表性的是 Plookup。查找论证允许证明者证明”某个值属于预定义的查找表”,这对于位运算(bitwise operation)、哈希函数中的 S 盒(S-box)查表等非算术友好型操作尤其高效——无需将这些操作展开为大量的算术约束,只需查表即可。TurboPlonk 与 UltraPlonk 在此基础上进一步集成了自定义门与查找表,显著降低了实际应用中的电路规模。
PLONK 的证明尺寸约为 400 字节(取决于具体的多项式承诺方案),验证时间同样为毫秒级别。虽然比 Groth16 稍大,但其通用 SRS 的优势在工程实践中极为显著:开发团队可以频繁迭代电路设计而无需重新举行可信设置仪式。以太坊生态中的多个 zkRollup 项目(如 zkSync Era、Scroll、Polygon zkEVM)均采用了 PLONK 系列的证明系统。
五、多项式承诺方案
多项式承诺(polynomial commitment scheme)是现代零知识证明系统的核心组件。它允许承诺者对一个多项式进行承诺(commit),之后在任意指定点上打开(open)承诺并证明求值的正确性,而无需透露多项式本身。不同的多项式承诺方案决定了零知识证明系统的安全假设、证明尺寸和验证效率等关键特性。
KZG 承诺(Kate-Zaverucha-Goldberg commitment)是最经典的多项式承诺方案。承诺者对多项式 f(x) 的承诺是一个椭圆曲线群元素 C = f(τ) · G,其中 τ 是 SRS 中隐含的秘密值,G 是群的生成元。要证明 f(z) = y,承诺者计算商多项式 q(x) = (f(x) - y) / (x - z),并给出 q(τ) · G 作为证明。验证者利用配对运算 e(C - y·G, G₂) = e(π, τ·G₂ - z·G₂) 进行检验。KZG 的优点是承诺和证明都只有一个群元素(常数大小),但它需要可信设置来生成包含 τ 的幂次的 SRS,且安全性依赖于双线性配对的困难性假设。
FRI(Fast Reed-Solomon Interactive Oracle Proof of Proximity)是 zk-STARKs 所采用的多项式承诺方案。FRI 不使用任何代数结构假设,仅依赖抗碰撞哈希函数。其核心思想是通过反复对折(folding)将一个高次多项式逐步降维为低次多项式,并在每一步使用默克尔树(Merkle tree)对中间值进行承诺。验证者通过随机抽样检查各层之间的一致性。FRI 的证明尺寸为 O(log²n)(n 为多项式的次数),显著大于 KZG,但其透明性(无需可信设置)和后量子安全性是重要优势。
IPA(Inner Product Argument)是 Bulletproofs 的核心技术,也被称为内积论证。IPA 通过递归折叠的方式将一个长度为 n 的内积证明压缩到 O(log n) 个群元素。每一轮递归中,证明者将向量对半分割,计算交叉项作为承诺发送给验证者,然后根据验证者的随机挑战将两半合并为新的、长度减半的向量。经过 log n 轮后,向量缩减为标量,验证者据此检验最终等式。IPA 不需要可信设置,仅依赖离散对数假设,但验证需要 O(n) 时间(因为验证者需要计算最终的生成元组合)。Halo 项目提出了使用 IPA 配合递归证明的方案,为不需要可信设置的递归 SNARK 开辟了道路。
Dory 是一种较新的多项式承诺方案,同样基于配对,但具有对数级的证明尺寸和验证时间,且其 SRS 是透明的(可由公开随机性生成)。Dory 在证明者效率和验证者效率之间取得了较好的平衡。
各多项式承诺方案的特征总结如下:KZG 具有最小的证明尺寸和最快的验证速度,但需要可信设置且不具备后量子安全性;FRI 具有透明性和后量子安全潜力,但证明尺寸较大;IPA 不需要可信设置且证明尺寸紧凑,但验证时间是线性的;Dory 在透明性与效率之间提供了折中选择。零知识证明系统的设计者需要根据具体应用场景的安全需求和性能要求选择合适的方案。
六、zk-STARKs
zk-STARKs 由 Eli Ben-Sasson 等人于 2018 年提出,其设计哲学与 zk-SNARKs 截然不同。STARKs 的核心目标是实现完全透明的设置(transparent setup)——系统的所有公共参数均可由公开的随机性确定性地生成,不存在任何需要保密的”有毒废物”。此外,STARKs 仅依赖抗碰撞哈希函数这一最小密码学假设,天然具有对量子计算攻击的抵抗能力。
STARKs 使用的约束表示不是 R1CS,而是代数中间表示(Algebraic Intermediate Representation, AIR)。一个 AIR 实例由一组多项式约束定义,这些约束作用于执行轨迹(execution trace)的相邻行之间。执行轨迹是一个二维矩阵,行代表计算的时间步,列代表寄存器(register)的状态。例如,对于一个计算斐波那契数列的程序,AIR 约束可以表达为”第 i+2 行的寄存器值等于第 i 行与第 i+1 行寄存器值之和”。AIR 的优势在于它能够自然地表达迭代计算(iterative computation),而无需像 R1CS 那样将循环完全展开。
STARKs 的证明过程基于多项式交互式预言机证明(Polynomial Interactive Oracle Proof, Polynomial IOP)。其核心流程如下:首先,证明者将执行轨迹的每一列编码为一个多项式(通过低次扩展,low-degree extension);然后,AIR 约束被转化为这些多项式之间的代数关系;接着,证明者使用 FRI 协议证明相关的商多项式(quotient polynomial)确实是低次的——若约束被满足,则商多项式是低次的,否则是高次的。验证者通过随机抽样检查 FRI 协议的一致性来判断约束是否被满足。
在具体的协议设计上,STARKs 使用默克尔树对多项式的求值进行承诺,验证者通过要求证明者打开特定位置的值来进行随机检查。这使得整个验证过程的通信复杂度为 O(log²n)(polylogarithmic),虽然大于 SNARKs 的常数级别,但仍远小于直接传输整个计算的见证。
StarkWare 公司(现 Starknet)是 zk-STARKs 的主要工程推动者。其开发的 STARK 证明系统 Stone(后升级为 Stwo)被用于 Starknet 二层网络(Layer 2)的交易批处理(batching)验证。在实际部署中,STARKs 的证明生成时间通常较长(分钟级别),但随着硬件加速(如 GPU 与 FPGA 加速器)和算法优化(如 Circle STARKs 使用更高效的域选择),这一差距正在迅速缩小。
值得注意的是,一种常见的混合架构是”STARK 内包 SNARK”或”SNARK 内包 STARK”。例如,可以先用 STARK 生成一个大尺寸但透明的证明,然后用 SNARK 将该 STARK 证明进一步压缩为一个小尺寸的链上证明。这种方法结合了 STARK 的透明性优势与 SNARK 的简洁性优势。
七、Bulletproofs
Bulletproofs 由 Bunz、Bootle、Boneh、Poelstra 与 Wuille 于 2018 年提出,最初是为了解决保密交易(Confidential Transaction)中范围证明(range proof)尺寸过大的问题。在此之前,基于 Borromean 环签名的范围证明尺寸与证明范围的位数线性相关;Bulletproofs 将其压缩为对数级别,大幅节省了区块链的存储和带宽开销。
Bulletproofs 的核心是内积论证(Inner Product Argument, IPA),其工作原理在上一节已有介绍。在范围证明的具体应用中,Bulletproofs 将”某个值 v 在 [0, 2ⁿ) 范围内”这一命题转化为一个内积关系的验证。具体而言,v 被分解为 n 位二进制表示 aₗ = (a₁, …, aₙ),令 aᵣ = aₗ - 1ⁿ(即每个分量减 1),则范围证明等价于证明 aₗ ⊙ aᵣ = 0ⁿ(每个分量非 0 即 1)且 <aₗ, 2ⁿ> = v(二进制重构)。通过引入随机线性组合,这两个条件可以合并为单个内积等式,然后使用 IPA 进行对数级别的证明。
Bulletproofs 的一大优势是支持高效的批量验证(batch verification)和聚合范围证明(aggregated range proof)。对于 m 个独立的范围证明,Bulletproofs 可以将它们聚合为一个证明,尺寸仅增加 2·log₂(m) 个群元素。这意味着在一笔包含多个输出的保密交易中,所有输出的范围证明可以合并处理,显著降低总体证明开销。
Monero(门罗币)是 Bulletproofs 最知名的实际部署案例。2018 年 10 月的硬分叉(hard fork)中,Monero 将其范围证明从 Borromean 环签名替换为 Bulletproofs,使平均交易尺寸减少约 80%。后续的 Bulletproofs+ 优化进一步将证明尺寸减少了约 6%。
Bulletproofs 除了范围证明之外,也可以用于通用的算术电路验证。然而,由于其验证时间为 O(n)(n 为约束数量),在大规模计算场景中效率不如 SNARKs 和 STARKs。因此,Bulletproofs 最适合那些电路规模适中但对可信设置敏感的场景,例如保密交易中的金额范围证明、投票系统中的有效性验证,以及简单的身份属性证明。
八、递归证明与证明聚合
递归证明(recursive proof)是零知识证明领域的一项突破性技术。其核心思想是:在一个零知识证明的电路内部,嵌入另一个零知识证明的验证逻辑。换言之,证明者不仅证明某个计算是正确的,还同时证明”前一个证明是有效的”。通过链式递归,可以将任意长的计算序列压缩为单个恒定大小的证明。
递归 SNARKs 的经典构造面临一个技术挑战:SNARK 验证器需要执行配对运算,而配对运算涉及的椭圆曲线算术在 SNARK 电路内部表示的代价极高(因为曲线的基域与 SNARK 电路的标量域不匹配)。为解决这一问题,研究者们提出了多种方法。
第一种方法是使用友好曲线循环(cycle of curves)。例如,Mina 协议使用 Pasta 曲线对(Pallas 和 Vesta),两条曲线的基域分别等于对方的标量域,从而使得在一条曲线的 SNARK 电路中验证另一条曲线的 SNARK 证明变得高效。
第二种方法是 Halo 系列技术。Halo 使用 IPA 作为多项式承诺方案,避免了配对运算,通过延迟验证(deferred verification)的策略实现了不需要可信设置的递归证明。Halo 2 在此基础上进一步集成了 PLONK 的算术化,被 Zcash 的 Orchard 升级所采用。
近年来最令人瞩目的进展是折叠方案(folding scheme)。Nova 由 Kothapalli、Setty 与 Walfish 于 2022 年提出,引入了一种全新的递归范式。与传统递归证明”在电路中验证前一个证明”不同,Nova 的核心操作是”折叠”(fold):将两个待证实例合并为一个新的待证实例,而不需要在合并过程中执行完整的 SNARK 验证。折叠操作的开销仅为几次椭圆曲线标量乘法(scalar multiplication),远低于在电路中嵌入完整的 SNARK 验证器。Nova 使用松弛 R1CS(relaxed R1CS)作为约束系统,并基于承诺方案实现了高效的折叠。在所有增量步骤完成后,再执行一次最终的 SNARK 证明即可。
SuperNova 将 Nova 的思想扩展到支持多种不同指令(即不同的电路结构),使其能够模拟通用的虚拟机执行。HyperNova 则进一步将折叠方案推广到更高次的约束系统(Customizable Constraint System, CCS),统一了 R1CS、Plonkish 和 AIR 等不同的约束表示。
笔者认为,递归证明组合(一个证明验证另一个证明)是自 Groth16 以来零知识证明领域最重要的创新。它的意义不仅在于技术层面——将多个证明压缩为一个——而在于它解锁了一种全新的计算范式:增量可验证计算(incrementally verifiable computation, IVC)。有了递归证明,任意长的计算序列都可以被「滚雪球」式地压缩:每执行一步计算,就生成一个同时证明「这一步是正确的」且「前面所有步骤都是正确的」的证明。这正是所有现代 zkVM 和 zkRollup 架构的理论基础——没有递归,zkRollup 就无法将数千笔交易压缩为单个链上证明,zkVM 就无法验证任意长度的程序执行。Nova 的折叠方案之所以令人兴奋,是因为它将递归的成本从「在电路中嵌入完整的 SNARK 验证器」降低到了「几次椭圆曲线标量乘法」,使得递归从一个昂贵的特性变成了几乎免费的基础能力。
在区块链 zkRollup 的实际部署中,证明聚合(proof aggregation)是递归证明的直接应用。zkRollup 的排序器(sequencer)将一批交易分为若干组,每组独立生成一个证明,然后通过递归或聚合技术将所有子证明合并为一个最终证明提交到一层网络(Layer 1)。这不仅降低了链上验证的 gas 成本,还允许证明生成过程的并行化,显著提升了吞吐量。
九、应用生态
零知识证明技术在过去几年中从学术论文走向了大规模工程部署。以下是当前最重要的应用方向:
zkRollup 是零知识证明在区块链扩容领域的旗舰应用。zkRollup 将大量交易的执行移至链下(off-chain),仅在链上提交状态根(state root)的更新和一个零知识证明。链上智能合约通过验证该证明来确认链下计算的正确性,从而实现”执行在链下、安全等同于链上”的扩容效果。当前主流的 zkRollup 项目包括:zkSync Era 采用基于 PLONK 的证明系统(Boojum),支持 EVM 兼容的智能合约执行;Starknet 采用基于 STARKs 的证明系统(Stwo),使用自研的 Cairo 语言编写可验证程序;Scroll 采用基于 KZG 承诺的 PLONK 变体(halo2),追求与以太坊 EVM 的字节码级兼容;Polygon zkEVM 同样采用 PLONK 系列方案,致力于完全的 EVM 等价性。
隐私币与保密交易 是零知识证明的另一大传统应用领域。Zcash 使用 Groth16(Sapling)和 Halo 2(Orchard)实现完全匿名的交易——发送方、接收方和金额均被隐藏。Monero 使用 Bulletproofs 实现保密交易中的金额隐藏。Penumbra、Aleo 等新兴项目则尝试将零知识证明与去中心化金融(DeFi)结合,在保护交易隐私的同时支持复杂的金融操作。
去中心化身份与选择性披露 利用零知识证明实现”证明某属性而不透露完整信息”的范式。例如,用户可以证明”我的年龄大于 18 岁”而无需出示完整的身份证明文件;或者证明”我持有某国护照”而不透露姓名和护照号码。这一方向与世界银行(World Bank)和联合国推动的数字身份计划密切相关。Semaphore 和 WorldID 等协议已在此方向取得实质性进展。
零知识机器学习(zkML) 是一个快速兴起的前沿领域。zkML 的目标是证明”某个机器学习模型的推理结果是由特定的模型权重和输入数据正确计算得出的”,而不泄露模型权重(知识产权保护)或输入数据(用户隐私保护)。由于神经网络(neural network)的计算规模庞大,zkML 面临巨大的效率挑战,目前的研究主要集中在量化(quantization)技术与专用算术化方案的设计上。EZKL 和 Modulus Labs 是该方向的代表项目。
在决定采用哪种证明系统之前,工程团队需要在可信设置、证明尺寸、验证效率、证明器性能、后量子安全性等维度之间权衡取舍。下表将五种主流系统的关键选型指标并列对照:
| 维度 | Groth16 | PLONK | STARK | Bulletproofs | Halo2 |
|---|---|---|---|---|---|
| 可信设置 | 电路特定 CRS(每电路一次仪式) | 通用可更新 SRS(一次仪式,多电路复用) | 无需(transparent) | 无需 | 无需(使用 IPA 时)/ SRS(使用 KZG 时) |
| 证明尺寸 | ~192 B(3 群元素) | ~400 B | 50 − 200 KB | ~700 B(64 位范围证明) | ~400 − 600 B |
| 验证时间 | ~3 ms(常数,3 配对运算) | ~5 ms(常数) | ~10 ms(对数多项式) | 线性于电路规模 | ~5 ms(常数) |
| 证明器时间(百万门级) | 数十秒至分钟 | 数十秒至分钟 | 数秒至数十秒 | 线性于电路规模 | 数十秒至分钟 |
| 后量子安全 | 否(依赖配对) | 否(依赖配对) | 是(仅依赖哈希) | 否(依赖离散对数) | 否(KZG 模式)/ 待定(IPA 模式) |
| 多项式承诺 | 内嵌于配对检查 | KZG / IPA / FRI 均可 | FRI(基于哈希) | 内积论证(IPA) | KZG 或 IPA |
| 电路表示 | R1CS | Plonkish(自定义门) | AIR / RAP | R1CS | Plonkish(自定义门 + lookup) |
| 递归友好度 | 低(配对验证成本高) | 中(可用累加方案) | 高(哈希验证电路高效) | 低 | 高(原生递归设计) |
| 主要应用 | Zcash Sapling、Tornado Cash | zkSync Era、Polygon zkEVM | Starknet、StarkEx | Monero 保密交易 | Scroll、Zcash Orchard |
坦率地说,任何一张 ZKP 选型矩阵的有效期大约只有两年——这不是夸张,而是这个领域真实的迭代速度。2021 年 Groth16 还是链上验证的不二之选,2023 年 PLONK 系方案已全面铺开,2024 年 Circle STARKs 和 Binius 又在重新定义效率边界。我列出这张表的目的,与其说是给出一个”正确答案”,不如说是提供一个结构化的思考框架:你的系统需要可信设置吗?你能容忍多大的证明尺寸?你的验证发生在链上还是链下?你需要考虑后量子安全吗?把这些问题想清楚,比执着于任何一个具体方案都重要得多——因为今天的”最优选”,很可能就是明天的”遗留系统”。
下表汇总了各主要零知识证明系统在实际部署中的关键性能指标:
| 方案 | 证明尺寸 | 验证时间 | 证明生成时间(百万门级电路) | 代表项目 |
|---|---|---|---|---|
| Groth16 | ~192 B | ~3 ms | 数十秒至分钟 | Zcash Sapling |
| PLONK/halo2 | ~400 B | ~5 ms | 数十秒至分钟 | zkSync, Scroll |
| STARKs (Stwo) | 50-200 KB | ~10 ms | 数秒至数十秒 | Starknet |
| Bulletproofs | ~700 B(范围证明) | 线性于电路规模 | 线性于电路规模 | Monero |
需要指出的是,上述数据会随算法改进与硬件发展而持续变化。STARKs 方向的 Circle STARKs 和 Binius 等新技术正在大幅提升证明生成效率;SNARKs 方向的硬件加速(GPU/FPGA/ASIC 证明器)也在将证明生成时间从分钟级推向秒级。
展望未来,零知识证明系统的发展将沿着几条主线推进:更高效的算术化方案(减少约束数量)、更快的证明器实现(硬件加速与算法优化的双轮驱动)、更灵活的递归与聚合技术(支持异构证明系统的互操作)、以及更强的安全保证(从知识假设向标准模型假设的迁移)。随着这些技术的成熟,零知识证明有望成为互联网基础设施的一部分——不仅服务于区块链,还将在云计算可验证计算(verifiable computation)、供应链审计、医疗数据共享等广泛场景中发挥关键作用。
密码学百科系列 · 第 43 篇