当我们向一种新的扩容范式转变时,回顾被抛弃的旧范式是一种很好的做法。
这篇文章旨在让读者相信,“以 rollup 为中心” 的方法并不会背离分片,并且有望构建对整个(假设性)系统更直观的理解。
出于本文的目的,我们先详细说明最简单的 Optimistic Rollup (ORU)实现。
ORU 需要具备以下几个特性:
将所有交易数据提交到链上
将状态根提交到链上
假设状态根是正确的
一些节点负责验证 ORU 的状态转换
设有链上欺诈证明执行程序,可以撤销无效状态转换
在证明 ETH 2.0 分片只是一种复杂的 ORU 系统之前,我们先来探究一下为什么原生分片系统并非安全的可扩展性解决方案。其背后原因不是特别直观。
假设一条区块链上有 16384 个验证者和 64 条分片链,每条分片链都由 128 名验证者组成的委员会负责验证。委员会成员选举是不可预见的:每个 slot 结束后,所有委员会都会解散,并随机从全体验证者中重新选出 64 个委员会,因此每个验证者都不知道其他验证者所在的委员会。假设一个区块需要获得委员会中 2/3 成员(即,不少于 86 名成员)的认可才能被添加到分片链上,这就意味着在全体验证者中包含 1/3 恶意验证者的情况下,通过随机的方式选出恶意委员会的概率是:
请注意,我们可以通过调整委员会的规模来按比例放大或缩小该参数,从而达到理想的安全级别。
由于选出恶意委员会的概率极低,以及对不作为验证者的反向激励,该分片系统理应继承其非分片协调系统(it’s non-sharded coordinator)的安全性和活性保障。但是,就像现实世界中的大多数系统那样,实现这一点并非易事。由于委员会成员是提前选好的,恶意参与者就有机会贿赂理性参与者。如果可以轻而易举地创建从验证者公钥到 IP 地址的映射,就会出现更多行贿现象。此外,在免许可型系统中,可验证投票从本质上来说无法防止行贿。综上,分片的实际安全性相比理论上来说低至少一个数量级。
虽然分片的安全性低于整体协议,但是我们依然能够确保其安全性,即,采用欺诈证明来撤销无效状态转换。但是,如果不为我们这个设想中的简单分片链引入额外的设计,那么恶意验证者完全可以扣住数据、不放出来,使得他人没有足够的数据来生成欺诈证明。接下来,我们将讲解如何实现这种攻击。
假设有一条简单分片的区块链 B,上面有 X 和 Y 两条分片链。区块链 B 在两个委员会中运行传统的拜占庭容错共识算法来帮助运行分片 X 和 Y,分别是 C~x~ 和 C~y~。B 上的每个区块都包含两个门限签名,即,C~x~ 和 C~y~ 两个委员会中 2/3 的成员对各自分片链的当前区块的状态根的见证。
假设每条分片链的每秒数据和交易处理量与非分片系统相同,那么引入分片链应该能提供大约两倍的吞吐量。在乐观情况下,事实确实如此。
现在,让我们对 B 发起数据不可用攻击。假设一个恶意实体能够迫使 C~x~ 中 2/3 + 1 的成员签署无效的状态根,并且不公开对应区块的输入数据。之后,这个无效的状态根会包含在下一个即将被添加到 B 上的区块内。这时候,并没有合理的机制可以让 B 回到有效状态,我们可以举一些机制例子看看:
C~x~ 中剩余的 1/3 - 1 位成员可以在 B 上发出数据不可用警报。遗憾的是,这不是一个可明确归属方的错误(译者注:即无法确定到底是攻击方扣住了区块,还是某些人网络不好没收到,甚至收到了也咬他人一口),因此 B 无法确定是哪一方在作恶。(如果莽然惩罚某些成员)怀有恶意的少数派有可能会借此发起零成本的 DDOS 攻击。
网络中的其它节点可以发出数据不可用警报。但他们很可能做不到,因为在错误发生期间,只有 C~x~ 的成员在密切关注这个时间。
由整个社区来发现错误,并主动介入将 B 回滚到最新的有效状态。这种处理模式显然是糟糕的。
执行类似 Plasma 的批量退出(mass exit)机制,从 X 批量退出到 B 上,会产生相关的负面影响。
就像 Plasma 一样,这里真正的问题是数据可用性。
希望上述分析能让你明白一个道理:我们首先应该将关注点放在扩展基础层的数据可用性上。否则,系统仍将遭受数据不可用攻击。
从传统上来说,提高区块链上的数据吞吐量需要就系统所支持的最低硬件/带宽要求达成社会共识 —— 得出一个可以接受的区块大小。Mustafa Al-Bassam 和 Vitalik Buterin 最近的研究提供了一种概率性机制来确保数据可用性。M. Yu 等人进一步扩展了该研究,提出了Coded Merkle Tree 累加器这一概念,给出了最优阶数的指标(order-optimal metrics)。
上述机制主要放宽了网络中参与者下载所有数据的要求。Vitalik 的提议是,让网络中的参与者随机选取区块中的小部分数据进行验证,以确保区块提议者公开了数据。风险在于,区块提议者只需要隐藏少量数据即可发动数据不可用性攻击。因此,参与者必须多次对区块进行抽样验证,才能对区块的可用性建立起足够的信心。为了减少抽样次数,Vitalik 提议采用二维 Reed-Solomon 编码来对区块数据进行编码。
在这个结构中,区块被分割成 N 个份额,然后进行编码,生成 M 个份额,只要拥有 M 中任意 N 个份额即可重新构建区块。假设 2N=M,区块提议者需要影响 1/2 的区块数据,才能成功发动数据不可用攻击。Coded Merkle Tree 采用类似的结构,只不过使用 O(b) 的解码成本和 O(1) 的哈希承诺来代替二维 Reed-Solomon 编码所提供的 O(b^1.5^) 解码成本和 O($sqrt {b}$)哈希承诺(其中 b 指的是区块的字节大小)。
关于该技术的详解,可以参见这篇文章。
ETH 2.0 的分片设计模糊了它们是信标链的 ORU 这样一个事实。如果将重点从分布式处理转向有序的数据可用性层,就变得一目了然了。
如上图所示,验证者集起到以下 4 种作用:
验证并执行信标链
对分片所提供的数据进行抽样验证
组成分片委员会
提交关于无效状态转换的欺诈证明
我们已经作了两个假设:i) 数据具有可用性,ii)区块链会从最近一个具有数据可用性的区块开始进行分叉。则要么人们可以构建欺诈证明,要么系统将缺乏数据可用性归咎于签署该区块的分片委员会,并回滚状态转换。
这时,考虑到我们之前对 ORU 的定义,我们应该能够证明分片实际上就是 rollup:
1. 所有交易数据都提交到链上
分片区块数据被集中到数据可用性层上,在一定概率上会由全网进行验证。
2. 状态根被提交到链上
分片委员会为包含在信标链区块中的分片状态根提供证明。
3. 状态根被假定为有效的
信标链在没有进行额外验证的情况下,假定分片委员会的证明是有效的
4. 一些节点负责验证 ORU 的状态转换
分片委员会验证分片的状态转换。
5. 有一个可以撤销无效状态转换的链上欺诈证明执行器
信标链支持分片状态转换欺诈证明。
既然我们已经解释了 ETH 2.0 和 ORU 系统之间不可思议的相似性,我们能够如何利用这一信息来更好地理解整个系统的设计?让我们通过 ORU 系统的角度来探索 ETH 2.0 的一些设计决定:
在当前设计中,系统的数据吞吐量与分片机制紧密耦合。
这里可以采用的一种方法是,将数据可用性检查视为协议中的头等公民。这样可以对数据层进行独立优化,执行层也可以更细的粒度控制(参与协议的)硬件要求。
例如,ETH 2.0 可以提供 64 个数据中心和一个在信标链上的 ORU 合约,以此代替分片链。ORU 合约可以让 rollup 决定领导者选举机制,它们想要将数据发送到多少个数据中心上,以及它们是否想与其它 rollup 绑定(例如,如果一个 rollup 发生回滚,与之绑定的 rollup 也会发生回滚)。使用的数据中心越多,验证 rollup 所需的硬件要求就越高。
严格来说,上述系统是当前分片设计的超集。除了由协议定义的 64 个分片之外,还会有其它具有自己特征的 rollup 构建在安全数据层上,并且独立于协议分片。
在简单的 ORU 中,当选的领导者有权提交无效状态转换。虽然这不会影响系统的安全性,因为无效状态转换是可以通过欺诈证明撤销的,但这确实会破坏 rollup 的进程。单独来看,这种破坏对作恶者来说通常是不划算的。然而,在 ETH 2.0 中,跨分片通信让这个问题变得特别棘手。处于 slot N 的分片预期自己可以获得其它分片在 slot N-1 时的状态。假设分片 S~i~ 提交了一个无效的状态转换,除了单方面发起回滚之外没有其它合理的方法来撤销该状态对分片 S~j~(0≤j≤64;i≠j)的负面影响。
为避免灾难性事件,必须有适当的机制来防止这类回滚。其中最明显的两个机制是分片委员会和托管比特检查(custody bit check)。正如 “从数学角度证明分片的安全性” 一节中所述,即使考虑到各种攻击向量,贿赂分片委员会中 2/3 以上成员的概率也很低。托管比特可以确保诚实的验证者不会因为懒惰而被骗签署无效的状态转换。
如果我们认为这些机制的目的是防止无效状态转换,而非维护系统安全,就能选择既有实用价值,又能实现相同效果的参数。例如,将分片委员会的规模减少到 64 人,随机组成恶意委员会的概率依然低至 3.1×10-8。但是从网络和签名聚合的角度来看,这样能够极大减轻负担。
本文最初撰写于斯坦福区块链大会 2020(SBC20)期间。那时,我开始充分领会到 ETH 2.0 和 ORU 之间的相似性。在看过 Vitalik 的文章后,我决定发布这篇文章,来表示对以太坊将来采用以 rollup 为中心的扩容方案的支持。但是,如本文所述,“以 rollup 为中心” 的扩容方案没有让我们偏离方向,而是一个超集。我们在分片设计中遇到的问题与我们在整合跨 rollup 通信时遇到的问题是同构的。这就意味着,已经开展的大部分工作都可以继续进行,不会被中断。
以 rollup 为中心的路线图会降低分片执行所必需的协议复杂性。这使得我们能够不断迭代类似分片的复杂的 rollup 机制。这样可以让更多开发者为不同的 rollup 格式做贡献,让现有核心开发者和研究者可以专注于构建一个健壮的数据可用性层。
可以说,通往功能完善的 ETH 2.0 的道路从未如此清晰。
如果你对文中所述内容感兴趣,想要进行深入讨论,请在推特上联系我 @lightclients。我也在将帮助各种有影响力的项目寻找优秀的研究者和工程师。如果你需要帮助,请私信我。