乐观卷叠
上次修改时间: @cuijia(opens in a new tab), 2024年10月29日
乐观卷叠是二层网络 (L2) 协议,该协议旨在扩展以太坊基础层的吞吐量。 它们通过在链下处理交易来减少以太坊主链上的计算量,从而显著提高处理速度。 与其他扩容解决方案(例如侧链)不同,乐观卷叠从主网(通过在链上发布交易结果)或从 Plasma 链(该链还使用欺诈证明验证以太坊上的交易,但将交易数据存储在其他地方)获取安全性。
由于计算是使用以太坊时缓慢而昂贵的部分,因此乐观卷叠可以提供高达 10-100 倍的可扩展性改进。 乐观卷叠还会将交易以 calldata
或 blob 的形式写入以太坊,从而降低用户的燃料成本。
前提条件
什么是乐观卷叠?
乐观卷叠是一种扩容以太坊的方法,涉及将计算和状态存储移至链下。 乐观卷叠在以太坊之外执行交易,但将交易数据以 calldata
或二进制大对象的形式发布到主网。
乐观卷叠运营商将多个链下交易大批量捆绑在一起,然后再提交到以太坊。 这种方法可以将固定成本分散到每批中的多笔交易中,从而降低最终用户的费用。 乐观卷叠还使用压缩技术来减少发布在以太坊上的数据量。
乐观卷叠被认为是“乐观的”,因为它们假设链下交易是有效的,并且不发布推送到链上的交易批次的有效性证明。 这一点将乐观卷叠与零知识卷叠区分开来,后者会发布链下交易的加密。
相反,乐观卷叠依赖于欺诈证明方案来检测交易计算不正确的情况。 在以太坊上提交卷叠批次后,有一个时间窗口(称为挑战期),在此期间任何人都可以通过计算来挑战卷叠交易的结果。
如果欺诈证明成功,则卷叠协议重新执行交易并相应地更新卷叠的状态。 成功的欺诈证明的另一个影响是,负责将错误执行的交易纳入区块的排序者会受到惩罚。
如果在挑战期过后卷叠批次仍未受到挑战(即所有交易均已正确执行),则将其视为有效并在以太坊上接受。 其他人可以继续扩建未经确认的卷叠区块,但需要注意:交易结果如果基于先前发布的错误执行交易,则将被逆转。
乐观卷叠如何与以太坊交互?
乐观卷叠是为了在以太坊上运行而构建的链下扩容解决方案。 每个乐观卷叠都由部署在以太坊网络上的一组智能合约管理。 乐观卷叠在以太坊主链之外处理交易,但将链下交易(批量)发布到链上的卷叠合约。 和以太坊区块链一样,此交易记录是不可变的,并形成了“乐观卷叠链”。
乐观卷叠的架构包括以下部分:
链上合约:乐观卷叠的操作由在以太坊上运行的智能合约控制。 这包括存储卷叠区块、监控卷叠状态更新以及跟踪用户存款的合约。 在这个意义上,以太坊充当乐观卷叠的基础层或“一层网络”。
链下虚拟机 (VM):虽然管理乐观卷叠协议的合约在以太坊上运行,但卷叠协议在以太坊虚拟机之外的另一个虚拟机上执行计算和状态存储。 应用程序在链下虚拟机上驻留并且状态更改在其上执行;链下虚拟机作为乐观卷叠的上层或“二层网络”。
由于乐观卷叠旨在运行为以太坊虚拟机编写或编译的程序,因此链下虚拟机包含许多以太坊虚拟机设计规范。 此外,链上计算的欺诈证明允许以太坊网络强制执行在链下虚拟机中计算的状态更改的有效性。
乐观卷叠被描述为“混合扩容解决方案”,因为虽然它们作为单独的协议存在,但它们的安全属性源自以太坊。 除了其他方面,以太坊还能保证卷叠的链下计算的正确性以及计算所依据的数据的可用性。 这使得乐观卷叠比不依赖以太坊获取安全性的纯链下扩容协议(例如,侧链)更安全。
乐观卷叠在以下方面依赖于以太坊的主要协议:
数据可用性
如前所述,乐观卷叠将交易数据以 calldata
或二进制大对象的形式发布到以太坊。 由于卷叠链的执行基于提交的交易,任何人都可以使用此信息(锚定在以太坊的基础层)来执行卷叠的状态并验证状态转换的正确性。
数据可用性至关重要,因为如果不能访问状态数据,挑战者就不能构造欺诈证明来质疑无效的卷叠操作。 有了以太坊提供的数据可用性,就降低了卷叠运营商逃脱恶意行为(例如,提交无效区块)的风险。
抗审查
乐观卷叠也依赖以太坊来抵抗审查。 在乐观卷叠中,中心化实体(运营商)负责处理交易并将卷叠区块提交给以太坊。 这其中有一些含义:
卷叠运营商可以通过完全离线或拒绝生成包含某些交易的区块来审查用户。
卷叠运营商可以通过保留 Merkle 所有权证明所需的状态数据来阻止用户提取存放在卷叠合约中的资金。 保留状态数据还可以向用户隐藏卷叠的状态,并阻止他们与卷叠进行交互。
乐观卷叠通过强制运营商在以太坊上发布与状态更新相关的数据来解决这个问题。 在链上发布卷叠数据有以下好处:
如果乐观卷叠运营商下线或停止生成交易批次,另一个节点可以使用可用数据来重现卷叠的最后状态并继续区块生产。
用户可以使用交易数据来创建 Merkle 证明来证明资金的所有权,并从卷叠中提取他们的资产。
用户也可以在 L1 提交他们的交易,而不是提交给排序者,在这种情况下,排序者必须在一定的时间限制内纳入交易,才能继续生产有效的区块。
结算
以太坊在乐观卷叠中扮演的另一个角色是结算层。 结算层锚定整个区块链生态系统,建立安全性,并在需要仲裁的另一条链(在这种情况下为乐观卷叠)上发生争议时提供客观的确定性。
以太坊主网为乐观卷叠提供了一个中心,以验证欺诈证明并解决争议。 此外,在卷叠上进行的交易只有当卷叠区块在以太坊上被接受之后才是最终的。 一旦卷叠交易被提交到以太坊的基础层,它就不能回滚(除非在极不可能的情况下发生链重组)。
乐观卷叠如何工作?
交易执行和聚合
用户向“运营商”提交交易,“运营商”则是乐观卷叠上负责处理交易的节点。 运营商也称为“验证者”或“聚合者”,负责聚合交易、压缩底层数据,并在以太坊上发布区块。
尽管任何人都可以成为验证者,但乐观卷叠验证者就像权益证明系统一样,必须在生成区块之前提供保证金。 如果验证者发布了无效的区块或扩建了原有但无效的区块(即使他们的区块是有效的),此保证金可能被罚没。 通过这种方式,乐观卷叠利用加密经济激励措施来确保验证者诚实行事。
乐观卷叠链上的其他验证者应该使用他们的卷叠状态副本来执行提交的交易。 如果验证者的最终状态与运营商提议的状态不同,他们可以发起挑战并计算欺诈证明。
一些乐观卷叠可能会放弃无需许可的验证者系统并使用单个“排序者”来执行链。 与验证者一样,排序者会处理交易,生成卷叠区块,并将卷叠交易提交到 L1 链(以太坊)。
排序者与常规卷叠运营商不同,因为他们对交易的排序有更大的控制力。 此外,排序者具有卷叠链的优先访问权,并且是唯一被授权向链上合约提交交易的实体。 来自非排序者节点或普通用户的交易只是在一个单独的收件箱中排队,直到排序者将它们纳入一个新批次中。
提交卷叠区块到以太坊
如前所述,乐观卷叠的运营商将链下交易捆绑成一个批次,并将其发送到以太坊进行公证。 此过程涉及压缩与交易相关的数据并将其以 calldata
或二进制大对象的形式发布在以太坊上。
calldata
是智能合约中不可修改、非持久的区域,其行为与内存非常相似。 而 calldata
作为区块链的历史日志(opens in a new tab)部分,不会存储为以太坊状态的一部分。 由于 calldata
不触及以太坊状态的任何部分,因此它比链上存储数据的状态更便宜。
calldata
关键字也在 Solidity 中用于在执行时将参数传递给智能合约函数。 calldata
识别在交易期间被调用的函数,并以任意字节序列的形式保存函数的输入。
在乐观卷叠的上下文中,calldata
用于将压缩的交易数据发送到链上合约。 卷叠运营商通过调用卷叠合约中所需的函数并将压缩数据作为函数参数传递来添加新批次。 使用 calldata
可以降低用户费用,因为卷叠产生的大部分成本来自链上存储数据。
以下是一个卷叠批量提交的示例(opens in a new tab),以展示此概念的工作原理。 排序者调用 appendSequencerBatch()
方法并使用 calldata
将压缩的交易数据作为输入传递。
一些卷叠现在使用二进制大对象将批量交易发布到以太坊。
二进制大对象是不可修改且非持久化的(就像 calldata
一样),但会在大约 18 天后从历史记录中删除。 有关二进制大对象的更多信息,请参阅 Danksharding。
状态承诺
在任何时间点,乐观卷叠状态(帐户、余额、合约代码等)都被组织为 Merkle 树,也称为“状态树”。 此 Merkle 树的根(状态根)引用卷叠的最新状态,经过哈希处理并存储在卷叠合约中。 链上的每个状态转换都会产生一个新的卷叠状态,运营商通过计算新的状态根来提交该状态。
运营商在发布批次时需要同时提交旧状态根和新状态根。 如果旧状态根与链上合约中的现有状态根匹配,则后者被丢弃并替换为新状态根。
卷叠运营商还需要为交易批次本身提交 Merkle 根。 这允许任何人通过提供 Merkle 证明来证明交易包含在批次中(在 L1 上)。
状态承诺,尤其是状态根,对于证明乐观卷叠中的状态变化的正确性是必要的。 卷叠合约在发布后立即接受来自运营商的新状态根,但稍后可以删除无效的状态根以将卷叠恢复到正确的状态。
欺诈证明
如前所述,乐观卷叠允许任何人在不提供有效性证明的情况下发布区块。 然而,为了确保链保持安全,乐观卷叠指定了一个时间窗口,在此期间任何人都可以对状态转换提出异议。 因此,卷叠块被称为“断言”,因为任何人都可以挑战它们的有效性。
如果有人对断言提出异议,则卷叠协议将启动欺诈证明计算。 每种类型的欺诈证明都是交互式的 — 必须有人发布断言,然后其他人才能对其提出挑战。 不同之处在于计算欺诈证明需要多少轮交互。
单轮交互式证明方案在 L1 重放有争议的交易以检测无效断言。 卷叠协议使用验证者合约模拟在 L1(以太坊)上重新执行有争议的交易,利用计算出的状态根决定谁赢得挑战。 如果挑战者关于卷叠的正确状态的声明是正确的,则运营商会受到惩罚,他们的保证金将被罚没。
但是,在 L1 重新执行交易以检测欺诈需要发布单独交易的状态承诺,并增加必须在链上发布的数据卷叠。 重放交易还会产生巨大的燃料成本。 由于这些原因,乐观卷叠正在转向多轮交互式证明,以更高的效率实现相同的目标(即检测无效卷叠操作)。
多轮交互式证明
多轮交互式证明涉及断言者与挑战者之间的来回协议,由 L1 验证者合约监督,最终决定说谎方。 L2 节点对断言提出挑战后,要求断言者将有争议的断言分成相等的两半。 在这种情况下,每个单独的断言都将包含与另一个断言一样多的计算步骤。
然后挑战者将选择它想要挑战的断言。 分割过程(称为“二等分协议”)一直持续到双方就单个执行步骤的断言发生争执。 此时,L1 合约将通过评估指令(及其结果)来解决争议,以抓住欺诈方。
断言者需要提供“一步证明”来验证有争议的单步计算的有效性。 如果断言者未能提供一步证明,或者 L1 验证者认为证明无效,他们的挑战便会失败。
关于此类欺诈证明的一些注意事项:
多轮交互式欺诈证明被认为是有效的,因为它最大限度地减少了 L1 链在争议仲裁中必须做的工作。 L1 链无需重播整个交易,而只需重新执行卷叠执行过程中的一个步骤。
二等分协议减少了发布在链上的数据量(无需为每笔交易发布状态提交)。 此外,乐观卷叠交易不受以太坊燃料限制的约束。 相反,乐观卷叠重新执行交易必须确保 L2 交易具有较低的燃料限制,以模拟其在单个以太坊交易中的执行。
恶意断言者的保证金的一部分被奖励给挑战者,而另一部分则被销毁。 销毁可以防止验证者之间的勾结;如果两个验证者串通起来发起虚假挑战,他们仍然会丧失全部质押的相当大一部分。
多轮交互证明需要双方(断言者和挑战者)在指定的时间窗口内执行动作。 未能在截止日期到期前采取行动会导致违约方放弃挑战。
为什么欺诈证明对乐观卷叠很重要
欺诈证明很重要,因为它们促进了乐观卷叠中的去信任确定性。 去信任确定性是乐观卷叠的一项特性,它保证交易只要是有效的,最终将被确认。
恶意节点可以尝试通过启动虚假挑战来延迟对有效卷叠区块的确认。 但是,欺诈证明最终将证明卷叠区块的有效性并使其得到确认。
这也与乐观卷叠的另一个安全属性有关:链的有效性依赖于一个诚实节点的存在。 诚实节点可以通过发布有效断言或对无效断言提出异议来正确推进链。 无论如何,与诚实节点发生纠纷的恶意节点将在欺诈证明过程中失去其质押品。
L1/L2 互操作性
乐观卷叠旨在与以太坊主网互操作,并允许用户在 L1 和 L2 之间传递消息和任意数据。 它们还与以太坊虚拟机兼容,因此你可以将现有的去中心化应用程序移植到乐观卷叠或使用以太坊开发工具创建新的去中心化应用程序。
1. 资产转移
进入卷叠
为了使用乐观卷叠,用户将以太币、ERC-20 代币和其他可接受的资产存入 L1 上卷叠的链桥合约中。 链桥合约会将交易中继到 L2,在那里铸造等量的资产并发送到用户在乐观卷叠中选择的地址。
用户生成的交易(如 L1 > L2 存款)通常会排队,直到排序者将它们重新提交到卷叠合约。 但是,为了保持抗审查能力,如果交易延迟超过允许的最大时间,乐观卷叠允许用户直接向链上卷叠合约提交交易。
一些乐观卷叠采用更直接的方法来防止排序者审查用户。 在这里,一个区块由自前一个区块以来提交给 L1 合约的所有交易(例如存款)以及卷叠链上已处理的交易共同定义。 如果排序者忽略 L1交易,它将发布(可证明)错误的状态根;因此,一旦用户生成的消息被发布在 L1 上,排序者就不能将其延迟。
退出卷叠
由于欺诈证明方案,从乐观卷叠中取款到以太坊更加困难。 如果用户发起一个 L2 > L1 交易以提取在 L1 上托管的资金,他们必须等到挑战期(大约持续 7 天)过去。 然而,退出过程本身相当简单。
在 L2 卷叠上发起取款请求后,该交易被纳入下一批,同时用户在卷叠上的资产被销毁。 一旦批次在以太坊上发布,用户就可以计算一个 Merkle 证明来验证他们的退出交易是否包含在区块中。 然后便是等待延迟期过后完成 L1 上的交易并将资金提取到主网的问题了。
为了避免在向以太坊取款前等待一周,乐观卷叠用户可以聘请流动性提供者 (LP)。 流动性提供者承担待处理的 L2 取款的所有权,并在 L1 上向用户付款(以换取费用)。
流动性提供者可以在释放资金之前检查用户取款请求的有效性(通过自行执行链)。 这样他们就可以保证交易最终会得到确认(即,去信任确定性)。
2. 以太坊虚拟机兼容性
对于开发者而言,乐观卷叠的优势在于它们与以太坊虚拟机 (EVM) 的兼容性(或者更好的是,等效性)。 与以太坊虚拟机兼容的卷叠符合以太坊黄皮书(opens in a new tab)中的规范,并在字节码级别支持以太坊虚拟机。
乐观卷叠中的以太坊虚拟机兼容性具有以下好处:
i. 开发者可以将以太坊上的现有智能合约迁移到乐观卷叠链,而无需大量修改代码库。 这可以节省开发团队在 L2 上部署以太坊智能合约的时间。
ii. 使用乐观卷叠的开发者和项目团队可以利用以太坊的基础设施。 这包括编程语言、代码库、测试工具、客户端软件、部署基础设施等。
使用现有工具很重要,因为这些工具多年来已经过广泛的审核、调试和改进。 它还让以太坊开发者无需学习如何使用全新的开发堆栈构建应用程序。
3. 跨链合约调用
用户(外部拥有的帐户)通过向卷叠合约提交交易或让排序者或验证者为他们执行交易来与 L2 合约进行交互。 乐观卷叠还允许以太坊上的合约帐户与 L2 合约交互,使用桥梁合约来中继消息并在 L1 和 L2 之间传递数据。 这意味着你可以在以太坊主网上编写 L1 合约,以调用属于 L2 乐观卷叠合约的函数。
跨链合约调用是异步发生的 — 这意味着调用首先启动,然后再稍后执行。 这与以太坊上两个合约之间的调用不同,即调用会立即产生结果。
一个跨链合约调用的例子是前文所述的代币存款。 L1 上的合约托管用户的代币,并向配对的 L2 合约发送消息,以在卷叠中铸造等量的代币。
由于跨链消息调用会导致合约执行,因此发送者通常需要支付用于计算的燃料成本。 建议设置较高的燃料限制,以防止交易在目标链上失败。 代币桥梁场景就是一个很好的例子;如果交易的 L1 端(存入代币)有效,但 L2 端(铸造新代币)由于燃料不足而失败,则存款将无法收回。
最后,我们应该注意到,合约之间的 L2 > L1 消息调用需要考虑延迟(L1 > L2 调用通常在几分钟后执行)。 这是因为从乐观卷叠发送到主网的消息在挑战窗口到期之前无法执行。
乐观卷叠费用如何运作?
乐观卷叠使用类似于以太坊的燃料费方案来表示用户为每笔交易支付的费用。 乐观卷叠收取的费用取决于以下组成部分:
状态写入:乐观卷叠将交易数据和区块头(由前一个区块头哈希、状态根、批处理根组成)作为
blob
,即二进制大对象,发布到以太坊。 EIP-4844(opens in a new tab) 引入了在链上纳入数据的高成本效益解决方案。blob
是一个允许卷叠将压缩状态的转换数据发布到以太坊一层网络的新交易字段。 与永驻链上的calldata
不同,二进制大对象的生命周期很短,在 4096 个时段(opens in a new tab)(大约 18 天)后即可从客户端删除。 通过使用二进制大对象发布批量压缩交易,乐观卷叠可以大幅降低向一层网络写入交易的成本。使用的二进制大对象燃料:二进制大对象携带的交易采用类似于 EIP-1559(opens in a new tab) 中引入的动态费用机制。 第三类型交易的燃料费考虑了二进制大对象的基础费,后者由网络根据二进制大对象空间需求和所发送交易的二进制大对象空间使用情况来决定。
二层网络运营商费用:这是支付给卷叠节点的金额,用来补偿处理交易时产生的计算成本,很像以太坊上的燃料费用。 由于二层网络处理能力更强,并且不会出现网络拥塞迫使以太坊上的验证者优先处理费用更高的交易,卷叠节点收取的交易费更低。
乐观卷叠应用了多种机制来降低用户的费用,包括批量交易和压缩 calldata
以降低数据发布成本。 你可以查看 L2 费用跟踪器(opens in a new tab),实时了解使用基于以太坊的乐观卷叠的成本。
乐观卷叠如何扩容以太坊?
如前所述,乐观卷叠在以太坊上发布压缩的交易数据以保证数据可用性。 压缩链上发布的数据的能力对于通过乐观卷叠扩容以太坊的吞吐量至关重要。
以太坊主链限制了区块可以容纳的数据量,以燃料单位计量(平均区块大小为 1500 万燃料)。 虽然这限制了每笔交易可以使用多少燃料,但也意味着我们可以通过减少与交易相关的数据来增加每个区块处理的交易,直接提高了可扩展性。
乐观卷叠使用多种技术来实现交易数据压缩并提高每秒交易量速率。 例如,这篇文章(opens in a new tab)将基本用户交易(发送以太币)在主网上生成的数据量与相同交易在卷叠上生成的数据量进行了比较:
参数 | 以太坊 (L1) | 卷叠 (L2) |
---|---|---|
Nonce | ~3 | 0 |
Gasprice | ~8 | 0-0.5 |
Gas | 3 | 0-0.5 |
To | 21 | 4 |
Value | 9 | ~3 |
Signature | ~68 (2 + 33 + 33) | ~0.5 |
From | 0(从签名中恢复) | 4 |
总计 | ~112 字节 | ~12 字节 |
对这些数字进行一些粗略的计算有助于显示乐观卷叠提供的可扩展性改进:
- 每个区块的目标大小是 1500 万燃料,验证一个字节的数据需要 16 个燃料。 将平均区块大小除以 16 燃料(15,000,000/16),表明一般区块可以容纳 937,500 字节的数据。
- 如果一个基本卷叠交易使用 12 个字节,那么以太坊区块平均可以处理 78,125 个卷叠交易 (937,5000/12) 或 39 个卷叠批次(如果每个批次平均包含 2,000 个交易)。
- 如果每 15 秒在以太坊上产生一个新区块,那么卷叠的处理速度将大致达到每秒 5,208 次交易。 这是通过将以太坊区块可以容纳的基本卷叠交易数量 (78,125) 除以平均区块时间 (15 秒) 得出的。
这是一个比较乐观的估计,因为乐观卷叠交易不可能包含以太坊上的整个区块。 但是,它可以大致了解乐观卷叠可以为以太坊用户提供多少可扩展性收益(当前实现可提供高达 2,000 交易每秒的速率)。
在以太坊上引入数据分片有望提高乐观卷叠的可扩展性。 由于卷叠交易必须与其他非卷叠交易共享区块空间,因此它们的处理能力受到以太坊主链上的数据吞吐量的限制。 Danksharding 使用更经济的非永久型“二进制大对象”存储,而弃用昂贵的永久型 CALLDATA
,这将增加二层网络链上用于发布每个区块中数据的空间。
乐观卷叠的优缺点
优点 | 缺点 |
---|---|
在不牺牲安全性或去信任的情况下提供可扩展性的巨大改进。 | 由于潜在的欺诈挑战导致交易确定性的延迟。 |
交易数据存储在第 1 层链上,提高了透明度、安全性、抗审查性和去中心化性。 | 中心化卷叠运营商(排序者)可以影响交易排序。 |
欺诈证明保证了去信任的确定性,并允许少数诚实节点保护链安全。 | 如果没有诚实节点,恶意运营商可以通过发布无效区块和状态承诺来窃取资金。 |
计算欺诈证明对常规 L2 节点是开放的,这与需要特殊硬件的有效性证明(用于零知识卷叠中)不同。 | 安全模式依赖于至少一个诚实节点执行卷叠交易并提交欺诈证明来挑战无效的状态转换。 |
卷叠受益于“去信任的活性”(任何人都可以通过执行交易和发布断言来强制链前进) | 用户必须等待一周的挑战期到期,然后才能将资金取回以太坊。 |
乐观卷叠依赖于精心设计的加密经济激励措施来提高链上的安全性。 | 卷叠必须在链上发布所有交易数据,这会增加成本。 |
与以太坊虚拟机和 Solidity 的兼容性允许开发者将以太坊原生智能合约移植到卷叠或使用现有工具来创建新的去中心化应用程序。 |
乐观卷叠的直观解释
更愿意通过视频学习? 观看 Finematics 解说乐观卷叠: