跳转到主要内容
Change page

乐观 Rollup

乐观 Rollup 是旨在扩展以太坊基础层吞吐量的二层网络 (l2) 协议。它们通过在链下处理交易来减少主以太坊链上的计算,从而显著提高处理速度。与侧链等其他扩容解决方案不同,乐观 Rollup 通过在链上发布交易结果从主网获得安全性;或者与等离子体链不同,后者也使用欺诈证明在以太坊上验证交易,但将交易数据存储在其他地方。

由于计算是使用以太坊时缓慢且昂贵的部分,乐观 Rollup 可以提供高达 10-100 倍的扩容性提升。乐观 Rollup 还将交易作为 calldata 或在斑点中写入以太坊,从而降低用户的 Gas 成本。

先决条件

你应该已经阅读并理解了我们关于以太坊扩容二层网络 (l2)的页面。

什么是乐观 Rollup?

乐观 Rollup 是一种以太坊扩容方法,涉及将计算和状态存储转移到链下。乐观 Rollup 在以太坊之外执行交易,但将交易数据作为 calldata 或在斑点中发布到主网。

乐观 Rollup 运营者在提交给以太坊之前,将多个链下交易捆绑成大批量。这种方法能够将固定成本分摊到每个批次中的多个交易上,从而降低最终用户的费用。乐观 Rollup 还使用压缩技术来减少在以太坊上发布的数据量。

乐观 Rollup 被认为是“乐观的”,因为它们假设链下交易是有效的,并且不为发布在链上的交易批次发布有效性证明。这使得乐观 Rollup 区别于为链下交易发布密码学零知识 Rollup

相反,乐观 Rollup 依赖于欺诈证明方案来检测交易计算不正确的情况。在以太坊上提交 Rollup 批次后,会有一个时间窗口(称为挑战期),在此期间任何人都可以通过计算来挑战 Rollup 交易的结果。

如果欺诈证明成功,Rollup 协议将重新执行交易并相应地更新 Rollup 的状态。成功的欺诈证明的另一个影响是,负责将错误执行的交易包含在区块中的定序器将受到罚没。

如果在挑战期结束后,Rollup 批次仍未受到挑战(即所有交易均正确执行),则该批次被视为有效并在以太坊上被接受。其他人可以继续在未确认的 Rollup 区块上进行构建,但需要注意:如果基于先前发布的错误执行的交易,交易结果将被撤销。

乐观 Rollup 如何与以太坊交互?

乐观 Rollup 是构建在以太坊之上运行的链下扩容解决方案。每个乐观 Rollup 都由部署在以太坊网络上的一组智能合约管理。乐观 Rollup 在以太坊主链之外处理交易,但将链下交易(分批)发布到链上 Rollup 合约。与以太坊区块链一样,此交易记录是不可变的,并构成了“乐观 Rollup 链”。

乐观 Rollup 的架构包含以下部分:

链上合约:乐观 Rollup 的运行由在以太坊上运行的智能合约控制。这包括存储 Rollup 区块、监控 Rollup 上的状态更新以及跟踪用户存款的合约。从这个意义上说,以太坊充当了乐观 Rollup 的基础层或“一层网络 (l1)”。

链下虚拟机 (VM):尽管管理乐观 Rollup 协议的合约在以太坊上运行,但 Rollup 协议在独立于以太坊虚拟机的另一个虚拟机上执行计算和状态存储。链下虚拟机是应用程序驻留和状态更改执行的地方;它充当乐观 Rollup 的上层或“二层网络 (l2)”。

由于乐观 Rollup 旨在运行为 EVM 编写或编译的程序,因此链下虚拟机结合了许多 EVM 设计规范。此外,在链上计算的欺诈证明允许以太坊网络强制执行在链下虚拟机中计算的状态更改的有效性。

乐观 Rollup 被描述为“混合扩容解决方案”,因为虽然它们作为独立的协议存在,但其安全属性源自以太坊。除其他事项外,以太坊保证了 Rollup 链下计算的正确性以及计算背后数据的可用性。这使得乐观 Rollup 比不依赖以太坊提供安全性的纯链下扩容协议(例如侧链)更安全。

乐观 Rollup 依赖以太坊主协议来实现以下功能:

