零知识证明(Zero-Knowledge Proof,ZKPs)允许用户既不泄露敏感信息,又可向他人证明自己知悉关键数据或拥有其所有权,例如钱包的私钥。
零知识证明(Zero-Knowledge Proof,ZKPs)是一种证明方法,通过这种方法,一方(证明者, prover)可以在不透露任何实际信息的情况下,向另一方(验证者,verifier)证明它知道一个秘密或一个声明是真实的。
放到加密应用中,ZKPs 这种加密方法可在证明用户拥有钱包私钥的情况下不泄露私钥信息,从而保护了数据隐私。
例如你的交易数据对于系统来说是透明可追踪的,但采用零知识证明可以保护你的信息不会被公开,谁钱包里有多少比特币,谁买了多少个比特币之类的信息可以变成选择性隐私。
该论文由Goldwasser、Micali 和 Rackoff 合作发表,1985 年提出,1989 年发表。
这篇论文主要阐释的是在一个交互系统中,经过 K 轮交互,需要多少知识被交换,从而证明一个证言(statement)是正确的。
如果可以让交换的知识为零,则被称之为零知识证明。
这里面会假设证明者(prover)具有无限资源,而验证者(verifer)只具有有限资源。
早年的零知识证明系统在效率以及可用性方面都有所欠缺,所以一直都停留在理论层面,直到最近 10 年才开始蓬勃发展,伴随着密码学在 crypto 成为显学,零知识证明走向台前,成为至关重要的一个方向。
特别是发展出一个通用的、非交互的、证明大小有限的零知识证明协议,是其中最关键的探索方向之一。
基本上零知识证明就是要在证明的速度、验证的速度和证明体积的大小之间做取舍,理想的协议是证明快、验证快、证明体积小。
零知识证明最重要的突破是 Groth 在 2010 年的论文 《Short Pairing-based Non-interactive Zero-Knowledge Arguments》,也是 ZKP 里面最重要的一组 zk-SNARK 的理论先驱。
零知识证明在应用上最重要的进展就是 2015 年 Z-cash 使用的零知识证明系统,实现了对交易及金额隐私的保护,后来发展到 zk-SNARK 和智能合约相结合,zk-SNARK 进入了更为广泛的应用场景。
在此期间,一些重要的学术成果包括:
2013 年的 Pinocchio (PGHR13)
Nearly Practical Verifiable Computation,将证明和验证时间压缩到适用范围,也是 Zcash 使用的基础协议。
2016 年 的 Groth16
On the Size of Pairing-based Non-interactive Arguments,精简了证明的大小,并提升了验证效率,是目前应用最多的 ZK 基础算法。
2017 年的 Bulletproofs (BBBPWM17)
Short Proofs for Confidential Transactions and More,提出了 Bulletproof 算法,非常短的非交互式零知识证明,不需要可信的设置,6 个月以后应用于 Monero,是非常快的理论到应用的结合。
2018 年 的 zk-STARKs (BBHR18)
Scalable, transparent, and post-quantum secure computational integrity,提出了不需要可信设置的 ZK-STARK 算法协议,这也是目前 ZK 发展另一个让人瞩目的方向,也以此为基础诞生了 StarkWare 这个最重量级的 ZK 项目。
其他的发展包括 PLONK、Halo2 等也是极为重要的进展,也对 zk-SNARK 做出了某些层面上的改进。
ZKPs 有交互式和非交互式两种。
交互式 ZKPs
要求证明者对每个验证者相互区分,并对每个验证者发送所需要验证的数据,重复执行相同操作
非交互式 ZKPs
去掉了交互过程,证明者直接一次性公开验证所需的数据,保证了一次证明即可被多个验证者同时验证。非交互式知识论证是从证明者到验证者的单条信息,会让整个验证过程变得更加高效。
此外,ZKPs 的性能通常根据以下三个标准来评估:
完备性(Completeness)
如果证明者对证明给出诚实的回答,则验证者就能以极高的置信度确定证明者了解关键数据。
正确性(Soundness)
证明者如果不了解关键数据,就无法欺骗验证者。
零知识性(Zero-knowledge)
证明者不会对验证者透露任何关键数据,而只是间接证明其了解数据。
同时,ZKPs 也可根据其扩容的方式进行更精细的流派分类,其中包括SNARK、STARK、PLONK 和 DARK(Bulletproofs)等,他们都有其各自的优劣势,涉及证明的数据足迹、证明时间、验证时间、串通风险等。下图为常见 ZKPs 基于各自安全强度和规模的比较:
其中,安全性最高的是 STARK 算法,该种算法不依赖数学难题假设,具有抗量子性;
证明尺寸最小的是 SNARK 方案中的 Groth16 算法;
PLONK 也是 SNARK 方案中的一种,安全性和证明尺寸都处于适中。
目前应用最广泛的就是 zk-STARK 和 zk-SNARK 两类。
SNRK, Succinct Non-Interactive Argument of Knowledge,即简洁非交互式知识论据。
所谓简洁性,通常是指即使验证程序很大,生成的 proof size 也不会很大,同时又能很快的完成验证。
在加密应用中,尽管受信任初始化阶段并不是个必要条件,但SNARK之前一直都有采用。
因此按照我们之前解释的,受信任阶段的隐藏参数其实存在潜在的安全隐患的。
如果这些敏感数据在创世后没有销毁,那么秘密参数可能会被用来欺骗验证安全措施、执行欺诈性交易。
这样一来,黑客就可以获得相应私钥的副本,以此伪造通证或加密资产。
值得注意的是,黑客其实并不能侵犯其他用户的敏感数据,也无法从其他钱包中窃取加密货币。因此这个受信任初始化成了SNARK的潜在问题。
据估计,SNARK的汽油费比STARK要少得多,成本更低,更适合散户。
SNARK的证明规模也比STARK小得多,它们需要的链上存储更少,占用融入新区块的内存也很少,这使得SNARK更容易随着网络用户和复杂性增加而扩展。
虽然 SNARK 因较早开发而存在受信任初始化阶段问题,但也正是因为在技术上的先人一步,它比其他 ZKPs 应用得更广泛。例如,ZCash 是 ZKPs 在加密空间中的最早应用,他们随后也创建了大量开发库,学术研究和开发社区。
与SNARK不同
STARK(Scalable Transparent Argument of Knowledge,即可扩透明知识论证)
依赖于哈希函数,类似于工作证明区块链,可以更好地抵抗量子,从而保障应用STARK的协议。因此,STARK的证明规模更大,网络供电需求更高,且验证证明时间更长。
不同于SNARK和PLONK,STARK在程序创世阶段不需要受信私钥初始化。此外,STARK依赖于抗冲突哈希函数形式的更精简的加密技术,因而被认为是一种更有效的ZKPs。
由于社区较小,资料库或论坛等资源也不多,开发人员并不能轻松使用zk-STARK构建协议。尽管有几个项目创建了基于STARK的扩容方案,如Polygon的Miden和Starkware的Starknet,但SNARK社区还需要长时间的发展并增加可用资源。
PLONK, Permutations over Lagrange-bases for Oecumenical Noninteractive arguments of Knowledge,即通用非交互式知识论据的拉格朗日排列。
PLONK在学术上也被称为SNORK,是SNARK非交互式的一种。由于创世受信任初始化阶段是通用且可更新的,PLONK 兼容使用相同证明方案的后续程序,并且允许多方参与受信任初始化,所以只要有一个初始参与者是诚实的,就可以更好地保证安全。
PLONK的另一显著特征是其标准化多项式承诺的模块化,这会让该方案在设计和实施方面更加灵活。
例如,某些开发人员可能需要优先考虑保证安全而不是证明规模,这样一来,证明便需要更长的时间和更大的数据包,还会增加网络费用,并大规模影响网络可扩展性。
无论如何,由于其标准化的Kate承诺,无论选择哪个多项式承诺来验证证明者,大多数基本工具都通用,以便相关智能合约能够相应地执行。
DARK(Diophantine Arguments of Knowledge,即丢番图知识论证)
是一种使用隐藏顺序组(hidden order groups)的新方案。
其使用名为类组(class groups)的隐藏组子集来实现与 SNARK 或 STARK 不同的多项式承诺。隐藏顺序组的独特之处在于它们将任意大的整数压缩为组元素以防止欺骗。许多类型的证明都可以建立在这些多项式承诺结构之上。
使用DARK时,还可以使用 Bulletproofs。这是一种简短的非交互式ZKPs,不需要受信初始化。Bulletproofs很小,单个证明只有不到1kB,而其他ZKPs则有10kB以上。此外,Bulletproofs也使用椭圆曲线组,不过这会导致验证过程更慢,费用更高。
换个角度来看,SNARK比STARK小数千倍,而Bulletproofs的性能则居于两者之间。由于其规模较小且简洁,Bulletproofs和类似的多项式承诺可能会在Web3的某些领域中激增,如Monero的区块链,它们的优势和权衡在这些领域最有意义。