本文原文作者为Vitalik,翻译校对:TinTinLand
Rollups 在以太坊社区中风靡一时,有望在未来成为以太坊的关键可扩展性解决方案。但是这项技术到底是什么,从中值得期待什么?又将如何使用它?本文在分析以太坊几个重要扩展方案的基础上,试图回答 Rollups 相关的一些关键问题。
背景:什么是 L1 和 L2 ?
有两种方法可以扩展区块链生态系统。第一种,可以让区块链本身拥有更高的交易能力。这种技术面临的主要挑战是,具有“更大区块”的区块链本质上更难以验证,并且可能变得更加集中。为了避免这种风险,开发人员可以提高客户端软件的效率,或者持续地使用诸如分片之类的技术,以允许在多个节点上拆分构建和验证链的工作。也就是目前正在构建的以太坊的升级。
第二种,可以更改使用区块链的方式。用户不是将所有活动直接放在区块链上,而是在“第2层”协议中,在链下执行大部分活动。链上有一个智能合约,它只有两个任务:处理存款和取款,以及验证链下发生的一切都遵循规则的证据。有多种方法可以进行这些证明,但它们都具有一个共同的特性,即在链上验证证明比在链下进行原始计算要便宜得多。
状态通道 vs Plasma vs Rollups
L2 层方案有状态通道、Plasma 和 Rollups 这三种主要类型。它们属于不同范式,具有不同的优缺点,下面将分别叙述这三种不同方案的运作方式。
状态通道如何运作
假设一个具体案例,Alice 为 Bob 提供了一个网络连接,Bob 以每兆0.001美元的价格支付费用。他们的交易不是每一次都要付款,而是使用以下L2方案。
首先,Bob 将1美元(ETH 或稳定币等价物)放入智能合约中。为了向 Alice 支付第一笔款项,Bob 签署了一张“票证”(一条链下消息),上面写着“0.001美元”,并将其发送给 Alice 。为了进行第二次付款,Bob 会签署另一张写着“$ 0.002”的票,并将其发送给 Alice 。依此类推,根据需要支付尽可能多的款项。当 Alice 和 Bob 完成交易后,Alice 可以将最高价值的票据发布到链上,并包装在自己的另一个签名中。智能合约验证了 Alice 和 Bob 的签名,向 Alice 支付了 Bob 票上的金额,并将其余部分退还给 Bob。如果 Alice 不愿意关闭通道(由于恶意或技术故障),Bob 可以启动一个退出期(例如7天);如果 Alice 在这段时间内没有提供票据,那么 Bob 就会拿回他所有的钱。
这种技术强大之处在于:它可以调整处理双向支付的智能合约关系。例如 Alice 和 Bob 在频道内签订合约,以及如果 Alice 和 Bob 有一个开放的渠道,Bob 和 Charlie 也是如此,Alice 可以与 Charlie 进行无信任的互动。
但是,channels 可以做的事情是有限的。比如不能使用 channels 将资金从链下发送给尚未参与的人。channels 不能用于表示没有明确逻辑所有者的对象(例如 Uniswap)。相比简单的经常性支付,如果有更复杂的需求,则需要大量的资金来锁定。
另请参阅:https://www.jeffcoleman.ca/state-channels 和 statechannels.org
Plasma 如何运作
为了存入资产,用户将其发送到管理 Plasma 链的智能合约。Plasma 链为该资产分配一个新的唯一 ID(例如537)。每个 Plasma 链都有一个运算符(这可能是一个集中式的参与者,或者是一个多重签名,或者更复杂的东西,如 PoS 或 DPoS)。每个间隔(可能是15秒,或一小时,或介于两者之间的任何时间),操作员都会生成一个“ batch ”,其中包含他们从链下收到的所有 Plasma 交易。它们生成一个 Merkle 树,其中在树中的每个索引处,如果存在这样的交易,则有一个事务转移资产 ID,否则该叶子为零。
他们还将每个索引的 Merkle 分支发送给该资产的当前所有者。要提取资产,用户将发布最近事务的Merkle 分支,并将资产发送给他们。合约开始一个挑战期,在此期间,任何人都可以尝试使用其他Merkle分支来证明退出无效,方法是(i)发送方在发送资产时不拥有资产,(ii)他们在稍后的某个时间点将资产发送给其他人。如果7天内没有人证明退出是欺诈性的,用户可以撤回资产。
Plasma 提供比状态通道(State channels)更强的属性:可以将资产发送给从未参与系统的参与者,并且资金要求很低。代价则是:在“正常操作”期间,通道不需要任何数据就可以上链,但 Plasma 要求每条链定期发布一个哈希值。此外,Plasma 体转移不是即时的,必须等到间隔期结束以及区块公开上链。
此外,Plasma 和通道有一个共同的弱点:它们之所以安全的背后依赖于这样一种理论——两个系统控制的每个对象都有一些逻辑上的“所有者”。如果该所有者不关心他们的资产,则可能导致涉及该资产的“无效”结果。这对于许多应用程序来说是可以的,但对于许多其他应用程序来说,是一个交易破坏者。即使是在未经所有者同意的情况下更改对象状态的系统(例如基于帐户的系统,您可以在未经他们同意的情况下增加某人的余额)也无法很好地使用 Plasma。这意味着在 Plasma 或通道部署中,需要大量的“特定于应用程序的推理”,并且不可能制作一个仅模拟整个以太坊环境(或“EVM”)的 Plasma 或通道系统。为了解决这个问题,让我们开始了解第三种方案——Rollups。
另请参阅: http://plasma.io/plasma-deprecated.pdf
Rollups 如何运作
-
关于 Rollups
Plasma 和通道是“完整的” L2 方案,因为它们试图将数据和计算都移出链下。但是,围绕数据可用性的基本博弈论问题意味着,不可能对所有应用程序都安全地执行此操作。Plasma 和通道通过依赖所有者概念来解决这个问题,但这影响了他们的应用范围。然而,Rollups 是一种“混合” L2 方案。Rollups 将计算(和状态存储)移动到链下,但将每个任务的部分数据保留在链上。为了提高效率,他们使用了大量复杂的压缩技巧,尽可能用计算来替换数据。结果是系统中可扩展性仍然受到底层区块链的数据带宽的限制,但受限的程度低:以太坊基础层 ERC20 令牌传输的成本约为 45000 gas,而 Rollups 中的 ERC20 令牌传输占用16字节的链上空间,成本低于 300 gas。
值得注意的是,将数据“放在 IPFS 上”是行不通的,因为 IPFS 没有就任何给定的数据是否可用,达成共识,数据必须在区块链上。有了将数据放在链上这一共识,Rollups 允许任何人根据需要在本地处理任何操作,允许他们检测欺诈、发起提款或亲自开始生成交易 batch 。缺乏数据可用性问题意味着恶意或离线操作员可以造成的伤害更小(如他们不能造成1周的延迟),Rollups 更容易推理,为有权发布 batch 的人开辟了更大的使用空间。最重要的是,缺乏数据可用性问题意味着不再需要将资产映射到所有者,这使得以太坊社区对 Rollups 扩展方案十分感兴趣,Rollups是完全通用的,甚至可以在 Rollups 中运行 EVM, 允许现有的以太坊应用程序迁移到 Rollups,几乎不需要编写任何新代码。
另请参阅:https://docs.ethhub.io/ethereum-roadmap/layer-2-scaling/optimistic_rollups/
Rollups 工作原理
链上有一个智能合约,它维护一个状态根:Rollups 状态的 Merkle 根(意思是账户余额、合约代码等,在 Rollups 的“内部”)。
任何人都可以发布 batch ,即高度压缩的事务集,以及以前的状态根和新的状态根(处理事务后的 Merkle 根)。合约检查 batch 中的上一个状态根,是否与其当前状态根匹配;如果匹配,它会将状态根切换到新的状态根。
为了支持存款和取款,添加了输入或输出“超出”汇总状态的事务的功能。如果 batch 具有来自外部的输入,则提交 batch 的事务还需要将这些资产转移到 Rollups 合约。如果一个 batch 有输出到外部,那么在处理该 batch 时,智能合约会启动这些提款。
如何知道 batch 中的后状态根源是正确的?如果有人可以提交一个具有任何 post-state root 的 batch 而不会产生任何后果,那么他们可以将 Rollups 中的所有硬币转移给自己。这个问题很关键,对此产生了两个截然不同的解决方案系列,导致了两种不同的 Rollups。
Optimistic Rollups 与 ZK Rollups
这两种类型的 Rollups 分别是:
-
Optimistic Rollups(乐观 Rollups),使用欺诈证明:Rollups 合约跟踪其状态根的整个历史记录和每个 batch 的哈希。如果有人发现一个 batch 具有不正确的后状态根,他们可以发布一个证明来链接,证明该 batch 的计算不正确。合约将验证证明,并还原该 batch 及其之后的所有 batch 。
-
ZKRollups(零知识 Rollups),使用有效性证明:每个 batch 都包含一个称为 ZK-SNARK 的加密证明(例如使用 PLONK 协议),它证明 post-state root 是执行 batch 的正确结果。无论计算量有多大,证明都可以在链上非常快速地验证。
在两种类型的Rollups之间存在复杂的权衡:
总的来说,在短期内,Optimistic的 Rollups 可能会在通用 EVM 计算中胜出,而 ZK Rollups 可能会在简单的支付、交换和其他特定于应用程序的用例中胜出。
欺诈证明剖析
Optimistic Rollups 的安全性取决于这样一种设想,即如果有人将无效 batch 发布到 Rollups 中,则检测到欺诈的任何其他人都可以发布欺诈证明,向合约证明该 batch 无效,应该恢复。
据上图可知,声称 batch 无效的欺诈证明将包含绿色数据:batch 本身(可以根据存储在链上的哈希进行检查)以及 Merkle 树的部分,这些部分只需要证明由 batch 读取和/或修改的特定帐户。黄色树中的节点可以从绿色的节点重建,因此不需要提供。此数据足以执行 batch 并计算后状态根(请注意,这与无状态客户端验证单个块的方式完全相同)。如果计算出的状态后根和 batch 中提供的后状态根不相同,则该 batch 是欺诈性的。
可以确定的是,如果 batch 构造不正确,并且所有以前的 batch 都正确构造,则可能会创建欺诈证明,表明该 batch 构造不正确。请注意有关以前 batch 的声明:如果有多个无效 batch 发布到 Rollups 中,则最好尝试证明最早的 batch 无效。当然,如果 batch 构建正确,则永远不可能创建欺诈证明,证明该 batch 无效。
数据压缩原理
一个简单的以太坊交易(发送ETH)需要大约110个字节。但是,Rollups 中的 ETH 传输仅占用约12个字节:
其中一部分只是高级编码:以太坊的 RLP 在每个值的长度上浪费了1个字节。但是也包含了一定的压缩技巧:
-
Nonce:此参数的目的是防止重放攻击。如果帐户的当前 Nonce 为 5,则该帐户的下一笔交易必须具有 Nonce 5,一旦处理了交易,帐户中的随机数将增加到 6,因此无法再次处理该交易。在 Rollups 中,我们可以完全省略随机数,因为我们只是从前状态中恢复随机数;如果有人尝试使用较早的随机数重放交易,则签名将无法验证,因为签名将针对包含更高 Nonce 的数据进行检查。
-
Gasprice:我们允许用户以固定范围的 Gasprice 付款,如2的16次幂。或者可以在每个 batch 中都有一个固定的费用,甚至将 gas 支付完全转移到 Rollups 协议之外,并让交易参与者通过状态通道向 batch 创建者支付费用。
-
Gas:我们同样可以将总 Gas 限制为2的多次幂。或者在 batch 级别设置 Gas 限制。
-
To:我们可以用 index 替换20字节的地址。如果一个地址是添加到树中的第4527个地址,我们只使用 index 4527来引用它,将向状态添加一个子树(subtree),以存储index到地址。
-
Value:我们可以用科学记数法存储值。在大多数情况下,转账只需要1-3位有效数字。
-
Signature:我们可以使用 BLS 聚合签名,它允许将大量签名聚合成单个约32-96字节(取决于协议)的签名。然后,可以针对一个 batch 中的整组消息和发件人检查此签名。表中的“约0.5”表示在聚合中可以组合的签名数量存在限制,可以在单个块中验证,因此大批量约每100 个事务需要一个签名。
ZK Rollups 的一个重要压缩技巧是,如果交易的一部分仅用于验证,并且与计算状态更新无关,则该部分可以留在链下。Optimistic Rollups 则无法做到,因为如果以后需要在欺诈证明中检查数据,则仍需要将数据包含在链上,而在 ZKRollups 中,证明 batch 正确性的 SNARK 已经证明提供了验证所需的任何数据。具备隐私保护功能的 rollups 是一个重要例子:在Optimistic Rollups 中,每个交易中用于隐私的约500字节,ZK-SNARK 需要在链上;而在 ZKRollups 中,覆盖整个 batch 的 ZK-SNARK 已经毫无疑问地表明“内部” ZK-SNARK 是有效的。
这些压缩技巧是 Rollups 可延展性的关键。如果没有它们,Rollups 可能只是基本链可扩展性的10倍左右(尽管有一些特定的计算密集型应用程序,即使是简单的 Rollups 也很强大),而进行数据压缩后,几乎所有应用的扩容性都可以实现 100 倍以上的提升。
谁可以提交 batch ?
对于谁可以在Optimistic或 ZKRollups 中提交 batch ,有许多说法。一般来说,每个人都同意,为了能够提交 batch ,用户必须支付大笔存款;如果该用户曾经提交欺诈性 batch (例如具有无效的状态根),则该存款将被部分销毁,部分作为奖励给予欺诈证明者。但除此之外,还有很多可能性:
-
完全无政府状态:任何人都可以随时提交 batch 。这是最简单的方法,但它有一些重要的缺点。一旦存在多个参与者,同时生成并尝试并行提交 batch,但最终只有一个 batch 能被成功打包。这导致在生成证明方面浪费大量精力,以及将 batch 发布到链中浪费 Gas。
-
中心化处理:存在一个排序者(sequencer)来提交 batch (提款除外:通常的技术是用户可以先提交提款请求,然后如果排序器在下一批中没有处理该提款,那么用户可以自己提交单个操作 batch )。这是最“高效”的,但它依赖于一个核心的 actor 来操作。
-
排序者拍卖:举行拍卖(例如每天)以确定谁有权成为第二天的排序者。这种技术的优势在于它能筹集资金,通过 Rollups 控制的 DAO 来进一步分配。(参见:MEV 拍卖)
-
从 PoS 集合中随机选择:任何人都可以将 ETH(或者可能是 Rollups 自己的协议令牌)存入 Rollups 合约,并且每个 batch 的排序者是从其中一个存款人中随机选择的,被选中的概率与存入的金额成正比。这种技术的主要缺点是它会导致大量不必要的资本锁定。
-
DPoS 投票:序列者在拍卖中被选中,但如果他们表现不佳,代币持有者可以投票将他们踢出并举行新的拍卖。
拆分批处理和状态根供应
目前正在开发的 Rollups 使用“拆分批处理”的方式,即提交一批 L2 操作和提交状态根的操作是分开完成的。这有一些关键优势:
-
可以允许许多排序者并行发布 batch ,以提高抗审查性,而不必担心某些 batch 会因为某些其他 batch 首先被包含而无效。
-
如果状态根是欺诈性的,则无需还原整个 batch ;您可以只还原状态根,并等待某人为同一 batch 提供新的状态根。这为交易发送者提供了更好的保证,即他们的交易不会被还原。
总而言之,这是一个相当复杂的技术,试图在效率,简单性,抗审查性和其他目标的复杂权衡之间取得平衡。现在说这些想法的哪种组合效果最好还为时过早。时间会证明一切。
Rollups 能带来多少扩展?
在现有的以太坊链上,gas 限制为1250万,交易中每个字节的数据花费16 gas。这意味着,如果一个块只包含单个 batch (我们假设使用了 ZKRollups,花费50万 gas 进行证明验证),则该 batch 可以有(1200万 / 16)= 750,000字节的数据。如上所示,ETH 传输的 Rollups 每个用户操作只需要12个字节,这意味着该批最多可以包含62,500个事务。在13秒的平均区块时间下,这相当于约4807 TPS(相比之下,以太坊本身的直接 ETH 转账为1250万 / 21000 / 13 ~= 45 TPS)。
以下是其他一些示例用例的图表:
最大可扩展性增益的计算公式为(L1 gas 成本)/(Rollups中的字节数 * 16)* 1200 万/ 1250 万。
值得注意的是,这些数字过于乐观。一个块几乎永远不会只包含一个 batch ,至少因为存在并且将有多个 Rollups。其次,存款和取款将继续存在。第三,在短期内使用率会很低,因此固定成本将占主导地位。但即使考虑到这些因素,超过100倍的可扩展性增益也有望成为常态。
现在,如果我们想超过约1000-4000 TPS 该怎么办?这就是 Eth2 数据分片的用武之地。分片提案每12秒提供16 MB 的空间,可以容纳任何数据,且确保对该数据的可用性。此数据空间如果由 Rollups 使用,每秒约1398kb空间比现有以太坊链提高了23倍,从长远来看,数据容量预计将进一步增长。因此,使用 Eth2 分片数据的 Rollups 可以共同处理多达约10万交易,未来甚至更多。
Rollups 有哪些尚未完全解决的挑战?
虽然 Rollups 的基本概念现在已经很好理解,它们是可行和安全的,并且已经有多个 Rollups 部署到主网中,但仍有许多 Rollups 设计领域尚未得到充分探索,将以太坊生态系统的大部分内容完全引入 Rollups 以方面存在很多挑战。一些关键问题包括:
-
用户和生态入驻- 使用 Rollups 项目不多、用户不熟悉,很少有钱包集成 Rollups。商家和慈善机构尚未支持这种支付方式。
-
跨 Rollups 交易- 高效地将资产和数据从一个 Rollups 移动到另一个 Rollups,而无须产生经由L1的费用。
-
审计激励- 如何最大程度提高至少有一个诚实节点完整验证一个 Optimistic Rollup 的机率,使问题出现时他们会广播欺诈证明?对于小规模 Rollup (高至每秒几百笔交易),这个问题不大,因为对矿工来说只是举手之劳,但对于大规模的 Rollup 来说,还需要更充分的理由以说服矿工去做验证。
-
探索 Plasma 和 Rollups 之间的设计空间- 是否有技术可以将一些与状态更新相关的数据放在链上,但不是全部,且这些数据会产生有用的东西?
-
最大限度地提前确认安全性- 许多 Rollups 提供了“pre-confirmation”的概念,以实现更快的用户体验,其中排序者立即提供承诺,即交易将包含在下一批中,并且如果排序者违背了诺言,则排序者的存款将被销毁。但这一计划的经济安全是有限的,因为有可能同时向许多行为者做出许多承诺。这种机制能否得到改进?
-
提高对缺失的排序器的响应速度- 如果 Rollups 的排序者突然脱机,那么短时间从这种情况中恢复,要么是快速且低消耗地切换到另一个 Rollup,要么是换一个排序者,都是有成本的。
-
高效的ZK-VM- 生成ZK-SNARK证明通用EVM代码(或现有智能合约可以编译到的一些不同VM)已正确执行并具有一个给定的结果。
结 论
Rollups 是一种强大的、新颖的 L2 扩展方案,预计将成为以太坊在短期和中期(也可能是长期)扩展的基石。与之前的 L2 扩展方案不同,它们可以支持通用的 EVM 代码,允许现有应用程序轻松迁移。而 Rollups 通过妥协——交易处理不是完全在链下进行,而是每笔交易留下一小部分数据在链上,在以太坊社区中获得了高度关注。
从技术设计角度,Rollups 有多种类型,如使用欺诈证明的 Optimistic Rollups,使用有效性证明的ZKRollups(ZK-SNARKs)。Rollups 仍然是一种早期的、正迅速发展的技术,预计在未来几年中,Rollups 空间中将出现更多令人兴奋的项目。