数据可用性

如前所述,乐观 Rollup 将交易数据作为 calldata斑点发布到以太坊。由于 Rollup 链的执行基于提交的交易,任何人都可以使用这些锚定在以太坊基础层上的信息来执行 Rollup 的状态并验证状态转换的正确性。

数据可用性至关重要,因为如果无法访问状态数据,挑战者就无法构建欺诈证明来对无效的 Rollup 操作提出异议。由于以太坊提供数据可用性,Rollup 运营者逃避恶意行为(例如提交无效区块)的风险得以降低。

抗审查性

乐观 Rollup 还依赖以太坊来实现抗审查性。在乐观 Rollup 中,一个中心化实体(运营者)负责处理交易并将 Rollup 区块提交给以太坊。这带来了一些影响:

  • Rollup 运营者可以通过完全离线,或者拒绝生成包含某些交易的区块来审查用户。

  • Rollup 运营者可以通过隐瞒所有权默克尔证明所需的状态数据,来阻止用户提取存入 Rollup 合约的资金。隐瞒状态数据还可以向用户隐藏 Rollup 的状态,并阻止他们与 Rollup 交互。

乐观 Rollup 通过强制运营者在以太坊上发布与状态更新相关的数据来解决这个问题。在链上发布 Rollup 数据具有以下好处:

  • 如果乐观 Rollup 运营者离线或停止生成交易批次,另一个节点可以使用可用数据重现 Rollup 的最后状态并继续生成区块。

  • 用户可以使用交易数据创建默克尔证明来证明资金的所有权,并从 Rollup 中提取其资产。

  • 用户也可以在 L1 上提交交易,而不是提交给定序器,在这种情况下,定序器必须在一定时间限制内包含该交易,才能继续生成有效区块。

结算

在乐观 Rollup 的背景下,以太坊扮演的另一个角色是结算层。结算层锚定整个区块链生态系统,建立安全性,并在另一条链(在本例中为乐观 Rollup)上发生需要仲裁的争议时提供客观的最终性。

以太坊主网为乐观 Rollup 提供了一个验证欺诈证明和解决争议的中心。此外,在 Rollup 上进行的交易只有在 Rollup 区块被以太坊接受_之后_才具有最终性。一旦 Rollup 交易提交到以太坊的基础层,就无法回滚(除非发生极不可能的链重组情况)。

乐观 Rollup 是如何工作的?

交易执行与聚合

用户将交易提交给“运营者”,即负责在乐观 Rollup 上处理交易的节点。运营者也称为“验证者”或“聚合器”,负责聚合交易、压缩底层数据并将区块发布到以太坊上。

尽管任何人都可以成为验证者,但乐观 Rollup 验证者必须在生成区块之前提供保证金,这非常类似于权益证明 (PoS) 系统。如果验证者发布无效区块或在旧但无效的区块上进行构建(即使他们的区块是有效的),该保证金可能会被罚没。通过这种方式,乐观 Rollup 利用密码经济学激励机制来确保验证者诚实地行事。

乐观 Rollup 链上的其他验证者需要使用他们自己的 Rollup 状态副本执行提交的交易。如果验证者的最终状态与运营者提议的状态不同,他们可以发起挑战并计算欺诈证明。

一些乐观 Rollup 可能会放弃无需许可的验证者系统,而使用单个“定序器”来执行链。与验证者一样,定序器处理交易、生成 Rollup 区块,并将 Rollup 交易提交到 L1 链(以太坊)。

定序器不同于常规的 Rollup 运营者,因为它们对交易的排序有更大的控制权。此外,定序器具有对 Rollup 链的优先访问权,并且是唯一被授权向链上合约提交交易的实体。来自非定序器节点或普通用户的交易只是在一个单独的收件箱中排队,直到定序器将它们包含在一个新批次中。

将 Rollup 区块提交给以太坊

如前所述,乐观 Rollup 的运营者将链下交易捆绑成一个批次,并将其发送到以太坊进行公证。此过程涉及压缩与交易相关的数据,并将其作为 calldata 或在斑点中发布到以太坊上。

