Coda, 去中心化的简洁(succint)的可拓展的加密货币

这里讲Meckler, Izaak, and Evan Shapiro. "Coda: Decentralized cryptocurrency at scale."O (1) Labs whitepaper. May10 (2018): 4.

本文先讲Coda的Intuition,后讲密码学技术。

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

问题描述

在现在的区块链系统中,要认证当前所挖出来的block是否是正确的,需要从区块链的第一个block开始一一认证;要认证一个转账交易是否正确/被打包进区块链,也需要从区块链头开始到该交易所在的区块一一认证。该认证过程需要下载所有的区块链数据。在这些数据达到几百Gb的情况下,普通用户基本不愿意为了查看自己的交易数据是否被成功打包到区块链中而去下载这些数据到本地的来认证。一般情况是,普通用户使用轻客户端,当他发送一笔交易之后,比如购买一杯咖啡,为确认自己的交易是否成功,需要委托某服务提供商来统一确认。
总结起来,当前区块链存在的问题是,认证一个交易需要很大的存储和网络代价。并且,普通用户“委托”其它人来确认交易这样的行为存在安全隐患,因为被委托者可能是不诚信的。
我们希望,不需要委托其他人,不需要下载大量(几百Gb)的区块链数据,普通用户使用自己的移动设备就能够认证/确认一个交易。
目前存在多种解决方案,比如Flyclient,区块链论文9 FlyClient-加密货币的超轻客户端 - Tech之直觉的文章 - 知乎,和让被委托者使用TEE。这里,
Coda便是其中的一个解决方案:

High-level Intuition

我们先假设存在这样一种算法:它生成证明的时间复杂度是线性的,所生成的证明的大小很小且其大小独立于所要证明的数据的大小,认证该证明的时间复杂度是常数的。我们给这个算法起名SNARK。
现在区块链有最开始的两个blocks:block0和block1,block1链接在block0后面,跟当前的区块链系统不同的是,我们另外生成一个证明,证明我们从block0获得block1是正确/符合协议的/数据一致的。下图中间那栏表示这个证明。
在这里插入图片描述

接下来,矿工挖出了第三个block,编号为block2,我们同样生成一个证明来证明从block1到block2是正确的/符合协议的。
在这里插入图片描述

接下来,生成另一个证明,来证明从block0到block2是正确的。
在这里插入图片描述

我们使用递归的方式,就可以生成一个证明,来证明从block0到block4生成过程的正确性的证明。
在这里插入图片描述
在这里插入图片描述

依次类推
对于普通用户,他们怎么使用和认证一个交易呢?
下图绿色部分表示一个交易数据,数字4所在的圈表示block4的Merkle树的根,根的上面是一个证明,证明从block0到block4的生成过程是正确的。
在这里插入图片描述

该用户为了确认/验证该交易已经被正确打包进区块链,它下载那个证明和该交易到Merkle树的根之间的路径,就能完成验证。为什么?因为通过那个SNARK证明(大概1kB),用户能够确认该block4是合法的,通过Merkle树路径(大概20kB)就能证明该交易包含在该block中。
上面便是Coda的概述。如果看不懂上图,可从文末的链接看对应的视频。
涉及到的技术
zk-SNARK 算法,该算法已经有很多研究,它满足上面提到的生成证明的要求。我们可以在github中找到开源实现libsnark。
2. Incrementally computable SNARK,它使用到了Recursive Proof Composition 或者说 Cycle of Elliptic Curves来实现。
对于Recursive Proof Composition,它是一个递归的过程:在t时刻能够对t-1时刻的数据生成一个证明 \pi 来证明t-1时刻的数据是正确的。

在这里插入图片描述
或者表示成下图:
在这里插入图片描述

验证过程表示为:
在这里插入图片描述

2014年以前,Recursive Proof Composition方法计算成本是比较高的。不确定现在是否有改进的方法。
Cycle of Elliptic Curves是Recursive Proof Composition的改进,可表示为:使用两个SNARKs,相互认证。
在这里插入图片描述

为什么要使用两个呢?因为我们希望SNARK能够认证自己所生成的证明 \pi ,以完成递归操作,但是因为SNARK算法中使用到了密码学配对pairing(双线性映射),简单来讲是将两个密文映射成一个新的密文, e(g^a, g^b) = e(g, g)^{ab} ,映射前和映射后的数处在不同的field,因此现在的SNARK无法验证自己所生产的证明\pi 。于是,我们就使用两个SNARK,如上图所示的样子来相互认证。可参考视频link或者对应的论文Scalable Zero Knowledge via Cycles of Elliptic Curves。
在这里插入图片描述

Coda使用了两个SNARK算法来实现Cycle of Elliptic Curves。这两个SNARK分别叫Tick和Tock,使用它们的目的是生成相应的证明。使用过程简述如下。
x0,x1,x2,和x3可以看作blocks。先用Tick分别对每一个x生成一个证明,再分别使用Tock包装Tick生成的证明,然后使用Tick来合并Tock所生成的证明。这个过程对应文章开头的图片。
在这里插入图片描述

更加具体一点,贴上论文这部分内容,其中SNARK如何生成证明这部分是一个黑盒子,我们使用libsnark库就可以完成。

在这里插入图片描述

如有理解上的出入,请指正

reference:
Coda eprint 论文:https://eprint.iacr.org/2020/352.pdf
Coda论文简洁版:https://cdn.codaprotocol.com/static/coda-whitepaper-05-10-2018-0.pdf
Coda视频:https://www.youtube.com/watch?v=eWVGATxEB6M&t=1678s
E. Ben-Sasson, A. Chiesa, E. Tromer, and M. Virza, “Scalable Zero Knowledge via Cycles of Elliptic Curves,” 595, 2014. Accessed: Nov. 19, 2020. [Online]. Available: http://eprint.iacr.org/2014/595.

B. Cohn, E. Shapiro, and E. Tekişalp, “Mina: Economics and Monetary Policy,” p. 7.

B. Bünz, A. Chiesa, P. Mishra, and N. Spooner, “Proof-Carrying Data from Accumulation Schemes,” 499, 2020. Accessed: Nov. 19, 2020. [Online]. Available: http://eprint.iacr.org/2020/499.

猜你喜欢

转载自blog.csdn.net/liangyihuai/article/details/109852210