Optimistic Rollup为什么要这么设计?_MIS:TIMI

编者按:本文来自:以太坊爱好者,作者:JohnAdler,翻译&校对:闵敏&阿剑,Odaily星球日报经授权转载。

此刻正在阅读这篇文章的你一定已经听说过optimisticrollup了吧。它是一个前途无量的新型扩容方案,在2019年的DevCon上引发了热烈讨论。目前已经有很多文章解释了该技术的工作原理,却没有一篇文章来解释其背后的原因。这就导致有很多团队都在尝试用自己的方式来实现optimisticrollup,这种各自为政的开发模式通常不利于整个加密货币经济系统的安全性。本文聚焦于那个被大众忽略的问题:解释optimisticrollup为何能以安全且可持续的方式实现扩容,同时又能保持去中心化的特性。何为OptimisticRollup?

我在2019年6月撰写了optimisticrollup的首个最小可行规范,为我早些时候与Mikerah合著的论文《构建可扩展的去中心化支付系统》提供了一个具体的参数化高级规范。该规范旨在实现区块链发展史上的第一条具有免许可性和可扩展性的免信任型侧链。

-我说的“rollup”不是可以吃的这种-optimisticrollup的运作方式如下:任何人都可以在无需许可地提交一个侧链区块,将整个区块作为有待验证的调用数据发布到链上,并交纳保证金。一个新的侧链区块只能链接到侧链的末端,由链上合约进行追踪。一段较长的时间过后,侧链区块会被确定下来,之后就会退还保证金。从侧链中取款回到主链上的操作要在侧链上发起,只需提供对一个已确定的侧链区块的非交互式包含证明即可。如果一个侧链区块是无效的,且还没有得到最终确认,只要提交一个非交互式错误性证明,回滚这条侧链的末端,这个区块连同其之后的区块都会成为孤块。保证金会被销毁一半,另一半则奖励给提供错误性证明的人。这就实现了一条信任最小化的双向资金桥梁。没错,就是这么简单。那之前为什么一直没能实现呢?我来解释下:为什么要这么设计OptimisticRollup?