calldata 是智能合约中一个不可修改、非持久化的区域,其行为主要类似于内存。虽然 calldata 作为区块链历史日志 (opens in a new tab)的一部分保留在链上,但它并不作为以太坊状态的一部分进行存储。因为 calldata 不触及以太坊状态的任何部分,所以它在链上存储数据比状态更便宜。

calldata 关键字在 Solidity 中也用于在执行时将参数传递给智能合约函数。calldata 标识在交易期间被调用的函数,并以任意字节序列的形式保存该函数的输入。

在乐观 Rollup 的背景下,calldata 用于将压缩的交易数据发送到链上合约。Rollup 运营者通过调用 Rollup 合约中所需的函数并将压缩数据作为函数参数传递来添加新批次。使用 calldata 可以降低用户费用,因为 Rollup 产生的大部分成本来自在链上存储数据。

这里有一个 Rollup 批次提交的示例 (opens in a new tab),以展示这个概念是如何工作的。定序器调用了 appendSequencerBatch() 方法,并使用 calldata 将压缩的交易数据作为输入传递。

一些 Rollup 现在使用斑点将成批的交易发布到以太坊。

斑点是不可修改且非持久化的(就像 calldata 一样),但会在大约 18 天后从历史记录中修剪掉。有关斑点的更多信息,请参阅丹克分片

状态承诺

在任何时间点,乐观 Rollup 的状态(账户、余额、合约代码等)都被组织成一个称为“状态树”的默克尔树。引用 Rollup 最新状态的这棵默克尔树的根(状态根)被哈希并存储在 Rollup 合约中。链上的每次状态转换都会产生一个新的 Rollup 状态,运营者通过计算新的状态根来对其进行承诺。

运营者在发布批次时需要同时提交旧状态根和新状态根。如果旧状态根与链上合约中现有的状态根匹配,则后者将被丢弃并替换为新状态根。

Rollup 运营者还需要为交易批次本身承诺一个默克尔根。这允许任何人通过提供默克尔证明来证明该批次中(在 L1 上)包含某笔交易。

状态承诺,尤其是状态根,对于证明乐观 Rollup 中状态更改的正确性是必要的。Rollup 合约在运营者发布新状态根后立即接受它们,但稍后可以删除无效的状态根以将 Rollup 恢复到其正确状态。

欺诈证明

如前所述,乐观 Rollup 允许任何人发布区块而无需提供有效性证明。然而,为了确保链保持安全,乐观 Rollup 指定了一个时间窗口,在此期间任何人都可以对状态转换提出异议。因此,Rollup 区块被称为“断言”,因为任何人都可以对其有效性提出异议。

如果有人对断言提出异议,那么 Rollup 协议将启动欺诈证明计算。每种类型的欺诈证明都是交互式的——必须有人发布断言,然后另一个人才能对其提出挑战。区别在于计算欺诈证明需要多少轮交互。

单轮交互式证明方案在 L1 上重放有争议的交易以检测无效断言。Rollup 协议使用验证者合约在 L1(以太坊)上模拟重新执行有争议的交易,计算出的状态根决定谁赢得挑战。如果挑战者关于 Rollup 正确状态的主张是正确的,运营者将受到罚没其保证金的惩罚。

然而,在 L1 上重新执行交易以检测欺诈需要发布单个交易的状态承诺,并增加了 Rollup 必须在链上发布的数据。重放交易还会产生大量的 Gas 成本。由于这些原因,乐观 Rollup 正在转向多轮交互式证明,它以更高的效率实现了相同的目标(即检测无效的 Rollup 操作)。

多轮交互式证明

多轮交互式证明涉及断言者和挑战者之间由 L1 验证者合约监督的来回协议,该合约最终决定说谎的一方。在 L2 节点挑战断言后,断言者需要将有争议的断言分成相等的两半。在这种情况下,每个单独的断言将包含与另一个断言一样多的计算步骤。

然后,挑战者将选择它想要挑战的断言。划分过程(称为“二分协议”)将继续进行,直到双方对关于_单个_执行步骤的断言产生争议。此时,L1 合约将通过评估指令(及其结果)来解决争议,以抓住欺诈方。

断言者需要提供“单步证明”来验证有争议的单步计算的有效性。如果断言者未能提供单步证明,或者 L1 验证者认为该证明无效,他们将输掉挑战。

