本文为 EthWorks 撰写的一份关于零知识证明和区块链扩展方案关系的报告;对可扩展性问题、零知识证明和 ZK rollup 扩展方案都做了简洁的介绍。本译稿的校对得到了安比实验室的大力支持,他们对原报告解释不足及有所疏漏的地方做了相当多的说明(后文括号以 “安比按” 开头的文段即他们补充的内容)。在此对他们致以诚挚的谢意。
1. 引言
1.1 可扩展性问题
你可能已经很了解区块链的历史了(但我还是多废话一下)。2017 年,比特币开始登上主流媒体的头版头条,激起了前所未有的关注,全球人民都看到了该技术所面临的挑战。随着比特币日趋流行,比特币交易亦大量发生,网络拥堵达到了前所未有的程度。交易手续费的暴涨使得比特币转账变得脱离实际。最近,以太坊也显露出了同样的问题。相比低峰时期,以太坊上的矿工费(Gas Fee)已经增长了 30 至 50 倍。
所有这些现象反映出的问题是整个社区早就心知肚明的:比特币区块链的初始设计并不适合大规模普及。由于比特币每秒的最大交易处理量只有数笔,远远比不上 Visa 或 PayPal 等主流支付网络。我们通常将这个局限性称为区块链可扩展性问题。
以太坊的目的是比比特币更快地确认交易,但是远不足以解决这个问题。以太坊的交易吞吐量 —— 高于比特币,但是每秒交易处理量只有十数笔 —— 还不足以让该网络实现大规模采用。以太坊也会出现拥堵情况,即使是很简单的智能合约操作也需要花费数美元。
边注:区块链的实际吞吐量
鉴于比特币的设计,其交易吞吐量从理论上来说只有每秒 7 笔。实际上,由于空块、复杂的输入和输出交易等问题,吞吐量平均只有每秒 3 笔。当比特币网络于 2017 年通过软分叉更新隔离见证协议后,吞吐量增至 4.6 笔,还是连每秒 7 笔都达不到。
同样地,以太坊的设计交易吞吐量是每秒 15 笔。不过,这个限制是动态变化的(取决于矿工所设定的区块 Gas Limit)。假设当前网络将区块的 Gas 上限设为 1200 万,实际吞吐量将达到每秒 36 笔以上。但是,这一推论仅适合于区块中只有以太币转账交易的情形,因为代币转账的成本要高出 2.5 倍,更别提与智能合约进行更复杂的交互了 —— 其成本通常会高得多。
在区块链行业,已经有许多可扩展性项目惨遭失败。还有的项目仅仅停留在白皮书阶段,或削足适履、扭曲区块链的内涵来骗取关注。我们有理由认为,可扩展性问题没有最终的解决方案,新的解决方案总会增加复杂性和难度。
即使我们接受了这个事实,过去几年间可扩展方案领域的进展仍然令人沮丧。但是,黑暗的尽头是光明,我们即将迎来转机。
今年早些时候,一位客户要求我们调查可扩展性方案的市场时,我们似乎听到了一场革命的号角。最近,几个前景光明的团队已经宣布了项目里程碑。以太坊社区又开始跃跃欲试起来。
我们知道,过多的信息可能反而会起误导作用,让人难以把握全貌,因此我们决定帮大家梳理一下。通过本文,我们想要分享我们与区块链开发者乃至整个区块链社区进行可扩展性研究所得出的成果。我们相信,本文将帮助大家了解零知识证明和二层可扩展性方案的潜力,同时更深入地理解这些技术。
1.2 报告内容
比起以往,可扩展方案的市场已经有所发展,无数致力于开发此类方案的公司割据一方。面对如此海量的解决方案,我们很容易感到迷失,难以辨别哪些方案最有前景。
因此,我们决定认真分析并比较这些解决方案,找出那些最有潜力的方案、帮助企业家和开发者做出正确选择。我们主要关注基于零知识证明的二层方案,因为我们发现这些方案具有很高的安全性和相对较短的资金退出时间,因此从长远角度来看潜力最大。
还有至少两类前景良好的方案本文没有涉及:optimistic rollup 和状态通道。这两类方案都不是基于零知识证明构建的,因此不在本文的讨论范围内。
边注:什么是二层解决方案?
二层可扩展性解决方案的目标是在现有区块链的基础上增加额外的协议,提高以太坊的最大吞吐量(即,处理交易的速度)并减少终端用户所需支付的交易费。不同于 ETH 2.0 等一层方案,二层方案将基础协议作为一个去中心化的安全层,然后在上面构建另一层(不改变以太坊的共识算法或其他任何核心概念)。
二层方案将原本由以太坊执行的计算转移到了链下,将以太坊作为安全性保障。由于计算被转移到了链下,需要存储在链上的数据量大幅减少,在降低交易成本的同时加快了交易速度。
2. 零知识证明
2.1 简介
本文详细介绍的解决方案使用零知识证明密码学来确保交易安全性并实现链下计算。因此,在深入研究可扩展性解决方案之前,我们需要对零知识证明技术有个基本的了解。
零知识证明(简称 ZK)是密码学的分支,是区块链社区近年来追逐的热点之一。通过零知识证明,一方(证明者)可以向另一方(验证者)证明他拥有一些知识,但是无需透露知识本身及其它可以用来破解这些知识的信息。证明者只需向验证者传达并证明的信息是,他确实拥有这些知识。
听不懂也没关系。我们来举个简单的零知识证明的例子:
2.2 现实生活中的例子
关于零知识证明是如何运作的,Konstantinos Chalkias 举过一个绝妙的例子。假设有两个好朋友 Victor 和 Peggy,他们都喜欢在双休日去公园玩杂耍球。Victor 是红绿色盲症患者。对他来说,这些球的颜色都一样。
两人决定像往常一样去中央公园(Central Park)玩杂耍球。Peggy 自己带了一个红球和一个绿球。红绿色盲症患者 Victor 无法看出这两个球的区别。
为了向 Victor 证明两个球的区别,Peggy 让 Victor 一手抓着一个球藏在背后,然后反复交换手中的球。每次交换过后,Victor 都会向 Peggy 展示任意一个球,问她这个球是否与上个球不同。
每当 Victor 交换过手中的球,Peggy 都能辨别出他展示的球是否与上一次不同,因为她分得清红色和绿色。这样一来,Victor 就可以确定 Peggy 知道这两个球的不同,同时他又无法知道这两个球的颜色。这就是零知识证明。
尽管 Peggy 有高达 50% 的概率可以猜中一两次,但是随着他们重复的次数越多,猜中的概率就会无限趋近于零。因此,Victor 完全可以确定这两个球的颜色是不同的。
- Vitcor(验证者)眼中的世界 -
- Peggy(证明者)眼中的世界 -
2.3 零知识证明和区块链
零知识证明可以用来生成关于某个计算已经按照预定规则执行的密码学证明。这类证明可以用编好的计算机程序来生成,并可以自动验证。
零知识证明之所以有助于解决可扩展性问题,是因为零知识证明本身比其所代表的数据小得多,零知识证明可以用来实现交易的匿名化。
(安比按:不是所有的零知识证明技术生成的 proof 都比 statement 小得多。XM返佣https://www.kaifx.cn/broker/xm.html零知识证明技术仅必须满足三种要求:完备性(completeness)、可靠性(soundness)、零知识性(zero-knowledgeness),并不要求一定要具备这种小体积性。)
边注:基于零知识证明的可扩展性方案并不会从根本上改变区块链的扩展性,只是改变区块链的用法:小型计算全部从链上转移到链下执行,区块链只需验证大批计算结果即可。
通过二层扩展方案生成的零知识证明首先需要遵守一组预定义规则。如果是交易系统,这组规则可能类似区块链的共识规则,例如,每个交易必需署上正确的签名,或者用户不得透支等。二层系统将规则转化成了一连串数学表达式(电路和多项式),然后使用这些数学表达式来创建零知识证明生成过程所必需的两个计算机程序:证明者与验证者。
只要有了证明者和验证者,我们就可以使用该系统生成并验证交易。假设 Alice 的钱包里有 3 ETH ,她想向 Bob 转一笔账。她签署了交易,交易数据被提交到了证明者手里。证明者使用该数据生成了一个零知识证明,然后发送给验证者。现在让我们考虑以下两个场景。
2.3.1 生成一个有效的零知识证明
验证者可以在完全不知道交易信息的情况下验证 Alice 是否按照预定义规则执行了交易。其中一条规则是 Alice 不能透支,因此如果她想转账 2 ETH ,验证者会同意该交易。
2.3.2 生成一个虚假的零知识证明
现在,假设 Alice 想要发送 5 ETH 。按理说,该交易在证明者阶段就会遭到拒绝。即使证明者作恶,该交易也得不到许可,通不过验证者的验证,因为它没有按照规定执行。
(安比按:读者应该注意到了,2.3.1 章节和 2.3.2 章节分别就是零知识证明属性中的 “完备性” 和 “可靠性”:正确的证明必定能够通过验证;错误的证明必定不能通过验证。这里并没有用到零知识证明的 “零知识性”。因此,若不需要满足隐私要求,仅仅是为了提高可扩展性,则任何满足完备性、可靠性、简洁性(证明体积小)、验证速度快的证明系统,实际上都能用作同样的用途。因此,Vitalik 就曾提议 “以 snarks 替换掉 ZK rollup 的 ZK 前缀”,或者更细致的命名比如 “Validium”,因为这些方案实际上都没有用到零知识属性。包括 StakWare 也一直在强调自己是在利用证明系统(proof system)实现计算完整性(computational integrity)证明。但在 “ZK rollup” 深入人心的情况下,AZTEC 使用零知识证明(提供隐私性)的 rollup 方案,只好命名为 “ZK-ZK-rollup”。令人唏嘘)
2.4 SNARK vs. STARK
目前为止,已经有很多基于零知识证明的密码学证明兴起,其中最知名的莫过于 SNARK 和 STARK 。它们之间有着非常重要的联系。
SNARK 代表的是:
简明性(succinct):该证明远小于其所代表的数据,并且可以迅速验证。
非交互式(non-interactive):证明者只会发送一组信息给验证者,因此二者之间不需要来回交互。
知识论证(argument of knowledge):从计算层面来说,我们认为该证明是完备的 —— 恶意证明者无法欺骗系统,除非 TA 确实掌握该知识的具体内容,以此支持 TA 提出的证明。
(安比按:密码学中对 proof(证明方案)和 auguement(论证方案)还有区分。方案的可靠性(soundness)要能达到对抗具备无限大计算资源的证明者,才能称为 proof;而 arguement 只需能抵御计算能力为多项式的恶意证明者即可,不需要能抵御计算能力无穷大的恶意证明者。)
可扩展性解决方案所使用的 SNARK 需要在证明者和验证者之间构建可信初始化(trusted setup)。 可信初始化是一组类似游戏规则的初始公共参数,由一群志愿参与者在指定时间执行联合计算,即,所谓的可信初始化仪式(trusted setup ceremony),来生成。只要有至少一位参与者是诚实的,就能安全地生成参数。因此,参与者人数越多,机制的可信度就越高。
STARK(例如 StarkWare 开发的 FRI-AIR STARK)不需要可信初始化 —— 因此,此处的 “T” 代表 “透明的(transparent)” 。这就为整个系统排除了单点故障的隐患。虽然 STARK 证明的数据量较大,但对大批次的交易可以平摊计算成本。因此,STARK 能够提高可扩展性。
边注:就基于早期 SNARK 技术(即,Groth16)的解决方案而言,每当 Groth16 上线新的版本,都要执行可信初始化仪式。因此,下文所述的 Loopring 去年上线最新版本时,也需要执行该机制。SNARK 还有一种变体称为通用 SNARK(Universal SNARK)或 SNORK(例如,PLONK 和 SONIC)。该技术使用的是通用可信初始化(universal trusted setup)。例如,zkSync 的创建者无需在上线新版本时执行可信初始化机制:他们复用了去年包括 Vitalik 在内的 200 多位知名人士一起执行的多方计算的执行结果。通过通用可信初始化,可以扩展或更新协议中所使用的零知识证明方案,而无需执行一个新的仪式。
(安比按:SNORK = Succinct Non-interactive Oecumenical (Universal) aRguments of Knowledge (简洁的非交互性通用知识论证),实际上就是带有通用且可升级的可信初始化设置的 SNARK。)
- 不同的密码学证明方案之间关系的示意图(来源:Alex Gluchowski) -
3. 架构
本文所述解决方案的共同点是都使用了零知识密码学。它们之间的差异性则源自数据可用性问题。
3.1 数据可用性问题
用户余额相关的交易数据和信息可以存储在底层区块链上,也可以不存在区块链上,这就要在可扩展性和安全性之间进行基本的权衡取舍。
链上存储数据的安全性类似于直接将资产存储在以太坊上,而无需用户执行额外的操作。用户可以随时获取数据。这一点非常重要,尤其是在可扩展性解决方案提供商的服务器被破坏或作恶的情况下。链上数据可用性可以让用户创建一个证明来证明他们持有一定数量的代币,无需与二层系统进行交互就可以直接将这些代币从智能合约中取出。将数据存储在链上的基于零知识证明的解决方案被称为 zkRollup 。
将数据存储在链下的可扩展性方案引入了数据可用性问题,因此会削弱二层方案的安全性。一旦某个可扩展性解决方案提供商终止合作,普通用户就无法取出他们的资金,除非他们能获得代表其余额的数据。这类解决方案被称为 Validium 。为了缓解数据可用性问题,这类方案或将引入一个多方委员会(multi-party committee),由这个委员会负责存储数据副本,并在提供商作恶或终止服务的情况下将数据副本分享给用户。
但是,将数据存储在链下有一个很大的优势:更高的可扩展性。采用链下存储的解决方案无需受制于区块链的局限性。因此,相比采用链上存储的解决方案,这类方案更有助于提高交易吞吐量。
最近,StarkWare 提出了一种混合式解决方案,可以让用户自由选择将数据存储在链上还是链下。用户每发起一笔交易都可以选择一次,因此他们的选择是动态变化的。这种可扩展性解决方案被称为 Volition。
来源:oschina
链接:https://my.oschina.net/u/4219976/blog/4444389