本文详细介绍了乐观汇总(Optimistic Rollup)技术,它是一种在以太坊L2上运行完全通用智能合约(如Solidity)的构建方法,借鉴了Plasma和zkRollup设计,并通过数据可用性预言机实现扩展。文章从原理、实现、应用等方面进行了深入探讨,并提供了详细的流程图和代码示例。
本文概述了乐观汇总:一种利用 OVM 在二层 (L2) 上启用自主智能合约的构建。该构造大量借鉴了 plasma 和 zkRollup 设计,并建立在 Vitalik 描述的 阴影链 上。该构造类似于 plasma,但为了在Layer2 中运行完全通用的智能合约(例如 Solidity),牺牲了一些可扩展性,以Layer1 提供安全保护。 可扩展性与数据可用性预言机的带宽成正比,包括 Eth1、Eth2,甚至 Bitcoin Cash 或 ETC——提供了一种短期可扩展的类似 EVM 的链在 L2 上。
让我们首先了解乐观汇总在以太坊主网的端到端工作原理,然后深入研究。
以下是乐观汇总智能合约 Fred 的生命周期记述:
开发者将交易发送到一个有担保的 聚合器(一个 L2 区块生成者)以部署合约。
— 任何有担保的人都可以成为聚合器。
— 同一条链上有多个聚合器。
— 收费方式由聚合器自行决定(账户抽象 / 元交易)。
— 开发者获得即时保证,交易将被纳入,否则聚合器会失去其担保。
如果 任何人 下载区块并发现其无效,可以通过 verify_state_transition(prev_state, block, witness)
证明其无效,该方法会:
— 斩首恶意聚合器和在无效区块上构建的聚合器。
— 将聚合器的担保的一部分奖励给证明者。
就这样!用户和智能合约的行为应该与我们在以太坊主网今天看到的非常相似,除了,它能够扩展!现在让我们探索这一切是如何实现的。
首先,让我们定义创建像以太坊这样的无许可智能合约平台意味着什么。我们必须满足三个属性才能构建这种美丽的状态机:
你会注意到以太坊 L1 满足这三个属性,因为我们认为 1) 矿工不会在不可用区块上挖掘,2) 矿工不会在无效区块上挖掘 *;以及 3) 不是所有矿工都会审查交易。然而,它目前并不具备可扩展性。
另一方面,在一些类似的安全假设下,乐观汇总可以在规模上提供这三个保证。要理解构造和安全假设,我们将单独讨论我们希望确保的每个属性。
乐观汇总使用经典汇总技术(在此概述)来确保当前状态的数据可用性。技术很简单——区块生产者(称为聚合器)通过以太坊主网上的 calldata(即以太坊函数的输入)传递所有包含交易和状态根的区块。然后将 calldata 块进行梅克尔化,并存储一个 32 字节的状态根。作为参考,calldata 每 32 字节为 2000 gas,而存储为 20000 gas。此外,calldata 的 gas 成本将在 伊斯坦布尔硬分叉 中减少近 5 倍。
值得注意的是,我们可以使用以太坊主网以外的数据可用性预言机,包括 Bitcoin Cash 和 Eth2。在 Eth2 阶段 1 中,所有分片都可以作为数据可用性预言机,TPS 与分片数量成线性关系。这种吞吐量足够使我们在耗尽可用数据(例如状态计算)之前遇到其他可扩展性瓶颈。
这里我们假设在以太坊主网上有诚实的大多数。此外,如果我们使用 Eth2、ETC 或 Bitcoin Cash,我们同样继承它们的诚实大多数假设。
在这些假设下,使用可信数据可用性预言机发布所有交易,可以确保任何人都能计算当前的头状态,满足属性 #1。
我们需要确保的下一个属性是有效头状态。在 zkRollup 中,我们使用零知识证明确保有效性。虽然这是一个长期的好解决方案,但目前还无法为任意状态转换创建有效的 zkProof。然而,仍然有希望实现通用的 EVM 风格状态机!我们可以使用类似 plasma / truebit 的加密经济有效性游戏。
总体来看,区块提交和有效性游戏如下:
[access_list, transactions, post_state_root]
。ROLLUP_CHAIN
合约(或按轮次如有需要)。要证明一个区块无效,你必须证明以下三个属性之一:
1. INVALID_BLOCK: 提交的区块是 *无效* 的。
通过 `is_valid_transition(prev_state, block, witness) => boolean` 计算。
2. SKIPPED_VALID_BLOCK: 提交的区块“跳过”了一个有效的区块。
3. INVALID_PARENT: 提交的区块的父区块无效。
这三个状态转换有效性条件可以可视化为:
从这个状态有效性游戏中产生了一些有趣的属性:
is_valid_transition(…)
定义不同的有效性检查器,使我们能够使用不同的虚拟机运行智能合约,包括 EVM 和 WASM。L2 采用的一个挑战是增加了对 监视塔 的复杂性。用户合同监视塔在一个已经复杂的系统中增加了另一个实体。值得庆幸的是,监视塔自然受到乐观汇总加密经济有效性游戏的激励!所有数据都是可用的,因此任何运行全节点的人都能获得所有在无效链上构建的聚合器的安全押金。这种风险激励聚合器成为监视塔,验证他们所构建的链——缓解了验证者的困境。
许多 plasma 构造也依赖于加密经济有效性游戏。然而,在 plasma 自主智能合约状态强制执行的能力在没有 zkProof 或 渔民游戏 的情况下,在数据隐瞒攻击(数据可用性问题)中是无法实现的。值得庆幸的是,通过在链上发布计算状态转换所需的最小信息,汇总绕过了数据可用性问题。然而,如果我们想要在每秒数十万(甚至更多)的交易中扩展,plasma 是至关重要的——这在长期是必要的,但在中期许多智能合约中并非必需。
在这些假设下,所有无效块/状态转换将被丢弃,只留下一个单一的有效头状态,满足属性 #2。
我们必须满足的最后一个属性是活跃性,通常被称为审查抵抗。确保这一点的关键见解有:
MINIMUM_BOND_SIZE
的人都可以成为同一汇总链的聚合器。凭借这两个属性,我们已经获得了活跃性!诚实聚合器总是可以提交绕过无效区块的新块,因此即使只有一个不审查的聚合器,你的交易最终也会通过——与主网类似。
我们非常希望的一个属性是即时确认。通过这种方式,我们可以给予用户他们的交易将在子秒内得到处理的反馈。我们可以通过指定短暂的聚合者垄断区块来实现这一点。缺点是,这牺牲了审查抵抗,因为现在单个方可以在某段时间内进行审查。希望能听到关于这个权衡的任何研究!
通过两个安全假设我们获得了活跃性:
在这些假设下,乐观汇总链能够基于任何有效用户交易前进并改动头状态,满足属性 #3。
现在这三个属性都得到满足,我们在以太坊 L2 中拥有了一个无许可智能合约平台!
以下估算是纯粹基于数据可用性。在实践中可能会遇到其他瓶颈,其中之一是状态计算。然而,这确实提供了一个有用的上限。
计算基于 这个小的调用数据计算 Python 脚本。
请注意,这些 ERC20 转账都是调用数据优化的。此外,乐观汇总的优点是我们不仅仅局限于 ERC20 转账!
ECDSA 签名
~100 TPS 无 EIP 2028
~450 TPS 有 EIP 2028(将在 2019 年 10 月发布)
BLS 签名 / SNARK 签名
~400 TPS 无 EIP 2028
~2000 TPS 有 EIP 2028(将在 2019 年 10 月发布)
~与可用性预言机可处理的吞吐量成线性关系。
这比 2000 TPS 多得多!
乐观汇总与 Plasma 有许多共同之处。两者都使用聚合器在主网提交区块,通过加密经济有效性游戏确保安全性。唯一的区别在于我们是否有可用性收据来确保区块的可用性。
这两种解决方案之间的相似性允许两种构造之间共享大量基础设施和代码。在一个成熟的 L2 生态系统中,我们很可能会看到汇总、plasma 和状态通道在同一个客户端(一个智能钱包)中协同工作。哦,我提到过 OVM 吗?😁
乐观汇总在 L2 构造的空间中占据了一个良好的利基。它在可扩展性、通用智能合约、简便性和安全性之间进行了一些权衡。此外,能够运行安全的智能合约意味着它甚至可以被用于裁定其他 L2 解决方案,如 plasma 和状态通道!
把它称为“L2 的 L1”。
无论如何,够了研究——是时候实现一个健壮、全面且用户友好的以太坊 L2 了!😍
特别感谢 Vitalik Buterin 与我一起探讨这些想法,并提出了这篇文章中的大部分内容。
另外,感谢 Ben Jones 提供了许多建议,以及 Jinglan Wang、Kevin Ho 和 Jesse Walden 的编辑。
更新:向 John Adler 于合并共识的出色和相关工作致敬,该工作可以与乐观汇总进行比较——查看 这里! 加上 这个提案,以提高 Eth1 作为数据可用性预言机的能力——更多的 TPS!
- 原文链接: medium.com/plasma-group/...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!