关于这种类型的欺诈证明的一些注意事项:

  1. 多轮交互式欺诈证明被认为是高效的,因为它最大限度地减少了 L1 链在争议仲裁中必须做的工作。L1 链不需要重放整个交易,只需要重新执行 Rollup 执行中的一个步骤。

  2. 二分协议减少了在链上发布的数据量(无需为每笔交易发布状态承诺)。此外,乐观 Rollup 交易不受以太坊 gas 上限的约束。相反,重新执行交易的乐观 Rollup 必须确保 L2 交易具有较低的 gas 上限,以模拟其在单个以太坊交易中的执行。

  3. 恶意断言者的部分保证金将奖励给挑战者,而另一部分将被销毁。销毁可以防止验证者之间串通;如果两个验证者串通发起虚假挑战,他们仍然会丧失整个质押的很大一部分。

  4. 多轮交互式证明要求双方(断言者和挑战者)在指定的时间窗口内采取行动。未能在截止日期到期前采取行动将导致违约方丧失挑战资格。

为什么欺诈证明对乐观 Rollup 很重要

欺诈证明很重要,因为它们促进了乐观 Rollup 中的_无须信任的最终性_。无须信任的最终性是乐观 Rollup 的一个特性,它保证了交易——只要它是有效的——最终将被确认。

恶意节点可以尝试通过发起虚假挑战来延迟有效 Rollup 区块的确认。然而,欺诈证明最终将证明 Rollup 区块的有效性并使其得到确认。

这也与乐观 Rollup 的另一个安全属性有关:链的有效性依赖于_一个_诚实节点的存在。诚实节点可以通过发布有效断言或对无效断言提出异议来正确地推进链。无论哪种情况,与诚实节点发生争议的恶意节点都将在欺诈证明过程中失去其质押。

L1/L2 互操作性

乐观 Rollup 专为与以太坊主网的互操作性而设计,允许用户在 L1 和 L2 之间传递消息和任意数据。它们还与 EVM 兼容,因此你可以将现有的去中心化应用 (dapp) 移植到乐观 Rollup,或使用以太坊开发工具创建新的 dapp。

1. 资产转移

进入 Rollup

要使用乐观 Rollup,用户将 ETH、ERC-20 代币和其他接受的资产存入 L1 上 Rollup 的跨链桥合约中。跨链桥合约将把交易中继到 L2,在 L2 上铸造等量的资产并发送到用户在乐观 Rollup 上选择的地址。

用户生成的交易(如 L1 > L2 存款)通常会排队,直到定序器将它们重新提交给 Rollup 合约。然而,为了保持抗审查性,如果交易被延迟超过允许的最长时间,乐观 Rollup 允许用户直接向链上 Rollup 合约提交交易。

一些乐观 Rollup 采用更直接的方法来防止定序器审查用户。在这里,一个区块由自上一个区块以来提交给 L1 合约的所有交易(例如存款)以及在 Rollup 链上处理的交易来定义。如果定序器忽略了 L1 交易,它将发布(可证明的)错误状态根;因此,一旦在 L1 上发布,定序器就无法延迟用户生成的消息。

退出 Rollup

由于欺诈证明方案,从乐观 Rollup 提款到以太坊更加困难。如果用户发起 L2 > L1 交易以提取托管在 L1 上的资金,他们必须等到挑战期(大约持续七天)结束。尽管如此,提款过程本身还是相当简单的。

在 L2 Rollup 上发起提款请求后,该交易将包含在下一个批次中,同时用户在 Rollup 上的资产将被销毁。一旦该批次发布在以太坊上,用户就可以计算默克尔证明,验证其退出交易是否包含在该区块中。然后就是等待延迟期结束,在 L1 上最终确认交易并将资金提取到主网。

为了避免在将资金提取到以太坊之前等待一周,乐观 Rollup 用户可以雇用流动性提供者 (LP)。流动性提供者承担待处理的 L2 提款的所有权,并在 L1 上向用户付款(以换取费用)。

流动性提供者可以在释放资金之前(通过自己执行链)检查用户提款请求的有效性。这样他们就可以确信交易最终会被确认(即无须信任的最终性)。

