比较零知识证明算法zkSNARK,zkSTARKs,zkBoo,Sonic,BulletProofs

Posted 链巨人

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了比较零知识证明算法zkSNARK,zkSTARKs,zkBoo,Sonic,BulletProofs相关的知识,希望对你有一定的参考价值。

本文分为两部分,第一部分说明零知识能干什么,为什么它这么强大,在区块链中这么火;第二部分比较零知识证明的算法zkSNARK, zkSTARKs, zkBoo, Sonic和BulletProofs的特性。

本文首发在本人知乎专栏中,更多区块链论文阅读,请关注本人知乎哦

第一部分

使用零知识算法能干什么?

设定一个场景,现有一个公共的函数f和一个函数的输出值y,Alice对Bob说她知道x值,但是Bob不信。x可能是Alice花费了很多资源才得来的,为了向Bob证明她知道x同时又不泄露x给Bob,该怎么办?

Alice于是使用零知识证明算法,也就是前面提到的算法,来生成一个证明 π 。Bob认证π,确认Alice是不是真的知道满足函数f的x。

这个函数f是一个通用的函数,只要没有无限循环,那么就能够满足要求来生成证明π。在生成π之前,需要将函数f转换成特定的格式,现已经有专门的工具,如下图。C表示高级编程语言的一个函数。

B. Parno, “Pinocchio: Nearly Practical Verifiable Computation,” in 2013

这样的话,零知识证明就可以应用在很多方面,比如:

使用零知识证明,我能完成签名,但又不暴露我是谁;我能匿名投票;我能匿名转账(zerocash和zerocoin)。概况起来就是:我能证明我的所作所为是符合协议(要求)的,但我不告诉你我做了什么or我是谁(认证者没有从我这里学到有用的信息/知识)

要生成零知识证明,现有比较优秀的算法,分别是:zkSNARK, zkSTARKs, zkBoo, Sonic和BulletProofs。

我们的目的是能否将这些算法应用在区块链中,实现下面的愿景,改善现有区块链系统的scalability:

•生成"π"的时间复杂度(越小越好)

•"π"的大小(越小越好)

•认证"π"的时间复杂度(越小越好)

•需不需要trusted setup?(最好不需要)

如果有一个零知识证明算法能够满足下图所示的条件:

  1. 生成证明π的计算复杂度最多是线性的。
  2. 认证π的计算复杂度最多是对数的。
  3. π的大小复杂度最多是对数的。(随着x和f的大小增大,呈对数增长)。
  4. 无需trusted setup。(后面会讲)

那么我们就认证这是一个“理想的”零知识证明算法。为什么?

因为使用这样的算法,我就能将现有的区块链系统设计成下图所示的样子。区块链可以不用保存原始的交易数据,而是保存证明π,用来证明交易的一致性。矿工不再是重复通过认证原始交易数据来认证,而是通过验证π。而π (1)小于原始交易数据;(2)认证时间比原来的验证方式短。这样可以提高区块链的拓展性。

现有一个问题,现在有没有存在满足上面要求的零知识证明算法呢?结果是:还没有,但比较接近了。

第二部分

下面我们比较这几种零知识证明算法的特性。假如最原始的(证明-认证)的方式是重复计算的方式:在f(x)=y中,证明者和验证者通过直接执行x来验证结果。现在比特币系统就是使用这样的方式。那么这样子生成证明(其实没有生成)的计算复杂度和验证证明的计算复杂度是一样的。

zk-STARK的性能表示成下图所示。它生成证明的时间复杂度随着输入和函数f的复杂度线性变化。而认证的时间复杂度是对数的。

将图中交叉点的部分放大,发现虽然生成证明的时间复杂度是线性的,但它比原始的方式慢100多倍。

生成一个一百多层的merkle树的零知识证明大概需要几秒钟;而认证该证明只需要十几毫秒。

zk-STARK所生成的证明的大小的复杂度(基本)是线性的。计算1E+10次的hash函数所生成的证明大概是300KB。

