一文纵览ZK方案全明星项目
隐私性在加密货币社区一直被视为非常有价值的特性之一,因为对于大多数加密资产持有者而言,他们不希望自己的资产和交易记录被完全公开。而在提供隐私性的各项加密技术中,零知识证明(Zero-Knowledge Proof)技术是非常重要的存在之一。本文不涉及专业的密码学知识,仅是对零知识证明进行理论表达,帮助读者粗略地复原一下零知识证明系统的全貌及目前的发展现状。
零知识证明技术发展
零知识证明概念
零知识证明(ZKP)是现代密码学的一个重要组成部分,它指的是证明者能够在不向验证者提供任何有用的信息的情况下,使验证者相信某个论断是正确的。零知识证明实质上是一种涉及两方或更多方的协议,即两方或更多方完成一项任务所需采取的一系列步骤。证明者向验证者证明并使其相 信自己知道或拥有某一消息,但证明过程不能向验证者泄漏任何关于被证明消息的信息。通俗的来讲就是:既证明了自己想证明的事情,同时透露给验证者的信息为"零"。
零知识证明本身涉及到的是比较复杂的密码学算法,但是为了让大家对零知识证明有一个理论上的了解,我们引用一个【找熊猫】的例子:
一群人在这张图中找一只熊猫,小A率先发现了熊猫位置,但是他不能立马公开指出来,因为这样就破坏了其他人的游戏体验。
有没有什么办法,即能够证明小A知道熊猫在哪儿,又不会让其他任何人知道答案呢?
于是小A找来一张超级大的白纸,并把这张纸随意地覆盖在有熊猫的图片上。然后,小A在白纸上剪出一个小洞,只让熊猫露出来。
这样,熊猫的位置作为关键信息,是被保护起来的,但小A还是能够在不让其他人知道熊猫在哪儿的前提下,证明自己找到了熊猫,这就是零知识证明。
零知识证明的验证方法强调的是完备性和可靠性。完备性原则是指,证明者能够说服证明者接受一条正确的陈述;可靠性原则是指,证明者不能说服验证者接受一个错误的陈述。但事实上,可靠性仍然是概率性的,只是说证明者要作弊的可能性极其低。
因为零知识证明的可信度会取决于两个因素:一是证明的难度,二是交互的程度。证明的难度即直接从数学性质上增加证明的难度;交互的程度是指验证者需要不断对证明者进行提问,再由证明者证明,随着交互次数的增多,证明者要欺骗验证者的难度也会增加,因为证明者在不知道正确信息下提供正确证明的概率在统计学上是递减的。
零知识证明理论演变
零知识证明概念最初是由S.Goldwasser、S.Micali及C.Rackoff在1985提出的,他在其论文中引入“交互”和“随机性”,构造了早期【交互式证明系统】。交互式证明会要求验证者不断对证明者所拥有的“知识”进行一系列提问。证明者通过回答一系列问题,让验证者相信证明者的确知道这些"知识"。这样产生的问题越多,交互的次数就越多,但是这样的方法并不能使人相信证明者和验证者都是真诚的,两者可以提前串通,以便证明者可以在不知道答案的情况下依然通过验证。
在随后的十几年里,有不少传奇的密码学家为零知识证明系统的发展做出重要贡献。比如M. Blum, P. Feldman, and S. Micali指出了”交互”与“隐藏随机性”并不是必要的,继而提出基于公共参数 CRS (Common Reference String)模型的【非交互式零知识证明系统】。非交互式证明即证明者不需要和验证者进行交互,系统内会需要事先设置一组公共参数,交易依靠零知识证明的公共参数进行构建和验证。这也就意味着证明者可以独立生成证明,避免了证明者和验证者串通的可能性。
2010年,Jens Groth提出一种在当时颇具争议性的指数知识假设(Knowledge of Exponent Assumption),通过把一些秘密随机值隐藏到CRS中,将证明长度缩短到常数级别。这个过程可以理解为创建了一个只有系统“知道”的秘密,而任何了解如何生成该公共参数的人都可以伪造证明,这一过程就是【初始化可信设置】。该方案虽然大幅缩减了证明长度,但是也带来了一些安全风险,因为任何了解如何生成该公共参数的人都可以伪造证明。不过,这一方案确立了未来十年最重要的零知识证明技术分支。
而伴随着零知识证明理论的不断发展,密码学家们开始在工程化方向上深入研究。2013年,Rosario Gennaro,Craig Gentry等人在Jens Groth 2010年工作的基础上,做出更加优化的改进方案,大大缩短证明时间,并且将证明长度缩小到更加小的常数级别。随后,Parno等人在此基础上实现了一个叫做Pinocchio的可验证计算协议,并且继续做了优化和改进。
2014年,加密隐私货币ZeroCash诞生了,Eli Ben-Sasson, Alessandro Chiesa等人稍稍改进了Pinocchio协议,这是零知识证明技术在区块链领域的第一个成功实现。ZeroCash就是Zcash的前身,Zcash团队也在零知识证明工程化方面做出了比较大的贡献。
零知识证明发展现状
零知识证明技术与Zcash的结合,让人注意到其在区块链领域能够发挥的巨大作用,也是零知识证明技术从理论走向应用的重要实践。
零知识证明目前主要有以下几种方案,每种方案都代表着不同的零知识证明实践,不同的实践也会产生不一样的效果,主要体现在安全性、证明尺寸、计算速度和验证速度上。
横轴代表证明尺寸的大小,纵轴则代表安全性假设。其中,安全性最高的是STARK算法,该种算法不依赖数学难题假设,具有抗量子性;证明尺寸最小的是SNARK方案中的Groth16算法;PLONK也是SNARK方案中的一种,安全性和证明尺寸都处于适中。目前应用最广泛的就是zk-STARK和zk-SNARK两类。
zk-SNARK
SNARK(Succinct Non-Interactive Argument of Knowledge)是简洁非交互式知识论证的缩写。该种方案的特性是简洁的,即验证过程不涉及大量数据传输以及验证算法简单,这就意味着验证时间不会随着运算吞吐量而成倍增长。其次,非交互式知识论证是从证明者到验证者的单条信息,会让整个验证过程变得更加高效。而Groth16是目前验证速度最快、数据量最小的zk-SNARK,Zcash是其首个广泛实现。Groth16是在Pinocchio协议上做了进一步优化,在略微加强安全性假设的情况下,把证明尺寸压缩了将近一半。
但是Groth16方案的备受争议的一点就是【初始化可信设置】,因为CRS中隐藏的随机值通常是有