2. EVM 兼容性

对于开发者来说,乐观 Rollup 的优势在于它们与以太坊虚拟机 (EVM) 的兼容性——或者更好的是,等效性。兼容 EVM 的 Rollup 符合以太坊黄皮书 (opens in a new tab)中的规范,并在字节码级别支持 EVM。

乐观 Rollup 中的 EVM 兼容性具有以下好处:

i. 开发者可以将以太坊上现有的智能合约迁移到乐观 Rollup 链,而无需大量修改代码库。这可以节省开发团队在 L2 上部署以太坊智能合约的时间。

ii. 使用乐观 Rollup 的开发者和项目团队可以利用以太坊的基础设施。这包括编程语言、代码库、测试工具、客户端软件、部署基础设施等。

使用现有工具很重要,因为这些工具多年来经过了广泛的审计、调试和改进。这也消除了以太坊开发者学习如何使用全新开发堆栈进行构建的需要。

3. 跨链合约调用

用户(外部拥有账户)通过向 Rollup 合约提交交易或让定序器或验证者代为提交来与 L2 合约交互。乐观 Rollup 还允许以太坊上的合约账户使用跨链桥合约与 L2 合约交互,以在 L1 和 L2 之间中继消息和传递数据。这意味着你可以对以太坊主网上的 L1 合约进行编程,以调用属于 L2 乐观 Rollup 上合约的函数。

跨链合约调用是异步发生的——这意味着调用首先被发起,然后在稍后的时间执行。这与以太坊上两个合约之间的调用不同,后者会立即产生结果。

跨链合约调用的一个例子是前面描述的代币存款。L1 上的合约托管用户的代币,并向配对的 L2 合约发送消息,以在 Rollup 上铸造等量的代币。

由于跨链消息调用会导致合约执行,因此通常要求发送者支付计算的 gas 费。建议设置较高的 gas 上限,以防止交易在目标链上失败。代币跨链场景就是一个很好的例子;如果交易的 L1 端(存入代币)成功,但 L2 端(铸造新代币)由于 gas 不足而失败,则存款将变得无法恢复。

最后,我们应该注意,合约之间的 L2 > L1 消息调用需要考虑延迟(L1 > L2 调用通常在几分钟后执行)。这是因为从乐观 Rollup 发送到主网的消息在挑战窗口到期之前无法执行。

乐观 Rollup 费用是如何运作的?

乐观 Rollup 使用类似于以太坊的 gas 费方案来表示用户每笔交易支付的金额。乐观 Rollup 收取的费用取决于以下组成部分:

  1. 状态写入:乐观 Rollup 将交易数据和区块头(由前一个区块头哈希、状态根、批次根组成)作为 blob 或“二进制大对象”发布到以太坊。EIP-4844 (opens in a new tab) 引入了一种在链上包含数据的经济高效的解决方案。blob 是一个新的交易字段,允许 Rollup 将压缩的状态转换数据发布到以太坊 L1。与永久保留在链上的 calldata 不同,斑点是短暂的,可以在 4096 个时段 (opens in a new tab)(约 18 天)后从客户端中修剪掉。通过使用斑点发布成批的压缩交易,乐观 Rollup 可以显著降低将交易写入 L1 的成本。

  2. 使用的斑点 Gas:携带斑点的交易采用类似于 EIP-1559 (opens in a new tab) 引入的动态费用机制。类型 3 交易的 gas 费考虑了斑点的基础费用,该费用由网络根据斑点空间需求和正在发送的交易的斑点空间使用情况来决定。

  3. L2 运营者费用:这是支付给 Rollup 节点作为处理交易产生的计算成本补偿的金额,非常类似于以太坊上的 gas 费。Rollup 节点收取较低的交易费用,因为 L2 具有更高的处理能力,并且不会面临迫使以太坊上的验证者优先处理费用较高的交易的网络拥堵。

乐观 Rollup 应用了几种机制来降低用户费用,包括批量处理交易和压缩 calldata 以降低数据发布成本。你可以查看 L2 费用追踪器 (opens in a new tab),实时了解使用基于以太坊的乐观 Rollup 的成本。

乐观 Rollup 如何扩展以太坊?

