这篇文章详细介绍了Rollups技术作为以太坊的关键扩展解决方案,比较了不同的Layer-2扩展方法如State channels和Plasma,并深入探讨了Optimistic Rollups与ZK Rollups的区别及其工作原理。文章结构清晰,内容丰富,适合希望理解以太坊扩展解决方案的读者。
不完全的 Rollups 指南
感谢j4c0b0bl4nd0n 的翻译
Rollups 在以太坊社区中倍受关注,旨在成为以太坊在可预见未来的关键扩展解决方案。但这项技术到底是什么,我们可以期待什么,以及我们将如何使用它?本文将尝试回答一些关键问题。
扩展一个区块链生态系统有两种方式。首先,可以提高区块链本身的交易能力。使用这种技术的主要挑战是,“更大区块”的区块链在验证方面本质上更困难,并且可能会变得更加中心化。为避免此类风险,开发人员可以提高客户端软件的效率,或以更可持续的方式,使用 分片 等技术,将区块链的构建和验证工作分布到多个节点中;正在进行的 eth2 努力正致力于在以太坊上构建此更新。
第二种方法是改变使用区块链的方式。用户并不直接在区块链上进行所有活动,而是在“第-2 层”协议上进行大部分活动。链上有一个智能合约,它只有两个任务:处理存款和取款,验证链下所发生的一切都遵循规则的证明。有多种方法可以做这些证明,但所有方法都分享一个性质,即在链上验证证明要比在链下进行原始计算经济得多。
第-2 层扩展的三种主要类型是 state channels, Plasma 和 Rollups。这是三种不同的范式,各自有不同的优势和劣势,目前我们相当确定,所有第-2 层的扩展基本上落在这三类之中(尽管在边缘有名称的争论,例如,参见 “validium”)。
另见:<https://www.jeffcoleman.ca/state-channels> 和 statechannels.org
假设 Alice 为 Bob 提供互联网连接,作为回报,Bob 每下载 1MB 付 Alice $0.001。Alice 和 Bob 使用以下第-2 层模式,而不是为每次支付进行一次交易。
首先,Bob 在智能合约中放入 1 美元(或一些 ETH 或等值的稳定币)。为了向 Alice 进行第一次付款,Bob 签署一张“票据”(链下消息),该票据仅表示“$0.001”,然后发送给 Alice。为了进行第二次付款,Bob 签署另一张票据,表示“$0.002”,然后将其发送给 Alice。依此类推,根据需要进行多次付款。当 Alice 和 Bob 完成交易时,Alice 可以公布金额最大的票据以链接,附上她的另一份签名。智能合约验证 Alice 和 Bob 的签名,将 Bob 的票据金额支付给 Alice,并将剩余金额返回给 Bob。如果 Alice 不愿意关闭通道(由于恶意或技术故障),Bob 可以启动取款期(例如,7 天);如果在此期间 Alice 没有提供票据,则 Bob 收回所有资金。
此技术非常强大:可以调整以处理双向支付,智能合约关系(例如,Alice 和 Bob 在通道内进行金融合约)以及组合(如果 Alice 和 Bob 有一个开放的通道,Bob 和 Charlie 也是如此,Alice 可以不信任地与 Charlie 进行交互)。但是通道能够做到的事情是有限的。通道不能用于将资金发送给尚未参与的人。通道无法表示没有明确所有者的物体(例如,Uniswap)。并且如果通道被用于执行比简单重复支付更复杂的操作,则需要大量的资金被锁定。
另见:Plasma 的原始论文 Plasma 和 Plasma Cash。
为了存入资产,用户将其发送至管理 Plasma 链的智能合约。Plasma 链为该资产分配一个新的唯一标识符(例如 537)。每个 Plasma 链有一个 操作员(可以是一个中心化参与者、多重签名或更复杂的东西,如 PoS 或 DPoS)。每个间隔(可能是 15 秒、1 小时或任何时间段),操作员生成一个“批次”,其中包含所有在链下收到的 Plasma 交易。它们生成一个 Merkle 树,在树的每个索引“X”上,如果存在转移资产 ID “X”的交易,则该索引会包含相应的交易类型,否则该叶子将为零。将此 Merkle 根发布到链上。还将每个索引 X
的 Merkle 分支发送给该资产当前的所有者。要取回资产,用户发布最近一笔交易的 Merkle 分支。合约启动争议期,此期间任何人都可以尝试使用其他 Merkle 分支进行无效输出,证明 (I) 发件人在发送时并不是资产的所有者,或 (II) 在此后的某个时候将资产发送给了其他人。如果在(例如)7 天内没有人证明该输出是欺诈的,则用户可以取回资产。
Plasma 提供了比 State channels 更强大的属性:它可以向从未参与过系统的参与者发送资产,并且资本要求会低得多。但这也是有代价的:通道在“正常运行”期间不需要数据连接链上,但 Plasma 需要每条链定期发布哈希。此外,Plasma 的转移并不瞬时:必须等待间隔结束,块发布。
此外,Plasma 和 State channels 共同分享一个关键的弱点:其背后的博弈论理论基于每个对象在这两个系统中都有某种“逻辑所有者”的观点。如果该所有者不在乎其资产,可能会导致涉及该资产的“无效”结果。这对许多应用来说是可以的,但对许多其他应用来说(例如:Uniswap)则是决定性因素。即便是那些可以在没有所有者同意的情况下改变对象状态的系统(例如:基于帐户的系统,在这种系统中,可以在未经同意的情况下 增加 某人的余额)在 Plasma 中也表现不佳。这一切都意味着,在 Plasma 或 State channels 的任何现实部署中都需要大量的“具体应用推理”,而且不可能创建一个仅模拟以太坊完整环境(或“EVM”)的 Plasma 或 State channels 系统。为了解决这个问题,我们进入了… Rollups。
_另见:EthHub 关于乐观 Rollups 和 ZK Rollups_
Plasma 和 State channels 是“完整”的第-2 层方案,试图将数据和计算都移出链。但是,围绕数据可用性的博弈论基本问题意味着对所有应用程式安全地做到这一点是不可能的。Plasma 和 State channels 通过依赖明确的所有者概念来避免这一点,但这阻碍了它们的通用性。另一方面,Rollups 是一种“混合”的第-2 层方案。Rollups 将计算(和状态存储)移出链,但将某些数据保留在链上。为了提高效率,它们使用大量复杂的压缩技术尽可能地 用计算替代数据。其结果是一个系统,其中可扩展性仍然受限于基础区块链的数据带宽,但比例极为优越:对以太坊基础层的 ERC20 代币转移成本约为 ~45000 gas,而 Rollup 中的 ERC20 代币转移仅占用 16 字节的链上空间且成本低于 300 gas。
数据位于链上这一事实是关键(注:将数据“放在 IPFS 上” 不行,因为 IPFS 不提供关于特定数据是否可用的 共识;数据 必须 放在区块链上)。将数据放在链上并对这一事实达成共识,允许任何人如果愿意可在本地处理 Rollup 中的所有操作,使他们能够检测欺诈、开始取款或自行开始批量处理交易。缺乏数据可用性问题意味着,恶意或离线的操作者可能造成更小的伤害(例如:不会造成 1 周的延迟),这为谁有权发布批次提供了更大的设计空间,并使 Rollups 变得更简单。更重要的是,缺乏数据可用性问题意味着不再需要将资产分配给所有者,这引出了以太坊社区更热衷于 Rollups 而非以前的第-2 层扩展方式的关键原因:Rollups 完全多功能,甚至可以在 Rollup 中运行 EVM,这允许现有的以太坊应用几乎不需要编写任何新代码就迁移到 Rollups。
链上有一个智能合约,该合约维护一个 状态根:Rollup 状态的 Merkle 根(即账户余额、合约代码等,位于 Rollup “内部”)。
任何人都可以发布一个 批次,即一组高效压缩格式的交易集合,连同先前状态的根和新状态的根(处理交易后的 Merkle 根)。该合约验证批次中的先前状态根是否与其当前状态根匹配;如果是,则将状态根更改为新状态根。
为了支持存款和取款,我们添加了能力,允许批次中有“外部”的输入或输出交易。如果一个批次有来自外部的输入,则发送该批次的交易也必须将这些资产转移给 Rollup 合约。如果一个批次有输出到外部,则在处理该批次后,智能合约便会启动这些取款。
就是这样!除了一个重要的细节:如何知道批次中的后续状态根是否正确? 如果有人可以发送带有任何后续状态根的批次而不受后果,那么他们只需将 Rollup 中的所有资产转移给自己。这个问题是关键,因为针对该问题有两大家族的解决方案,这两个解决方案家族导致了两种类型的 Rollups。
两种类型的 Rollups 是:
这两种类型的 Rollups 之间存在复杂的补偿:
固定 Gas 成本每批次 | ~40,000(主要只更改状态根的轻交易) | ~500,000(验证 ZK-SNARK 计算上相当复杂) |
---|---|---|
取款时间 | ~1 周(取款必须延迟以给某人时间发布欺诈证明并在欺诈时取消取款) | 非常快速(只需等待下一个批次) |
技术复杂性 | 低 | 高(ZK-SNARK 是一种非常新且数学上复杂的技术) |
通用性 | 更容易(通用 EVM Rollups 已接近主网) | 更难(对于 ZK-SNARK 证明通用 EVM 执行远比证明简单计算要困难,尽管仍有一些努力(例如:Cairo)在改善此问题) |
链上每笔交易的 Gas 成本 | 高 | 低(如果交易中的数据仅用于验证,而不是用于引发状态更改,则可以省略这些数据,而在乐观 Rollup 中则必须发布,以备在欺诈证明中验证) |
链外计算成本 | 低(尽管为重新计算所需的完整节点数量增加) | 高(ZK-SNARK 证明,尤其是对通用计算,可能是代价高昂的,可能比直接执行计算要贵上千倍。) |
总体来说,我的观点是,短期内,乐观 Rollups 很可能在通用 EVM 计算中领先,而 ZK Rollups 可能在简单支付、交易和其他特定应用场景中领先,但随着 ZK 技术的进步,中长期 ZK Rollups 将在所有用例中获胜。
乐观 Rollup 的安全性依赖于以下观点:如果有人在 Rollup 中发布无效的批次,任何其他 跟踪链并检测出欺诈的人均可以发布欺诈证明,向合约证明该批次无效,并需要被撤回。
一份声称批次无效的欺诈证明将包含如下数据:绿色部分:批次本身(可以通过存储在链上的哈希进行验证)以及 Merkle 树中需要验证的特定帐户已被读取和/或修改的部分。黄色树中的节点可以从绿色节点重建,因此不需要提供这些节点。这些数据足以执行批次并计算后续状态根(请注意,这和 无状态客户端 如何验证单个区块是完全相同的)。如果计算出的后续状态根与批次中提供的后续状态根不相等,则该批次是欺诈的。
可以保证,如果批次构建不正确,而 且所有先前批次构建正确,则可以创建欺诈证明以证明该批次构建不正确。请注意上述关于前一个批次的声明:如果在 Rollup 中发布了多个无效的批次,那么最好尝试证明第一个批次无效。当然,如果批次构建正确,则永远不可能创建一个证明欺诈的证明,使批次无效。
一笔简单的以太坊交易(用于发送 ETH)大约需要 110 字节。然而,Rollup 中的 ETH 转移仅耗费约 12 字节:
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 |
Total | ~112 | ~12 |
其中部分差异仅仅是编码优化:以太坊的 RLP 在每个值的长度中浪费了 1 字节。然而,还有一些非常聪明的压缩技巧正在进行:
一个 Rollups 的 ZK 特殊压缩技巧是,如果交易中的某一部分仅用于验证且与计算状态更新无关,则可以将该部分留在链外。这在乐观 Rollup 中无法做到,因为这些数据仍应包含在链上,以防将来在欺诈证明中验证,而在 ZK Rollup 中,证明批次正确性的 SNARK 已证明所需用于验证的任何数据的有效性。一个重要例子是隐私保护的 Rollup:在乐观 Rollup 中,用于隐私的 ~500 字节 ZK-SNARK 证明必须上链,而在 ZK Rollup 中,覆盖整个批次的 ZK-SNARK 证明则涵盖所有内部 ZK-SNARK 无疑是有效的。
这些压缩技巧对 Rollups 的可扩展性至关重要;没有它们,Rollups 可能只是基础链可扩展性的 ~10 倍改进(尽管在一些特定的计算密集型应用中,甚至简单汇总也非常强大),而借助这些压缩技巧,扩展因子可能超过 100 倍,几乎适用于所有应用。
关于谁可以在乐观配合 ZK Rollups 中发送批次存在几种观点。一般而言,大家一致认为用户要发送批次,必须进行较大的存款;如果该用户发送了有欺诈性质的批次(例如,带有无效状态根),那么该存款部分将被销毁,并将部分退还作为给予欺诈证明者的奖励。但除此之外,有许多可能性:
当前正在开发的一些 Rollups 使用“分批处理”范式,其中发送第-2 层交易的批次和发送状态根的操作是分开的。这有一些关键优势:
总的来说,试图平衡复杂的补偿,包括效率、简单性、抗审查和其它目标,有着一段相当复杂的技术动物园。现在还为时已早,无法确定哪些想法的组合效果最好;时间会告诉我们。
在现有的以太坊链上,Gas 上限为 1250 万,每个字节的数据费用为 16 gas。这意味着,如果一个区块没有其他东西,除了一个批次(假设使用 ZK Rollup,验证证明花费 50 万 gas),那么该批次的最大数据量可以是(1200 万/16)= 750,000 字节。正如上面所示,Rollup 的 ETH 转移只需 12 字节每个用户操作,意味着该批次可以包含多达 62,500 笔交易。以每 13 秒为一次的平均区块时间,这意味着大约 ~4807 TPS(与 1250 万/21000/13 ~= 45 TPS 用于直接在以太坊上转账 ETH 相比)。
以下是一些其他案例用例的表格: | 应用程序 | Rollup 中字节数 | 第-1 层 Gas 成本 | 最大可扩展性增量 | | - | - | - | - | | ETH 转移 | 12 | 21,000 | 105x | | ERC20 转移 | 16(4 个字节用于说明哪个Token) | ~50,000 | 187x | | Uniswap 交易 | ~14(4 字节发件人 + 4 字节收件人 + 3 字节值 + 1 字节最高价格 + 1 字节杂项) | ~100,000 | 428x | | 隐私保障的取款(乐观 Rollup) | 296(4 字节索引根 + 32 字节作废者 + 4 字节收件人 + 256 字节 ZK-SNARK 证明) | ~380,000 | 77x
现在,值得注意的是,考虑到多种原因,这些数字太过乐观了。更重要的是,一个区块几乎永远不会只包含一个批次,至少因为必定会有多种 Rollups。其次,存款和取款仍将存在。第三,短期内 使用量会很低,因此必须承担固定成本。然而,即使考虑到这些因素,预期可实现超过 100 倍的可扩展性收益仍是常态。
那么,如果我们希望超过 ~1000-4000 TPS(具体取决于使用案例)会怎样?这时 eth2 数据分片 的出现至关重要。分片提案每 12 秒开放 16MB 的空间,可填充任何数据,系统会确保对这些数据的可用性达成共识。这个数据空间可以被 Rollups 使用。每秒 ~1398k 字节的提升是对当前以太坊链的 ~60 kB/s 提升了 23 倍,随着时间的推移,预计这个数据能力还会继续增长。因此,利用 eth2 分片数据的 Rollups 将集体处理最多约 ~100,000 TPS,甚至在未来的更长时间内提供更大的处理能力。
虽然 Rollups 的基本概念现在被很好地理解,并且我们相当确定它们在根本上是可行且安全的,已经有多个 Rollups 实现了主网部署,但仍有许多 Rollup 设计的领域尚未被很好地探索,以及全面将以太坊生态系统的大部分功能转移到 Rollups 执行以认证其可扩展性的一些挑战。几个关键挑战包括:
Rollups 是第二层扩展的一个新而强大的范式,预计它们将成为以太坊在短期和中期(甚至可能是长期)扩展的基石。因为与之前的第二层扩展尝试不同,它们可以支持通用的 EVM 代码,从而使现有应用程序可以轻松迁移。它们通过一个关键承诺来实现这一目标:不试图完全离开链,而是在链上保留少量数据。
Rollups 具有许多类型的汇总和许多设计空间内的选项:可以使用欺诈证明的乐观 Rollup,或使用有效性证明的 ZK Rollup(也称为 ZK-SNARK)。排序者(可以发布交易批次进行链上链接的用户)可以是一个中心化角色、自由竞争者或其他多个中间选项。Rollups 仍然是一种处于起步阶段的技术,开发仍在迅速进行,但它们已经在运行,特别是 Loopring, ZKSync 和 DeversiFi 已运行了几个月。我们期待未来几年从 Rollup 领域涌现出更多激动人心的工作。
- 原文链接: vitalik.eth.limo/general...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!