这两天把在以太坊官网找的ETHWORKS写的这篇Zero-Knowledge Blockchain Scalability仔细看了两遍,让我对L2的运行逻辑有了更好的了解,但我对其中的一些技术术语还不太懂,姑且先写出来,后面再慢慢学习消化。
在L1的基础上添加L2的protocol以提高以太坊的最大吞吐量(处理交易的速度)并降低交易费用。L2将计算层放在L2上,大大降低了存储在L1上的数据,这使得交易处理速度更快更便宜,同时利用L1的安全性。
零知识证明的核心组成部分是,一个验证者verifier和一个证明者 prover。证明者P在不透漏知识的前提下,向验证者V证明,P拥有这个知识。
一个用于说明零知识证明的例子是,A和B玩一个包含两个球的游戏,一个球是红色,一个是绿色。A是色盲,这意味着这两个球在A眼中的颜色是一样的,而B视觉正常,B的任务是,向A证明这两个球的颜色不一样。游戏过程是这样的:A将两个球放在背后,每次只拿出其中一个球展示给B看,让B回答每次看到的球是否和上一个看到的球一样。如果A换球了,那么B从颜色上可以判断两次看到的球不一样;同理,如果A没换球,那么B从颜色上可以判断两次看到的球一样。在这个例子中,B是prover,A是verifier。尽管A不知道这两个球的颜色不一样,但A可以根据自己是否换球和B的回答来判断(验证),B是否知道(知识)这两个球的颜色不一样。
那零知识证明怎么用于L2扩容方案中呢?零知识加密可以能够被用于产生加密证明,表明某些计算确实是按照之前约定的规则执行过了。这些证明由程序生成,并能很容易被验证。生成的计算证明在数据上比计算数据本身小很多,除此之外,零知识证明可以做到让交易匿名。
两种验证的情况:
SNARKs,succinct no-interactive argument of knowledge.
STARKs中的T代表transparent,意思是STARKs不需要trusted setup,避免了可能造成整个系统失效的单点失败。对于STARKs来说,证明的数据量更大,但是对于大量交易打包的分摊计算成本更低。
与用户余额相关的交易数据和信息可以放在链上或者链下,这意味着必须在可扩展性和安全性中间作出取舍。
将数据存储在链上,安全性可以得到保障,用户的资产直接放在L1上而不需要做什么,可以确保在L2解决方案提供者的服务器停止运作或者有恶意时,数据依然在L1上可用data availability,可以让用户产生证明,表明他们拥有的资产并随时取出,而不需要与系统互动。基于零知识证明的解决方案并将数据存储在链上的方案叫zkRollups.
将数据存储在链下,就会造成data availability的问题。当扩容方案的提供者不再协作时,普通用户很难提取他们的资产,除非他们能拿到代表他们资产的数据,这种解决方案叫validiums。为了减轻数据可用性问题,他们引入了多方委员会Data Availability Committee,用于存储和共享用户的数据信息,以防提供者有恶意或者不配合。尽管将数据存储在链下会带来数据可用性的问题,但有一个好处是更高的可扩展性,因为链上存储的数据更少了。
zkRollups中处理用户交易的服务器提供者叫做operator。他们扮演prover的角色,收集交易输入数据,然后将它们转化为更轻的零知识证明。计算过程在链下,因此交易本身不会被L1上的智能合约处理,智能合约只需要验证更轻的零知识加密证明,这也是导致手续费更低的原因,在L1上的智能合约扮演的是verifier的角色。
zkRollups的安全性来自于以下几个方面:
为了充分理解zkRollups的扩容潜力,必须首先理解两个机制:
calldata为什么更便宜?
区块链状态需要能被搜查到,这个状态以Merkel tree的数据结构被存储,而且需要快速的存取。因此它总是被存放在快速的SSD驱动中。交易和历史数据可以存在慢一点的HDD驱动甚至便宜的云中。以太坊的扩容瓶颈是SSD驱动的速度和Merkel tree数据结构的存取。