如前所述,乐观 Rollup 在以太坊上发布压缩的交易数据以保证数据可用性。压缩链上发布数据的能力对于使用乐观 Rollup 扩展以太坊的吞吐量至关重要。

以太坊主链对区块可以容纳的数据量设置了限制,以 gas 单位计价(平均区块大小为 1500 万 gas)。虽然这限制了每笔交易可以使用的 gas 量,但这也意味着我们可以通过减少与交易相关的数据来增加每个区块处理的交易量——直接提高扩容性。

乐观 Rollup 使用多种技术来实现交易数据压缩并提高 TPS 速率。例如,这篇文章 (opens in a new tab)比较了基本用户交易(发送以太币)在主网上生成的数据与同一交易在 Rollup 上生成的数据量:

参数以太坊 (L1)Rollup (L2)
随机数~30
Gas 价格~80-0.5
Gas30-0.5
接收方214
金额9~3
签名~68 (2 + 33 + 33)~0.5
发送方0(从签名中恢复)4
总计~112 字节~12 字节

对这些数字进行一些粗略的计算有助于展示乐观 Rollup 带来的扩容性提升:

  1. 每个区块的目标大小为 1500 万 gas,验证一个字节的数据需要 16 gas。将平均区块大小除以 16 gas (15,000,000/16) 表明平均区块可以容纳 937,500 字节的数据
  2. 如果基本的 Rollup 交易使用 12 字节,那么平均以太坊区块可以处理 78,125 笔 Rollup 交易 (937,500/12) 或 39 个 Rollup 批次(如果每个批次平均包含 2,000 笔交易)。
  3. 如果以太坊上每 15 秒生成一个新区块,那么 Rollup 的处理速度将达到大约每秒 5,208 笔交易。这是通过将以太坊区块可以容纳的基本 Rollup 交易数量 (78,125) 除以平均出块时间(15 秒)得出的。

这是一个相当乐观的估计,因为乐观 Rollup 交易不可能占据以太坊上的整个区块。然而,它可以粗略地说明乐观 Rollup 能为以太坊用户带来多少扩容性收益(当前的实现提供高达 2,000 TPS)。

预计在以太坊上引入数据分片将提高乐观 Rollup 的扩容性。由于 Rollup 交易必须与其他非 Rollup 交易共享区块空间,因此它们的处理能力受到以太坊主链上数据吞吐量的限制。丹克分片将增加 L2 链每个区块可用于发布数据的空间,使用更便宜、非永久的“斑点”存储,而不是昂贵、永久的 CALLDATA

乐观 Rollup 的优缺点

优点缺点
在不牺牲安全性或去信任化的情况下,大幅提高扩容性。由于潜在的欺诈挑战,交易最终性存在延迟。
交易数据存储在一层网络 (l1) 链上,提高了透明度、安全性、抗审查性和去中心化。中心化的 Rollup 运营者(定序器)可以影响交易排序。
欺诈证明保证了无须信任的最终性,并允许诚实的少数群体保护链的安全。如果没有诚实节点,恶意运营者可以通过发布无效区块和状态承诺来窃取资金。
计算欺诈证明对常规 L2 节点开放,不像有效性证明(用于零知识 Rollup)需要特殊硬件。安全模型依赖于至少一个诚实节点执行 Rollup 交易并提交欺诈证明以挑战无效的状态转换。
Rollup 受益于“无须信任的活跃度”(任何人都可以通过执行交易和发布断言来强制推进链)。用户必须等待一周的挑战期到期,才能将资金提取回以太坊。
乐观 Rollup 依赖于精心设计的密码经济学激励机制来提高链上的安全性。Rollup 必须在链上发布所有交易数据,这可能会增加成本。
与 EVM 和 Solidity 的兼容性允许开发者将以太坊原生智能合约移植到 Rollup,或使用现有工具创建新的 dapp。

乐观 Rollup 的直观解释

更喜欢直观的学习方式?观看 Finematics 解释乐观 Rollup:

Rollups: the ultimate Ethereum scaling strategy?

A deep dive into rollups as Ethereum's primary scaling strategy.

带文字记录观看 

教程:以太坊上的乐观 Rollup 和跨链桥