零知识证明(Zero—Knowledge Proof,ZKPs)允许用户既不泄露敏感信息,又可向他人证明自己知悉关键数据或拥有其所有权,例如钱包的私钥。
1. 了解 ZK 证明
在上篇关于以太坊扩容方案的文章中,我们提到了零知识证明(Zero—Knowledge Proof,ZKPs)是一种证明方法,通过这种方法,一方(证明者,prover)可以在不透露任何实际信息的情况下,向另一方(验证者,verifier)证明它知道一个秘密或一个声明是真实的。
放到加密应用中,ZKPs 这种加密方法可在证明用户拥有钱包私钥的情况下不泄露私钥信息,从而保护了数据隐私。例如你的交易数据对于系统来说是透明可追踪的,但采用零知识证明可以保护你的信息不会被贸然公开,某某的钱包有多少个比特币,某某买了多少个比特币之类的信息可以变成选择性隐私。具体关于这类证明过程是怎么实现的?我们要先从受信任初始化阶段这个起点讲起。
许多分布式计算和密码学协议都设计了一个初始化阶段,我们称第一个阶段为初始化阶段(setup phase),第二个阶段为主阶段(main phase)。主阶段通常会执行许多重复的任务,而初始化阶段只需执行一次,就能开启重复运行许多实例的主阶段。对于一个多阶段协议(multi-phase protocol)而言,受信任初始化阶段(trusted setup phase)设置有其特殊性。
在受信任初始化阶段,密钥生成器会获取一个秘密参数和一个程序,然后生成两个可用的公钥,一个用于创建证明,另一个用于验证证明。这两个公钥只需为给定程序生成一次的参数,后续用户则只需使用公共参数并相信秘密参数密钥的创建者会诚实行事并尽力保护他们。
这里就产生了一个辩证性的漏洞,因为知悉秘密参数便可生成假证明,从而欺骗验证者,因此秘密参数在受信任初始化阶段中其实有潜在安全隐患。
2. 零知识证明的类型
ZKPs 有交互式和非交互式两种。交互式 ZKPs,要求证明者对每个验证者相互区分,并对每个验证者发送所需要验证的数据,重复执行相同操作;而非交互式 ZKPs 去掉了交互过程,证明者直接一次性公开验证所需的数据,保证了一次证明即可被多个验证者同时验证。非交互式论证是从证明者到验证者的单条信息,会让整个验证过程变得更加高效。
此外,ZKPs 的性能通常根据以下三个标准来评估:
完备性(Completeness):如果证明者对证明给出诚实的回答,则验证者就能以极高的置信度确定证明者了解关键数据。
正确性(Soundness):证明者如果不了解关键数据,就无法欺骗验证者。
零知识性(Zero-knowledge):证明者不会对验证者透露任何关键数据,而只是间接证明其了解数据。
同时,ZKPs 也可根据其扩容的方式进行更精细的流派分类,其中包括SNARK、STARK、PLONK 和 DARK(Bulletproofs)等,他们都有其各自的优劣势,涉及证明的数据足迹、证明时间、验证时间、串通风险等。下图为常见 ZKPs 基于各自安全强度和规模的比较:
【如图】横轴代表证明尺寸的大小,纵轴则代表安全性假设。其中,安全性最高的是 STARK 算法,该种算法不依赖数学难题假设,具有抗量子性;证明尺寸最小的是 SNARK 方案中的 Groth16 算法;PLONK 也是 SNARK 方案中的一种,安全性和证明尺寸都处于适中。目前应用最广泛的就是 zk-STARK 和 zk-SNARK 两类。
ZK-SNARK
SNRK, Succinct Non-Interactive Argument of Knowledge,即简洁非交互式知识论据。所谓简洁性,通常是指即使验证程序很大,生成的 proof size 也不会很大,同时又能很快的完成验证。
在加密应用中,尽管受信任初始化阶段并不是个必要条件,但SNARK之前一直都有采用。因此按照我们之前解释的,受信任阶段的隐藏参数其实存在潜在的安全隐患的。如果这些敏感数据在创世后没有销毁,那么秘密参数可能会被用来欺骗验证安全措施、执行欺诈性交易。这样一来,黑客就可以获得相应私钥的副本,以此伪造通证或加密资产。值得注意的是,黑客其实并不能侵犯其他用户的敏感数据,也无法从其他钱包中窃取加密货币。因此这个受信任初始化成了SNARK的潜在问题。
据估计,SNARK的汽油费比STARK要少得多,成本更低,更适合散户。SNARK的证明规模也比STARK小得多,它们需要的链上存储更少,占用融入新区块的内存也很少,这使得SNARK更容易随着网络用户和复杂性增加而扩展。
虽然SNARK 因较早开发而存在受信任初始化阶段问题,但也正是因为在技术上的先人一步,它比其他 ZKPs 应用得更广泛。例如,ZCash 是 ZKPs 在加密空间中的最早应用,他们随后也创建的大量开发库,学术研究和开发社区。
▲使用公钥参数,用户可以在维护隐私的同时在表层公开交互。只要私钥参数保密并在创建后销毁,系统就会保持安全。
ZK-STARK
与SNARK不同,STARK(Scalable Transparent Argument of Knowledge,即可扩透明知识论证)依赖于哈希函数,类似于工作证明区块链,可以更好地抵抗量子,从而保障应用STARK的协议。因此,STARK的证明规模更大,网络供电需求更高,且验证证明时间更长。
不同于SNARK和PLONK,STARK在程序创世阶段不需要受信私钥初始化。此外,STARK依赖于抗冲突哈希函数形式的更精简的加密技术,因而被认为是一种更有效的ZKPs。
由于社区较小,资料库或论坛等资源也不多,开发人员并不能轻松使用zk-STARK构建协议。尽管有几个项目创建了基于STARK的扩容方案,如Polygon的Miden和Starkware的Starknet,但SNARK社区还需要长时间的发展并增加可用资源。
ZK-PLONK
PLONK,Permutations over Lagrange-bases for Oecumenical Noninteractive arguments of Knowledge,即通用非交互式知识论据的拉格朗日排列。
PLONK在学术上也被称为SNORK,是SNARK非交互式的一种。由于创世受信任初始化阶段是通用且可更新的,PLONK 兼容使用相同证明方案的后续程序,并且允许多方参与受信任初始化,所以只要有一个初始参与者是诚实的,就可以更好地保证安全。
PLONK的另一显著特征是其标准化多项式承诺的模块化,这会让该方案在设计和实施方面更加灵活。例如,某些开发人员可能需要优先考虑保证安全而不是证明规模,这样一来,证明便需要更长的时间和更大的数据包,还会增加网络费用,并大规模影响网络可扩展性。无论如何,由于其标准化的Kate承诺,无论选择哪个多项式承诺来验证证明者,大多数基本工具都通用,以便相关智能合约能够相应地执行。
ZK-DARK
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的区块链,它们的优势和权衡在这些领域最有意义。
3. 写在最后
区块链本质上透明度非常高,任何在区块链网络中运行的节点都可以查看并下载所有储存在账本中的数据,然而在许多情况下,出于各种商业或法律原因有保障数据隐私的需求,很多涉及隐私的应用都希望采用零知识证明协议,例如供应链公司、企业和银行等传统实体希望创建并执行智能合约,但又可以在竞争中保护商业机密。另外,这些实体通常受到法律监管约束,必须保护客户个人身份数据隐私。
事实上,联盟链的出现可以有效保护机构交易数据隐私,但联盟链在规模和应用上却逊色于公链,公链可以覆盖全世界各地的用户,并形成巨大的网络效应。而零知识证明可以使这些机构安全地与公链网络交互,并同时保护内部敏感数据隐私。因此,我们既要保护隐私数据,也要利用Web3固有的透明度。零知识证明成功为传统企业激活了一系列公链的应用场景,有助于建立更高效的全球经济体系。