事实证明,optimisticrollup和之前的扩容方案之间存在一些细微差异,使前者成为了最有前途的短期至中期扩容方案,让后者成为了历史。这一节会介绍这些重要差异背后的成因。合并共识optimisticrollup最突出的一个特点是合并共识。合并共识是一种可在链上验证的共识协议。但什么是去中心化共识协议呢?去中心化共识协议包含以下几个相互独立的功能:分叉选择规则区块有效性函数领导者选举算法抗女巫机制上述功能保障了区块链的经济安全性:操纵历史是要付出代价的。。在optimisticrollup方案中,侧链是不会出现分叉的,因此不需要分叉选择规则。区块有效性是在链下计算的,而且可以在链上用错误性证明来证明其不正确性。剩下还有领导者选举和抗女巫攻击的问题需要解决。我所提出的规范提议采用“先到先得”机制,即在任一高度上,延长侧链长度的首笔交易会被采纳。领导者选举是隐式的,而且事后才会见出分晓,而抗女巫攻击是通过主链实现的。如此简单的领导者选举规则为何能起到作用?因为以太坊区块链已经提供了安全性。只有出现以下三种情况之时,才能将侧链上的某个区块变成孤块:1)该区块是无效的;2)该区块的某个祖先区块是无效的;3)以太坊区块链发生重组。因此,有效的区块也具备与以太坊同等程度的确定性和安全性!因此,我们不需要复杂的领导者选举算法,或是成本高昂的抗女巫攻击机制来保障安全性。侧链无需付出额外的成本即可获得安全性,因此我们可以极大地简化系统参数的设置。但是,如果我们想要一种能提前知道领导者的方案,该怎么改造呢?一个建议是,可以在链上运行PoS+RANDAO来进行领导者选举。这种情况下,并不需要纳入另一种代币,否则还会产生负面影响。正如比特币白皮书中所言:如果一个贪婪的攻击者所拥有的CPU算力超过了所有诚实节点的算力之和,他就能选择发动双花攻击,或是生成新的代币。他理应发现遵守规则对自己最有利,因为相比于破坏整个系统以及伪造个人资产来说,遵守规则能让他获得比其它矿工加起来都多的区块奖励。正如中本聪所说,原生代币的全部意义就是激励“诚实的大多数”来保护整个系统。在optimisticrollup中没有所谓“诚实的大多数”,也没有独立于主链的安全性概念,因此完全没必要再纳入一种原生代币,否则非但不会有任何助益,比起仅使用以太币来说更不方便。要注意的是,只要是完全在链上运行的领导者选举机制都可以采用,不仅限于我在本文推荐的那些。例如,烧毁证明就是其中之一。optimisticrollup虽然与延迟状态执行和影子链等提议有诸多类似之处,但是一大关键的区别在于合并共识的概念。optimisticrollup的共识协议是完全在链上的智能合约之内运行的;因此,它不会影响到主链的共识规则,也不需要得到其支持。相较之下,延迟状态执行和影子链实行的是链上自动状态转换,需要得到主链共识协议和协议内奖惩机制的明确支持。可持续扩容现在我们已经明白optimisticrollup是如何通过合并共识实现免许可性及其背后的原因了,那么它是如何实现可持续扩容的呢?在撰写本文之时,未压缩的以太坊状态大小在45GB左右。不同于历史数据,状态是不能够被删除的——必须由全节点完整地保存下来,以便验证新区块中的新交易。更糟糕的是,为了验证交易,必须对状态进行很多次随机访问,因此需要将状态存储在RAM——大多数消费级硬件都达不到这个条件——或一个快速的NVMe固态硬盘上。状态增长是以太坊遇到的最大的扩容瓶颈。我们当然可以为状态大小设定一个硬性上限,这样就可以不用担心状态增长问题了,真正的解决方案是实行状态租赁机制,持续向状态的使用者收取费用。然而,在以太坊上部署该机制比想象中更为困难,已经被无限期推迟了。有一个很实用的解决方案,可以通过减缓状态增长的速度来解决这一问题。那就是使用区块链作为数据可用性层。这种模式最初是由zkrollup推广使用的:将侧链交易数据作为调用数据发布到主链上,然后使用有效性证明或错误性证明来确保该数据的正确性。结果证明,存储历史数据的成本比存储状态要低得多。之后,可以通过主链来确保数据可用性,追踪rollup链的区块头,处理存取款,并验证有效性证明/错误性证明,这些都不需要大量使用状态。通过减缓状态增长,扩容就可以实现长期可持续性。Vitalik之前写过一篇很好的文章,总结了如何将链上数据可用性运用到zkrollup和optimisticrollup上。要注意的是,虽然有人指出影子链是完全等同于optimisticrollup的,这显然是不对的。现在,我的想法是创建一条完整的“影子链”,把计算放到链下进行,但是会在生成100个区块之后向主链提交状态转换的承诺。预言机可以将新的区块添加到这条链的末端,其中每个区块内都包含一个由交易组成的列表和一个由这些交易引发的状态转换,...]组成的列表。一个区块生成之后,会有一个长达100个区块的挑战期,在此期间都没有遭到挑战的话,状态转换会被自动应用到主链上。除了未被明确定义,影子链还会自动在链上执行状态转换,不会促进状态增长。optimisticrollup不会执行任何状态转换,除非有用户为此付费。非交互性FTW对于optimisticrollup来说,非交互型错误性证明非常重要。为什么?非交互型错误性证明之所以如此重要,是因为要避免PlasmaCash存在的缺陷之一,即,针对无效历史的交互型退出挑战机制。这种交互型多步骤挑战机制导致PlasmaCash对链拥堵攻击的抵御能力较低。所谓的链拥堵攻击指的是攻击者为了窃取Plasma合约内的全部资金,向主链发送大量“退出”交易。只需要一个非交互型错误性证明就可以将任意数量的无效optimisticrollup区块变成孤块,使系统更能抵御链拥堵攻击。注:由于optimisticrollup使用了错误性证明,如果主链不具备抗审查性的话,依然存在资金遭窃的风险。在optimisticrollup中,提款也是通过非交互型的方式处理的:先是在侧链上发起提款,然后针对主链上一个已得到最终确定的区块生成非交互型包含证明,再利用这个证明来完成提款。然而,这就要求侧链具有免许可性,因此需要的是合并共识,而非一个类似于Plasma的运营方。相比交互型验证游戏来说,非交互型错误性证明更有优势。交互型验证游戏所需的时间比较长。鉴于optimisticrollup是不会产生分叉的,攻击者可以生成一个无效的区块,利用验证游戏造成侧链停摆,从而对系统发动DoS攻击。有了非交互型错误性证明,就可以立即证实欺诈行为。交易延迟问题Optimisticrollup并不会降低交易延迟。每一个侧链区块都需要被提交到主链上,因此出块时间不会低于主链。除了使用足额质押的状态通道之外,暂无其他安全且免信任的方式可以减低这种延迟。不过,你不一定要等到侧链区块得到最终确定之后才接受它的交易。由于optimisticrollup不会产生分叉,成功上链的有效区块必然会得到最终确认,而且该区块的所有数据均可获得,用户可以执行客户端验证,立即接受该区块内的交易。乍看之下,取款延迟似乎也是个问题,但事实并非如此。通常情况下,用户不需要等待其提款得到最终确认。事实上,较长时间的挑战期主要是为了确保加密货币经济安全性,一般来说都不会用得上。一种能够立即取款的简单方法是,在主链或另一条链上与流动性提供者进行原子交换。

