此刻正在阅读这篇文章的你一定已经听说过 optimistic rollup 了吧。它是一个前途无量的新型扩容方案,在 2019 年的 DevCon 上引发了热烈讨论。目前已经有很多文章解释了该技术的工作原理,却没有一篇文章来解释其背后的 原因。这就导致有很多团队都在尝试用自己的方式来实现 optimistic rollup ,这种各自为政的开发模式通常不利于整个加密货币经济系统的安全性。
本文聚焦于那个被大众忽略的问题:解释 optimistic rollup 为何能以安全且可持续的方式实现扩容,同时又能保持去中心化的特性。
何为 Optimistic Rollup ?
我在 2019 年 6 月撰写了 optimistic rollup 的首个最小可行规范,为我早些时候与 Mikerah 合著的论文《构建可扩展的去中心化支付系统》提供了一个具体的参数化高级规范。该规范旨在实现区块链发展史上的第一条具有免许可性和可扩展性的免信任型侧链。
-我说的 “rollup” 不是可以吃的这种 – optimistic rollup 的运作方式如下:任何人都可以在无需许可地提交一个侧链区块,将整个区块作为有待验证(即有待默克尔化)的调用数据(calldata)发布到链上,并交纳保证金。一个新的侧链区块只能链接到侧链的末端,由链上合约进行追踪(从最简化的角度看,该合约就像在运行一个侧链的轻客户端,存储着侧链区块头的哈希值)。一段较长的时间过后(这是一个系统参数,但需要足够长,例如一至两周),侧链区块会被确定下来,之后就会退还保证金。从侧链中取款回到主链上的操作要在侧链上发起,只需提供对一个已确定的侧链区块的非交互式包含证明(non-interactive inclusion proof)即可。如果一个侧链区块是无效的,且还没有得到最终确认,只要提交我来解释下:为什么要这么设计 Optimistic Rollup?
事实证明,optimistic rollup 和之前的扩容方案之间存在一些细微差异,使前者成为了最有前途的短期至中期扩容方案,让后者成为了历史。这一节会介绍这些重要差异背后的成因。
合并共识
optimistic rollup 最突出的一个特点是合并共识(merged consensus)。合并共识是一种可在链上验证的共识协议(除此之外还有真正的区块验证,它是通过隐式的错误性证明来完成的)。但什么是去中心化共识协议呢?
去中心化共识协议包含以下几个相互独立的功能:
- 分叉选择规则(如何在两条都遵守了共识规则而形成的链之间选择出一条链)
- 区块有效性函数(状态转换函数)
- 领导者选举算法(通过该算法选举出一位领导者来生成新的区块,链接到区块链的末端,从而增加区块链的高度,或者说增加其长度)
- 抗女巫机制(工作量证明、权益证明等)
上述功能保障了区块链的经济 安全性 :操纵历史是要付出代价的。(注意:为了简单起见,这里我忽略了一些事实,例如,一些去中心化共识协议是无领导者的)。
在 optimistic rollup 方案中,侧链是不会出现分叉的,因此不需要分叉选择规则。区块有效性是在链下计算的,而且可以在链上用错误性证明来证明其不正确性。剩下还有领导者选举和抗女巫攻击的问题需要解决。
我所提出的规范提议采用 “先到先得” 机制,即在任一高度上,延长侧链长度的首笔交易会被采纳。领导者选举是隐式的,而且事后才会见出分晓,而抗女巫攻击是通过主链实现的(即,交易费和 区块大小/Gas 上限)。如此简单的领导者选举规则为何能起到作用?因为以太坊区块链已经提供了安全性。只有出现以下三种情况之时,才能将侧链上的某个区块变成孤块:1)该区块是无效的;2)该区块的某个祖先区块是无效的;3)以太坊区块链发生重组。因此,有效的区块也具备与以太坊同等程度的确定性和安全性!因此,我们不需要复杂的领导者选举算法,或是成本高昂的抗女巫攻击机制来保障安全性。侧链无需付出额外的成本即可获得安全性,因此我们可以极大地简化系统参数的设置。
但是,如果我们想要一种能提前知道领导者的方案,该怎么改造呢?一个建议是,可以在链上运行 PoS + RANDAO 来进行领导者选举。这种情况下,并不需要纳入另一种代币,否则还会产生负面影响。正如比特币白皮书中所言:
如果一个贪婪的攻击者所拥有的 CPU 算力超过了所有诚实节点的算力之和,他就能选择发动双花攻击,或是生成新的代币。他理应发现遵守规则对自己最有利,因为相比于破坏整个系统以及伪造个人资产来说,遵守规则能让他获得比其它矿工加起来都多的区块奖励。
正如中本聪所说,原生代币的全部意义就是激励 “诚实的大多数” 来保护整个系统。在 optimistic rollup 中没有所谓 “诚实的大多数”,也没有独立于主链的安全性概念,因此完全没必要再纳入一种原生代币,否则非但不会有任何助益,比起仅使用以太币来说更不方便。
要注意的是,只要是完全在链上运行的领导者选举机制都可以采用,不仅限于我在本文推荐的那些。例如,烧毁证明(Proof-of-Burn)就是其中之一。
optimistic rollup 虽然与延迟状态执行(delayed state execution)和影子链(shadow chain)等提议有诸多类似之处,但是一大关键的区别在于合并共识的概念。optimistic rollup 的共识协议是完全在链上的智能合约之内运行的;因此,它不会影响到主链的共识规则,也不需要得到其支持。相较之下,延迟状态执行和影子链实行的是链上自动状态转换,需要得到主链共识协议和协议内奖惩机制的明确支持。
可持续扩容
现在我们已经明白 optimistic rollup 是如何通过合并共识实现免许可性及其背后的原因了,那么它是如何实现可持续扩容的呢?
在撰写本文之时,未压缩的以太坊状态(用户余额和合约存储)大小在 45GB 左右。不同于(交易和区块之类的)历史数据,状态是不能够被删除的——必须由全节点完整地保存下来,以便验证(即,执行)新区块中的新交易。更糟糕的是,为了验证交易,必须对状态进行很多次随机访问,因此需要将状态存储在 RAM —— 大多数消费级硬件都达不到这个条件 —— 或一个快速的 NVMe 固态硬盘上。状态增长是以太坊遇到的最大的扩容瓶颈。
我们当然可以为状态大小设定一个硬性上限,这样就可以不用担心状态增长问题了,真正的解决方案是实行状态租赁机制,持续向状态的使用者收取费用。然而,在以太坊上部署该机制比想象中更为困难,已经被无限期推迟了(编者注:中译本见文末超链接《论状态租金和 Stateless Ethereum》)。
有一个很实用的解决方案,可以通过减缓状态增长的速度来解决这一问题。zk rollup 推广使用的:将侧链交易数据作为调用数据发布到主链上,然后使用有效性证明或错误性证明来确保该数据的正确性。结果证明,存储历史数据的成本比存储状态要低得多(低几个 数量级 )。之后,可以通过主链来确保数据可用性,追踪 rollup 链的区块头,处理存取款,并验证 有效性证明/错误性证明,这些都不需要大量使用状态。通过减缓状态增长,扩容就可以实现长期可持续性。Vitalik 之前写过一篇很好的文章,总结了如何将链上数据可用性运用到 zk rollup 和 optimistic rollup 上。
要注意的是,虽然有人指出影子链是完全等同于 optimistic rollup 的,这显然是不对的。
现在,我的想法是创建一条完整的 “影子链”,把计算放到链下进行,但是会在生成 100 个区块之后向主链提交状态转换的承诺。预言机可以将新的区块添加到这条链的末端,其中每个区块内都包含一个由交易组成的列表和一个由这些交易引发的状态转换 [[k1, v1], [k2, v2] … ] 组成的列表。一个区块生成之后,会有一个长达 100 个区块的挑战期,在此期间都没有遭到挑战的话,状态转换会被自动应用到主链上。
除了未被明确定义,影子链还会自动在链上执行状态转换,不会促进状态增长。optimistic rollup 不会执行任何状态转换,除非有用户为此付费(即,取款)。
非交互性 FTW
对于 optimistic rollup 来说,非交互型错误性证明非常重要。为什么?
非交互型错误性证明之所以如此重要,是因为要避免 Plasma Cash 存在的缺陷之一,即,针对无效历史的交互型退出挑战机制。这种交互型多步骤挑战机制导致 Plasma Cash 对链拥堵攻击的抵御能力较低。所谓的链拥堵攻击指的是攻击者为了窃取 Plasma 合约内的全部资金,向主链发送大量 “退出” 交易(不过,Plasma Cash 对这些攻击抵御能力比 Plasma M(ore)VP 更高)。只需要一个非交互型错误性证明就可以将(单条侧链上)任意数量的无效 optimistic rollup 区块变成孤块,使系统更能抵御链拥堵攻击。注:由于 optimistic rollup 使用了错误性证明,如果主链不具备抗审查性的话,依然存在资金遭窃的风险。
在 optimistic rollup 中,提款也是通过非交互型的方式处理的:先是在侧链上发起提款,然后针对主链上一个已得到最终确定的区块生成非交互型包含证明,再利用这个证明来完成提款。然而,这就要求侧链具有免许可性,因此需要的是合并共识,而非一个类似于 Plasma 的运营方。
相比交互型验证游戏来说,非交互型错误性证明更有优势。交互型验证游戏所需的时间比较长。鉴于 optimistic rollup 是不会产生分叉的,攻击者可以生成一个无效的区块,利用验证游戏造成侧链停摆,从而对系统发动 DoS 攻击。有了非交互型错误性证明,就可以立即证实欺诈行为(然而,需要注意的一点是,错误性证明的证明范围比交互型验证游戏要窄——至于这种局限性是否真的对区块链应用有很大影响,这点尚待讨论)。
交易延迟问题
Optimistic rollup 并不会降低交易延迟。每一个侧链区块都需要被提交到主链上,因此出块时间不会低于主链。除了使用足额质押的状态通道之外,暂无其他安全且免信任的方式可以减低这种延迟。
不过,你不一定要等到侧链区块得到最终确定之后才接受它的交易。由于 optimistic rollup 不会产生分叉,成功上链的有效区块必然会得到最终确认,而且该区块的所有数据均可获得(因为所有有效区块都发布在链上),用户可以执行客户端验证,立即接受该区块内的交易。
乍看之下,取款延迟似乎也是个问题,但事实并非如此。通常情况下,用户不需要等待其提款得到最终确认。事实上,较长时间的挑战期主要是为了确保加密货币经济安全性,一般来说都不会用得上。一种能够立即取款的简单方法是,在主链或另一条链上与流动性提供者(或其他想要在这条 rollup 链上存款的用户)进行原子交换 [参见链接中的 “快速提款:流动性提供者” 一节]。
-Optimistic rollup 可以让你在无需支付 gas 费用的情况下实现即时交易!-
数据可用性挑战
我一开始的论文提出了解决数据可用性问题的三种方法:
- 始终将所有数据都发布到链上
- 利用数据可用性挑战,只在必要之时将数据发布到链上
- 利用数据可用性证明
数据可用性挑战似乎是个比较简单靠谱的解决方案。遗憾的是,如果是由被攻击方来负担挑战费用的话,他们就会蒙受损失;如果是由攻击方来负担挑战费用的话,整个系统就会每时每刻将所有数据都发布到链上。因此,在设计规范之时,optimistic rollup 的选择是始终将所有数据都发布到链上,并以高效率低成本的方式来实现。不过后来,在 optimistic rollup 上使用数据可用性证明也变得可行了。
进一步改进
我已经基于最小规范的初始版本撰写了性能改进方案,并总结如下。请注意,重点围绕的是基于 UTXO 的支付,而非一般的智能合约执行。
以太坊 1.0 上的多线程数据可用性 —— 数据验证(即,进行哈希运算)和其它预处理步骤都是纯函数,因为它们根本不涉及任何状态。因此,这些步骤都是可以并行的。按照这种方式来使用以太坊将极大减少状态的使用和增长,如果使用的是四核计算机,那么数据可用性吞吐量可以增加四倍。我的计划是通过几个 EIP 来实现这一点,第一个就是 EIP-2242:交易 Postdata 。
无需将中间状态序列化的 UTXO 链紧凑型错误性证明 —— 针对以太坊智能合约的通用型错误性证明成本很高。在 UTXO 数据模型内,每个 UTXO 最多只能创建并消耗一次,每个交易都会完整描述状态转换。区块生产者可以将元数据添加到每个输入上,声明这个输入是由一个特定的输出生成的。如果这种声明有错,则这种错误性是可以通过非交互的方式来证明的。我在另一篇文章中重新分析了 BIP-141 中提到的错误性证明机制。
使用默克尔累加器的无状态查询平行交易验证(无状态查询的客户端)—— 状态查询是非常昂贵的。无状态客户端就是通过消除对状态的使用来降低成本。但我们可以搞简单一点:只需免去状态查询即可。“见证数据(witness)” 是不会立即过期的,其有效性会持续几个区块。这些 “见证数据” 必须根据最新几个区块的状态转换进行比较,而状态转换可以在 UTXO 数据模型中通过无状态计算得出。
链上非交互型数据可用性证明——如果自始至终都将数据上链的话,会带来巨大的成本,还会导致 optimistic rollup 只能实现线性扩展(像 Plasma 这种完全位于链下的技术就不会有这个问题,而 Plasma Cash 的检查点机制也是线性的)。我们可以将共识节点进行可用性检查的能力通过一个 FFI 函数表示出来(例如,通过预编译的方式),就可以在无需进行分片的情况下获得二次方的可扩展性。这是 通过停摆实现免信任型双向桥侧链——使用错误性证明的双向桥侧链必须一直保持在线,这点对用户来说可能有些不便。虽然瞭望塔不适用于 Plasma Cash ,但它可以应用到 optimistic rollup 上。但是,我们可以做得更好:可以在侧链运行一段时间后完全停摆,然后向用户提供一个较长的窗口期(长达数月之久),以便用户提交错误性证明来决定有效的区块。这段用户必须在线的窗口期是已知且有限的。等窗口期结束之后,才允许取款。如果用户想要早一点取款的话,可以与流动性提供者进行原子交换。
构建 Optimistic Rollup 的团队
自从几个月之前第一版 Optimistic Rollup 最小化规范撰写完成以来,我欣然发现很多开发团队都开始构建 Optimistic Rollup 的实现了,其中经历了很多波折和修改。下面是一张不完全列表,列举了我们目前看到的正在构建 Optimistic Rollup 的开发团队(排名不分先后)。
Fuel —— 聚焦于稳定币支付的 UTXO 数据模型。可以用来进行任意的 ERC-20 代币或 ETH 转账,或是进行原子交换,未来还可以用来进行 “断言” 脚本撰写。该模型即将上线长期公共测试网(编者注:Fuel 现已开启公开测试网)。
Plasma Group —— 在 OVM (Optimistic Virtue Machine)环境下的通用型类 EVM 智能合约,已经在 Devcon 5 上宣布与 Uniswap 达成合作。
Arbitrum —— 使用了交互型验证游戏机制的通用型智能合约。除此之外,新的 Arbitrum rollup 设计与 optimistic rollup 大致相同。
Interstate Network —— 使用错误性证明的通用型类 EVM 智能合约。
SKALE —— 使用 BLS signature 聚合的 Optimistic rollup 。
NutBerry —— 使用了交互型验证游戏机制的通用型类 EVM 智能合约。
IDEX —— 为 IDEX 交易所构建了 “优化型 Optimistic Rollup”。
结论
随着各种各样的 optimistic rollup 实现项目上线,接下来的一年以太坊将发生巨大改变,其吞吐量将得到大幅提高,并在数据可用性方面进一步实现可持续扩容。
我在本文中没有将 optimistic rollup 与 zk rollup (这一概念最初叫作 roll_up ,由 Barry Whitehat 提出,之后由 Vitalik 改进成 zk rollup )进行对比。如果你对此感兴趣的话,可以看一下 Alex Gluchowski 写的这篇文章(编者注:中译本见文末超链接《Optimistic Rollup vs. ZK Rollup:一探究竟》)。
感谢 Mikerah Quintyne-Collins、James Prestwich、Robert Drost 和 Joseph Chow 的审校。
(完)