zk-SNARK是2013年就提出的零知识证明算法,被用在zerocoin上面来实现匿名货币的功能。它的特性如下图所示。它的缺点是需要trusted setup。

什么叫trusted setup?在协议进行证明和认证之前,需要设置和生成一些公共的参数。但是在生成这些公共参数的过程中,生成了一些不能公开的中间数据,需要在完成setup之后把这部分不能公开的数据删除。任何一方拿到这些数据都能够破解协议。问题是:如何保证这些数据真正被删除了呢?解决这个问题的方法之一是使用多方计算的方式来生成这些公共参数,只要一方是诚信的,该协议就是安全的;另一个方法是2019年提出来发表在CCS上的名为Sonic方法,它让这些参数能够不断更新,只要当前的更新者是诚信的,那么当前的参数(包含之前的)就是安全的。

Recursive Snark(Coda)改善了zk-SNARK的trusted setup的计算时间复杂度的问题,让在setup的时候生成这些公共参数的时间复杂度不再是线性增长的。如下图红色线段部分。

BulletProofs是18年提出来的方法,它的一个优点是它所生产的证明的大小是对数变换的。这很有利于将证明保存在区块链中,即使x和函数f很大。只是它的认证的计算复杂度是线性的。

下图进一步比较了zk-STARK, zk-SNARK和Bulletproof的性能。STARK和Bulletproof无需trusted setup,而且后者的证明的大小随着交易数量的急剧增加只变大了一点点。

最后讲讲2016年提出来的zkBoo,它的特点是:生成证明和认证证明的时间复杂度是对数的(超快),但是所生成的证明的大小是线性增长的,具体看下表。个人觉得,这样的特性不是很适合应用在区块链中。因为将它的证明保存在区块链中将会带来很大的存储开销。

 

谢谢

 

zk-STARK作者的演讲:https://www.youtube.com/watch?v=1KSwVIZ82hs


M. Maller, S. Bowe, M. Kohlweiss, and S. Meiklejohn, “Sonic: Zero-Knowledge SNARKs from Linear-Size Universal and Updateable Structured Reference Strings,” 099, 2019. Accessed: Nov. 12, 2020. [Online]. Available: http://eprint.iacr.org/2019/099.

I. Miers, C. Garman, M. Green, and A. D. Rubin, “Zerocoin: Anonymous Distributed E-Cash from Bitcoin,” in 2013 IEEE Symposium on Security and Privacy, May 2013, pp. 397–411, doi: 10.1109/SP.2013.34.


E. B. Sasson et al., “Zerocash: Decentralized Anonymous Payments from Bitcoin,” in 2014 IEEE Symposium on Security and Privacy, May 2014, pp. 459–474, doi: 10.1109/SP.2014.36.


I. Giacomelli, J. Madsen, and C. Orlandi, “ZKBoo: Faster Zero-Knowledge for Boolean Circuits,” p. 16.

B. Bunz, J. Bootle, D. Boneh, A. Poelstra, P. Wuille, and G. Maxwell, “Bulletproofs: Short Proofs for Confidential Transactions and More,” in 2018 IEEE Symposium on Security and Privacy (SP), San Francisco, CA, May 2018, pp. 315–334, doi: 10.1109/SP.2018.00020.

https://www.youtube.com/watch?v=WkCVn2MucEk

https://www.youtube.com/watch?v=_jdnxHuVdQI

https://www.youtube.com/watch?v=oTRAg6Km1os

https://www.usenix.org/conference/usenixsecurity16/technical-sessions/presentation/giacomelli

以上是关于比较零知识证明算法zkSNARK,zkSTARKs,zkBoo,Sonic,BulletProofs的主要内容,如果未能解决你的问题,请参考以下文章

zkSNARKs(零知识证明)简述

深入浅出零知识证明:zkSNARKs基本原理

深入浅出零知识证明:zkSNARKs基本原理

零知识证明ZK-SNARKs的Circom 电路和 Snarks (翻译)

零知识证明ZK-SNARKs的Circom 电路和 Snarks (翻译)

零知识证明ZK-SNARKs的Circom 电路和 Snarks (翻译)