-Optimisticrollup可以让你在无需支付gas费用的情况下实现即时交易!-数据可用性挑战我一开始的论文提出了解决数据可用性问题的三种方法:始终将所有数据都发布到链上利用数据可用性挑战,只在必要之时将数据发布到链上利用数据可用性证明数据可用性挑战似乎是个比较简单靠谱的解决方案。遗憾的是,如果是由被攻击方来负担挑战费用的话,他们就会蒙受损失;如果是由攻击方来负担挑战费用的话,整个系统就会每时每刻将所有数据都发布到链上。因此,在设计规范之时,optimisticrollup的选择是始终将所有数据都发布到链上,并以高效率低成本的方式来实现。不过后来,在optimisticrollup上使用数据可用性证明也变得可行了。进一步改进我已经基于最小规范的初始版本撰写了性能改进方案,并总结如下。请注意,重点围绕的是基于UTXO的支付,而非一般的智能合约执行。以太坊1.0上的多线程数据可用性——数据验证和其它预处理步骤都是纯函数,因为它们根本不涉及任何状态。因此,这些步骤都是可以并行的。按照这种方式来使用以太坊将极大减少状态的使用和增长,如果使用的是四核计算机,那么数据可用性吞吐量可以增加四倍。我的计划是通过几个EIP来实现这一点,第一个就是EIP-2242:交易Postdata。无需将中间状态序列化的UTXO链紧凑型错误性证明——针对以太坊智能合约的通用型错误性证明成本很高。在UTXO数据模型内,每个UTXO最多只能创建并消耗一次,每个交易都会完整描述状态转换。区块生产者可以将元数据添加到每个输入上,声明这个输入是由一个特定的输出生成的。如果这种声明有错,则这种错误性是可以通过非交互的方式来证明的。我在另一篇文章中重新分析了BIP-141中提到的错误性证明机制。使用默克尔累加器的无状态查询平行交易验证——状态查询是非常昂贵的。无状态客户端就是通过消除对状态的使用来降低成本。但我们可以搞简单一点:只需免去状态查询即可。“见证数据”是不会立即过期的,其有效性会持续几个区块。这些“见证数据”必须根据最新几个区块的状态转换进行比较,而状态转换可以在UTXO数据模型中通过无状态计算得出。链上非交互型数据可用性证明——如果自始至终都将数据上链的话,会带来巨大的成本,还会导致optimisticrollup只能实现线性扩展。我们可以将共识节点进行可用性检查的能力通过一个FFI函数表示出来,就可以在无需进行分片的情况下获得二次方的可扩展性。这是LazyLedger等系统的核心思想,即,以低成本的方式大幅提高数据可用性。然而,不同于LazyLedger,在以太坊上实现这一思想并不会像前者那样具备横向扩展属性。通过停摆实现免信任型双向桥侧链——使用错误性证明的双向桥侧链必须一直保持在线,这点对用户来说可能有些不便。虽然瞭望塔不适用于PlasmaCash,但它可以应用到optimisticrollup上。但是,我们可以做得更好:可以在侧链运行一段时间后完全停摆,然后向用户提供一个较长的窗口期,以便用户提交错误性证明来决定有效的区块。这段用户必须在线的窗口期是已知且有限的。等窗口期结束之后,才允许取款。如果用户想要早一点取款的话,可以与流动性提供者进行原子交换。构建OptimisticRollup的团队

自从几个月之前第一版OptimisticRollup最小化规范撰写完成以来,我欣然发现很多开发团队都开始构建OptimisticRollup的实现了,其中经历了很多波折和修改。下面是一张不完全列表,列举了我们目前看到的正在构建OptimisticRollup的开发团队。Fuel——聚焦于稳定币支付的UTXO数据模型。可以用来进行任意的ERC-20代币或ETH转账,或是进行原子交换,未来还可以用来进行“断言”脚本撰写。该模型即将上线长期公共测试网。PlasmaGroup——在OVM环境下的通用型类EVM智能合约,已经在Devcon5上宣布与Uniswap达成合作。Arbitrum——使用了交互型验证游戏机制的通用型智能合约。除此之外,新的Arbitrumrollup设计与optimisticrollup大致相同。InterstateNetwork——使用错误性证明的通用型类EVM智能合约。SKALE——使用BLSsignature聚合的Optimisticrollup。NutBerry——使用了交互型验证游戏机制的通用型类EVM智能合约。IDEX——为IDEX交易所构建了“优化型OptimisticRollup”。结论

随着各种各样的optimisticrollup实现项目上线,接下来的一年以太坊将发生巨大改变,其吞吐量将得到大幅提高,并在数据可用性方面进一步实现可持续扩容。我在本文中没有将optimisticrollup与zkrollup进行对比。如果你对此感兴趣的话,可以看一下AlexGluchowski写的这篇文章。感谢MikerahQuintyne-Collins、JamesPrestwich、RobertDrost和JosephChow的审校。

郑重声明: 本文版权归原作者所有, 转载文章仅为传播更多信息之目的, 如作者信息标记有误, 请第一时间联系我们修改或删除, 多谢。

金智博客

[0:15ms0-3:661ms