最近,以太坊创始人Vitalik Buterin在一篇题为“混合式二层协议的曙光” 的文章里对Rollup方案大加赞赏,认为它为智能合约的可扩展性打开了大门。
那么什么是Rollup?它包括哪些主流方案?这些方案各自有什么优缺点?它们未来发展的前景如何?
Rollup的出现
最近几年,以太坊二层(Layer-2)扩容技术得到了迅猛发展。
所谓二层,就是将一部分资金存储在主链智能合约里,在保证足够安全的前提下,把一部分交易放到主链之外进行,就好像链下多出来了一层网络。
在二层方案里表现比较突出的就是状态通道和 Plasma侧链。虽然这两种方案诞生时间很早,但是发展的却比较缓慢。其背后的原因归根结底是数据的可用性问题。
就在二层扩容技术举步维艰的时候,一种名叫 Rollup的新方案被提了出来。
但是与状态通道和Plasma不同的是,它可以“打包”交易,并将“打包”后的交易数据连同一个SNARK零知识证明发布到链上。
打包的正确性可以通过零知识证明来见证,负责“打包”的操作者不可能发布恶意或无效的交易。这就是后来被Vitalik Buterin称之为ZK Rollup 的二层扩容方案。
ZK Rollup并非万能,它遇到的最大问题就是通用性。除非要证明的交易非常简单,否则创建SNARK证明的成本会非常高。
因此,一种名叫Optimistic Rollup的折中方案被提了出来。
Optimistic Rollup同样也是把交易数据都放到链上,但不是用SNARK做见证,而是采用“加密经济学有效性博弈”来实现有效性验证。
作为一种提高区块链吞吐量的技术,Rollup可以在有效提高网络吞吐量的同时,避免对协议层进行大量的更改,部署Rollup也不需要对网络发起硬分叉升级。
目前已经有许多以太坊上的项目(如Celer,ANON等)采用了Rollup协议来提高Dapp的吞吐量和用户体验。
Rollup是如何工作的?
链上有一个智能合约,它维护状态根:rollup状态的Merkle根(意思是,“余额”内的帐户余额,合同代码等)。
任何人都能够以高度压缩的形式发布批处理,交易集合以及先前的状态根和新的状态根(处理交易后的Merkle根)。
合同检查批处理中的先前状态根是否与其当前状态根相匹配;如果是这样,它将状态根切换到新的状态根。
为了支持存款和提款,我们增加了使输入或输出处于rollup状态“之外”的交易的功能。
如果批次具有来自外部的输入,则提交该批次的事务也需要将这些资产转移到rollup合同中。
如果某个批次有外部输出,则在处理该批次时,智能合约会启动这些提款。
就是这样!除了一个主要细节:如何知道批次中的状态后根是正确的?
如果某人可以提交具有任何后期状态根源的批次而没有任何后果,那么他们可以将rollup中的所有Token转移给自己。
这个问题很关键,因为有两个非常不同的解决方案系列,而这两个解决方案系列就导致了两种rollup方式。
Optimistic Rollup与ZK Rollup
Rollup的两种类型分别是Optimistic rollup和ZK Rollup。
1
Optimistic Rollup
Optimistic rollup,使用欺诈证明—rollup合同会跟踪其整个状态根历史以及每个批次的哈希值。
如果有人发现某个批次的状态后根不正确,则发布需要链的证明,以证明该批次的计算不正确。合同将验证证明,并还原该批次及其之后的所有批次。
2
ZK rollup
ZK rollup,使用有效性证明—每个批次都包含一个称为ZK-SNARK的加密证明(例如,使用PLONK协议),这证明后状态根是执行批次的正确结果。
无论计算量有多大,都可以在链上非常迅速地验证证明。
总的来说,我个人认为,在短期内,对于通用EVM计算而言,乐观可能会胜出;而对于简单付款,交易和其他特定于应用的用例,ZK可能会胜出。
随着ZK-SNARK技术的改进,中长期ZK将在所有用例中胜出。
Rollup工作细节
在Optimistic Rollup中,首先我们需要设立一个可信任的节点,这个节点负责收集所有的交易信息、验证然后打包.
打包后的信息集合将带上该节点的签名发送到区块链网络中。
当一个可信节点设置成功后,该节点将成为Rollup节点,这个节点需要同全节点一样,下载整个区块数据并实时更新区块状态。
我们仍旧以之前那个公司为例,假设目前有2000笔交易正在等待执行,公司的员工会将2000笔交易发给Rollup节点。
之后,Rollup节点需要根据已有的状态和区块数据,对交易进行验证,并保存以下数据集(交易内容,交易前状态,交易后状态)。
当Rollup节点对所有交易完成了验证与执行并生成数据集后,节点需要对这个数据集进行签名,即Sig Rollup节点(交易内容,交易前状态,交易后状态)。
最后将签名与数据集整合到一笔交易中,这个交易被称作断言Assertion,发送到区块链网络等待其他节点验证即可。
需要注意的是,网络中的其他节点并不会验证Rollup节点发来的数据集,仅仅只验证其签名,验证完毕后将根据数据集更新区块链网络状态。
正如它的名称“Optimistic Rollup”,实际上所有的Rollup协议由于将交易验证从链上转移到了链下,因此都是一种基于“乐观”的假设—假设大多数情况下Rollup节点不会作恶。
但光有乐观假设是不足的,节点总会因为各种各样的原因出现问题。
为了避免这些节点恶意行为,提高作恶成本,Optimistic Rollup中还有如下机制:
一方面,Rollup节点需要向网络质押一定额度的Token,这些Token有一定的解锁时间,并会在Rollup节点做出恶意行为时被罚没。
另一方面,Rollup节点所提交断言不会被网络立即认可,所以存在一定时间的窗口期(一般是1周)。
如果其他节点认为该Rollup节点提交的断言存在恶意行为,节点可以质押一定押金并对该断言发起挑战。
并且区块链中的出块/验证节点会对该断言中的所有内容(包括数据集)进行重新验证、执行,比对交易状态的差距。
如果的确存在恶意行为,那么Rollup节点的押金会被罚没,则发起挑战的节点则会获得一定奖励。如果不存在恶意行为,则发起挑战节点的押金会被罚没。
另外,在窗口期结束时没有其他节点对断言发起挑战的话,断言中的状态信息将会被系数更新至区块链状态中。
Optimistic Rollup可以将多个交易信息经可信第三方聚合为单笔信息,由于交易中的状态变更情况是由链下节点验证而非链上节点验证。
因此降低了区块链上节点的验证难度(仅需要验证Rollup节点所提交的签名,并更新由该节点提交的状态信息即可)。
数据集虽然看起来并没有较单个交易的叠加更小,但数据集因为不会受链上节点的验证,故不需要为其支付高昂的手续费。
依靠这种Layer2处理方案,可以很容易的提高区块链的有效吞吐量。
ZK rollup是如何工作的?
一个简单的以太坊交易(发送ETH)需要约110个字节。但是,Rollup上的ETH传输仅占用约12个字节。
ZK特有的一个重要压缩技巧是,如果事务的一部分仅用于验证,而与计算状态更新无关,则可以将该部分留在链下。
这不会完全在乐观的状态下完成,因为如果以后需要在欺诈证明中检查数据,则仍需要将数据包含在链上。
而在ZK中,SNARK证明批次的正确性已证明任何数据提供了验证所需的信息。
还有一个重要的例子是隐私保护,在乐观的状态下,每笔交易中用于隐私的约500字节需要进行保留,而在ZK中,覆盖整个批次的ZK-SNARK已经没有了。
这些压缩技巧是Rollup可伸缩性的关键。没有它们,Rollup可能只会使基础链的可伸缩性提高约10倍,而采用压缩技巧时,缩放系数几乎可以超过100倍所有应用程序。
链金分析
Rollup的基本概念现在已经得到了很好的理解,但我们可以肯定它们在根本上是可行且安全的,并且已经将多个Rollup部署到了主网上。
但仍有很多Rollup设计领域尚未得到很好的探索,充分利用以太坊的可伸缩性,将以太坊生态系统的大部分完全整合到Rollup中还将面临很多挑战。
Rollup是一种强大的新的2层伸缩范例,在短期和中期的未来(以及可能也是长期的)中,有望成为以太坊伸缩的基石。
投资有风险,本文观点和意见仅代表作者本人,并不构成任何建议。