回顾 V 神 Rollups 神作,详解以太坊为何需要二层扩展方案
原文作者:Vitalik
翻译校对:TinTin Land
原文链接:https://vitalik.ca/general/2021/01/05/rollup.html
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 空间中将出现更多令人兴奋的项目。
版权声明: 本文为 InfoQ 作者【TinTinLand】的原创文章。
原文链接:【http://xie.infoq.cn/article/4c72b485e36e05ca94f15000d】。文章转载请联系作者。
评论