# V神带你读懂以太坊扩展性解决方案Rollup

By [mikeweiyi4](https://paragraph.com/@mikeweiyi4) · 2022-05-16

---

Rollup 在以太坊社区中非常流行，在可预见的未来，它将成为以太坊的关键可扩展性解决方案。但是这项技术到底是什么，你能从它中期望什么，你将如何使用它? 这篇文章将试图回答其中的一些关键问题。

#### 背景：什么是 Layer1 和 Layer 2 扩展？

有两种方法可以扩展区块链生态系统。首先，您可以使区块链本身具有更高的事务容量。这种技术的主要挑战是，具有「更大区块」的区块链本身会更难验证，而且可能变得更加中心化。为了避免此类风险，开发人员可以提高客户端软件的效率，或者更可持续地使用分片等技术，将构建和验证链的工作拆分到多个节点上；众所周知，「ETH2.0」目前正在努力构建对以太坊的升级。

其次，您可以更改使用区块链的方式。用户不是把所有的活动都直接放到区块链上，而是在「Layer 2」协议中执行链外的大部分活动。有一个链上的智能合约，它只有两个任务:处理存取款，以及验证链下发生的所有事情都遵守规则的证明。有多种方法可以实现这些证明，但它们都有一个共同的特性，即验证链上的证明比在链下进行原始计算要便宜得多。

### 状态通道（State channels）对比 Plasma 对比 Rollup

Layer 2 的可扩展方式主要有三种，State channels、Plasma、Rollup。它们是三种不同的方式，各有优缺点，在这一点上，我们相当有信心所有的 Layer 2 扩展大致都可以归入这三种类别。(尽管在命名方面存在争议，例如有叫「validium」)。

#### 状态通道（State channels）是如何运作的？

可以点击看这里： [https://www.jeffcoleman.ca/state-channels](https://www.jeffcoleman.ca/state-channels)以及[statechannels.org](https://statechannels.org/)

假设 Alice 向 Bob 提供互联网连接，作为交换，Bob 每兆支付她 0.001 美元。Alice 和 Bob 使用了下面的 Layer 2 方案，而不是每次付款都进行交易。

首先，Bob 将 1 美元 (或一些 ETH 或稳定币等价物) 放入智能合约。为了向 Alice 支付他的第一次付款，Bob 签署了一张「票（ticket）」(一条链外消息)，上面只写着「$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 进行无需信任的交互)。

但是通道的作用是有限的。通道不能用于将资金在链外发送给尚未参与的人。通道不能用于表示没有明确逻辑所有者的对象 (例如。Uniswap)。通道在用于做比简单的经常性支付更复杂的事情时，需要锁定大量资金。

  

#### Plasma 是如何工作的？

点击这里查看: [original Plasma paper](http://plasma.io/plasma-deprecated.pdf) 和 [Plasma Cash](https://ethresear.ch/t/plasma-cash-plasma-with-much-less-per-user-%20rel=).

为了存入资产，用户将其发送到管理 Plasma 链的智能合约。

Plasma 链为该资产分配一个独立的 ID（比如 537）。每一个 Plasma 链有一个操作员 (这可以是一个的中心化的角色，或一个多重签名，或更复杂的东西，如 PoS 或 DPoS)。每隔一段时间 (可以是 15 秒，或 1 小时，或两者之间的任何时间)，操作员会生成一个「批次处理」，包含他们在链下收到的所有 Plasma 交易。

它们生成一个默克尔树（Merkle tree），在树中的每个指数 X 处，如有一个交易，那就存在一个转移资产 ID X 的交易，否则则为零。他们把这个默尔克树根发送到链上。他们还将每个指数 X 的默克尔分支发送给该资产的当前所有者。为了撤回资产，用户发布发送资产给他们的最新交易的 Merkle 分支。_律动注： Merkle tree，中文称为默克尔树或哈希树。在密码学及计算机科学中是一种树形数据结构，每个叶节点均以数据块的哈希作为标签，而除了叶节点以外的节点则以其子节点标签的加密哈希作为标签。Merkle Tree 的明显的一个好处是可以单独拿出一个分支来（作为一个小树）对部分数据进行校验，这个很多使用场合就带来了哈希列表所不能比拟的方便和高效。_

合约开始是挑战期，在此期间，任何人都可以尝试使用其他 Merkle 分支来使退出无效，方式可以是通过证明 (1) 发送者在发送时并不拥有资产, 或 (2) 他们在之后的某个时间点把资产发给了其他人。如果在 (例如)7 天内没有人证明此笔退出是不真实的，则用户可以撤回资产。

Plasma 提供了比状态通道更强大的属性：您可以将资产发送给从未属于系统的参与者，而且资本要求也低得多。但这是有代价的:通道在「正常运行」期间不需要任何数据在链上运行，而等 Plasma 需要每个链定期发布一个哈希值。此外，等 Plasma 转账不是立即的：您必须等待间隔结束和区块被发布出来。

此外，Plasma 和状态通道有一个共同的弱点：为什么它们是安全的？这背后的博弈论依赖于这样的想法:两个系统控制的每个对象都有一些逻辑上的「所有者」。如果该所有者不关心他们的资产，那么可能会导致涉及该资产的「无效」结果。这对于许多应用程序来说是可以接受的，但对于许多其他应用程序 (例如。Uniswap)。即使是发送资产对象的状态可以在没有所有者同意的情况下改变的系统，(如。基于账户的系统，在那里你可以增加某人的余额，而无需他们的同意) 也不能很好的通过 Plasma 进行处理。

  

这一切都意味着，在任何现实的 Plasma 或状态通道部署中，都需要大量的「应用特定推理」，而且不可能制造一个 Plasma 或通道系统来模拟整个以太坊环境 (或「EVM」)。

为了解决这个问题，我们可以看下……rollup。

  

#### Rollup

详细可以点击这里查看：[EthHub on optimistic rollups](https://docs.ethhub.io/ethereum-roadmap/layer-2-scaling/optimistic_rollups/) 以及 [ZK rollups](https://docs.ethhub.io/ethereum-roadmap/layer-2-scaling/zk-rollups/).

Plasma 和状态通道是完整的 Layer 2 计划，他们试图将数据和计算都移出链外。然而，围绕数据可用性的基本博弈论问题意味着不可能对所有应用程序都安全地做到这一点。Plasma 和通道依靠明确的所有者概念来解决这个问题，但这阻碍了它们的通用性。另一方面呢，rollup 是一种「混合」Layer 2 方案。

Rollup 将计算 (和状态存储) 移到链外，但在链上保留每个事务的一些数据。为了提高效率，他们使用一大堆花哨的压缩技巧，尽可能用计算代替数据。其结果是，系统的可扩展性仍然受到底层区块链数据带宽的限制，但以一个非常有利的比率:一个以太坊底层 ERC20 代币转移成本约为 45000 gas，而一个 ERC20 代币在 rollup 中转移占用 16 字节的链上空间，成本低于 300 gas。

数据链上的事实是关键 (注意:将数据「放在 IPFS 上」是行不通的，因为 IPFS 没有就是否有任何特定数据提供达成一致意见；数据必须放在区块链上）将数据放到链上并就这一事实达成共识，允许任何人在本地处理汇总中的所有操作 (如果他们愿意的话)，从而允许他们检测欺诈行为，开始提款，或亲自开始生产交易批次。缺乏数据可用性的问题意味着恶意的或离线的运营商可以做更少的伤害 (例如。它们不会造成 1 周的延迟)，从而为那些有权发布批次的人打开了一个更大的设计空间，并使汇总变得更容易进行推理。

最重要的是，缺乏数据可用性问题意味着不再需要将资产映射到所有者，这就是为什么以太坊社区相比以前的 Layer 2 扩展形式，更热衷于 rollup 的关键原因：rollup 是完全通用的，甚至可以在 rollup 中运行 EVM，允许现有的以太坊应用程序迁移到 Rollup，几乎不需要编写任何新代码。

### 好的，那么 rollup 的工作有多棒呢？

链上有一个智能合约，它维护一个状态根：rollup 状态的 Merkle 根 (意思是，账户余额、合约代码等，位于 rollup「内部」)。

任何人都可以发布批次处理，这是一个高度压缩形式的事务集合，以及以前的状态根和新的状态根 (处理事务后的 Merkle 根)。合约检查批处理中的前一个状态根是否与当前状态根匹配；如果有，则将状态根切换为新的状态根。

  

为了支持存取款，我们添加了让事务的输入或输出「超出」rollup 状态的能力。如果批处理有来自外部的输入，提交批处理的事务也需要将这些资产转移到 rollup 合约。如果批处理有输出到外部，那么智能合约在处理批处理时就会启动提取。

  

那么，只是这就有一个主要的细节：如何知道批次处理中的后状态根是正确的? 如果有人可以提交带有任何后状态根的批处理，而不会产生任何后果，那么他们就可以将 rollup 中的所有代币转移给自己。

这个问题很关键，因为这个问题有两组非常不同的解决方案，这两组解决方案会导致两种类型的 rollup。

#### Optimistic rollup 对比 ZK rollup

这两种 rollup 就是 Optimistic rollup 和 ZK rollup。

Optimistic rollup, 它们使用欺诈证明：rollup 合约跟踪其状态根的整个历史和每个批的哈希。如果有人发现一个批次处理有一个不正确的后状态根，他们可以向链上发布一个证明，证明批处理计算错误。合约将验证证明，并恢复该批次和之后的所有批次。

  

ZK rollup, 使用有效性证明:每个批包含一个称为 ZK-SNARK 的加密证明 (例如，使用 PLONK 协议)，证明后状态根是执行批次处理的正确结果。无论计算量有多大，证明都可以在链上快速验证。

  

这两种类型的 rollup 之间存在复杂的权衡:

  

**总的来说，我的观点是在短期内，Optimistic rollup 有机会赢得多用途的 EVM 计算，ZKrollup 则有望在简单支付层面、交易平台以及其他特定于应用程序的用例上更胜一筹。不过在中长期来看，ZK rollup 会随着 ZK-SNARK 技术的改进，在所有用例中胜出。**

#### 剖析欺诈证明

optimistic rollup 的安全性取决于是否有人将无效的批处理发布到 rollup 中，任何跟踪该链并发现欺诈的人都可以发布欺诈证明，向合同证明该批产品是无效的，应该恢复。

声称批次无效的欺诈证明将包含绿色的数据：批处理本身 (可以根据存储在链上的哈希值进行检查) 和 Merkle 树的部分只需要证明批处理读取和/或修改的特定帐户。

黄色树中的节点可以由绿色节点重构，因此不需要提供（数据）。这些数据足以执行批处理和计算后状态根 (注意，这与无状态客户端验证单个块的方式完全相同)。如果在批处理中计算的后状态根和提供的后状态根不相同，则批次处理是欺诈的。

可以保证，如果一个批次被错误地构建，并且所有以前的批次都被正确地构建，然后，就有可能创建一个欺诈证明，显示批次构造是不正确的。注意关于以前批次的声明:如果有多个无效批次发布到 rollup 中，那么最好尝试证明最早的一个无效。当然，如果一个批次处理被正确地构建出来，那么就永远不可能创建一个证明该批次处理无效的欺诈证据。

  

#### 压缩是如何工作的?

一个简单的以太坊交易 (发送 ETH) 需要大约 110 字节。然而，在 rollup 上的一次 ETH 传输只需要大约 12 个字节:

  
  

部分原因是更高级的编码:以太坊的 RLP 在每个值的长度上浪费了 1 个字节。但也有一些非常聪明的压缩技巧正在进行:

Nonce：防止重播。如果一个帐户的当前 nonce 是 5，那么该帐户的下一个事务必须有 nonce 5，但是一旦事务被处理，帐户中的 nonce 将增加到 6，因此该事务不能再次处理。在 rollup 中，我们可以完全忽略 nonce，因为我们只是从 pre-state 恢复 nonce;如果有人试图用一个较早的 nonce 重放事务，签名将无法验证，因为签名将根据包含新的更高 nonce 的数据进行检查

gas 价格：我们可以允许用户在固定的 gas 价格范围内付款，例如，进行 2 的 16 次方。或者，我们可以在每个批次中设置一个固定的费用水平，或者甚至将 gas 支付完全转移到 rollup 协议之外，让事务处理人员通过一个通道向批次创建人员支付。

gas：类似地，我们可以把 gas 总量写成 2 的次方。或者，我们可以只在批次设定 gas 限制。

To：我们可以用一个索引代替 20 字节的地址。如果一个地址是添加到树中的 4527 地址，我们只需使用索引 4527 来引用它。我们将向状态添加一个子树来存储索引到地址的映射)。

价值: 我们可以用科学计数法来储存价值。在大多数情况下，传输只需要 1-3 位有效数字

Signature: 我们可以使用 BLS 聚合签名，它允许将许多签名聚合成一个单个~32-96 字节 (取决于协议) 的签名。然后可以一次针对批处理中的整个消息集和发送者检查此签名。表中的~0.5 表示一个聚合中可以包含多少个签名是有限制的，因为需要在单个欺诈证明中验证签名。

ZK rollup 特有的一个重要压缩技巧是，如果事务的一部分仅用于验证，而与计算状态更新无关，那么可以将该部分留在链外。这个 optimistic rollup 是不能达成的，因为这些数据仍然需要包含在链上，以备日后需要在欺诈证明中进行检查，而在 ZK rollup 中，证明批次正确性的 SNARK 已经证明提供了任何验证所需的数据。

一个重要的例子是保护隐私的 ollps 总:在 optimistic rollup 中，用于每个事务的隐私的约 500 字节的 ZK- snark 需要放在链上，而在 ZK rollup 中，覆盖整个批处理的 ZK- snark 已经毫无疑问地表明「内部的」ZK- snark 是有效的。

这些压缩技巧是 rollup 可扩展性的关键;如果没有它们，rollup 可能只会在基本链的可扩展性上提高约 10 倍 (尽管有一些计算量很大的应用程序，其中甚至简单的 rollup 也很强大)，而使用压缩技巧，几乎所有应用程序的缩放系数都可以超过 100 倍。

#### 谁可以提交批次交易审核？

关于 optimistic 或者 ZK rollup 中谁可以提交批次交易的观点有很多。一般来说，每个人都同意，为了能够提交一批，用户必须提交一大笔存款。如果用户曾经提交了一个欺诈性的批次交易 (例如，无效的状态根)，那笔存款将一部分烧掉，一部分作为对欺诈证明者的奖励。但除了这种方法之外，还有很多可能性:

完全无秩序方式：任何人都可以在任何时候提交批次交易。这是最简单的方法，但它有一些很严重缺点。特别是，存在一种风险：即多个参与者将生成并尝试一起提交批次交易，而这些批次交易中只有一个可以被成功处理。这导致大量的精力浪费在生成证明上，且也会因为需要将批次交易上链而导致浪费 gas。

中心化的排序者（Sequencer）：有一个单独的参与者：排序者。他可以提交批次交易 (提款除外：通常的技术是，用户可以首先提交一个提款请求，然后如果排序者在下一批中不处理该提款请求，那么用户可以自己提交一个单操作批次处理）。这是最「有效」的，但它依赖于一个中心化的角色来维持运作。

排序者拍卖：举行拍卖决定谁有权成为（比如第二天）的排序者，这种技术的优点是它筹集的资金可以由比如 rollup 控制的 DAO 分配 (参见:MEV 拍卖)

从 PoS 集中随机选择：任何人都可以将 ETH(或者 rollup 自己的协议代币) 存入 rollup 合约，每个批的排序者都是从一个存款人中随机选择的，被选中的概率与存入的金额成比例。这种技术的主要缺点是它会导致大量不必要的资本锁定。

DPoS 投票：有一个单独的排序者通过拍卖被选中，但如果他们表现不佳，代币持有者可以投票将他们踢出去，并举行新的拍卖来取代他们

#### 分摊批次处理和状态根供应

目前正在开发的一些 rollup 使用的是「分摊批次处理」方式，其中提交一批 Layer 2 事务的操作和提交状态根的操作是分开进行的。这种方式有一些关键的优点:

您可以允许许多排序者并行发布批次交易，以提高审查阻力，而不用担心一些批次会因为其他批次被先包含进去而失效。

如果一个状态根是存在欺诈行为的，您不需要恢复整个批次，您可以只恢复状态根就行了，并等待某人为同一个批次处理提供一个新的状态根。这为事务发送方提供了更好的保证，确保他们的事务不会被还原。

因此，总而言之，有一个相当复杂的技术园，试图在复杂的权衡之间取得平衡，包括效率、简单性、抵制审查和其他目标。现在说哪种组合最有效还为时过早;时间会告诉我们。

### rollup 能给你多大的可扩展性空间？

在现有的以太坊链上，gas 的上限是 1250 万，交易中的每字节数据花费 16 gas。这意味着，如果一个块只包含单个批次 (我们说使用了 ZK rollup，在证明验证上花费了 500k gas)，那么该批次 (1200 万/ 16)= 750000 字节的数据。

如上所示，对于每个用户操作来说，ETH 转账的汇总只需要 12 个字节，这意味着批次处理最多可以包含 62500 个事务。在平均区块时间为 13 秒时，这意味着大约 4807 TPS(相比之下，直接在以太坊本身上进行 ETH 转账的 TPS 为 1250 万/ 21000 / 13 ~= 45 TPS)。

下面是其他一些用例的图表:

> 最大可扩展性增益计算为 (L1 gas cost) / (rollup 字节数\* 16)\* 1200 万/ 1250 万。

现在，值得记住的是这些数据过于乐观，原因有几个。最重要的是，一个区块几乎永远不会只包含一个批次，至少会有多个 rollup。其次，存取款将继续一直会发生。第三，短期内使用率会很低，因此固定成本将占主导地位。但即使考虑到这些因素，超过 100 倍的可扩展性也有望成为标准。

现在，如果我们想要超过 1000-4000 TPS(取决于具体的用例)，该怎么办? 这就是 eth2 数据分片的切入点。分片方案每 12 秒就会开放 16mb 的空间，可以填充任何数据，并且系统保证对数据的可用性达成一致。此数据空间可用于 rollup。这个约 1398k 字节/秒比现有以太坊链的约 60kb /秒提高了 23 倍，从长远来看，数据容量预计还会进一步增长。因此，使用 eth2 分片数据的 rollup 最多可以处理 100k TPS，将来甚至更多。

### 在 rollup 中还有哪些尚未完全解决的挑战?

虽然 rollup 现在是可以易于理解的基本概念了, 我们非常确信他们本质上是可行和安全的, 多个 rollup 方案已经部署到主网，但 rollup 设计仍有许多地区还没有很好地开发, 如果要完全把大部分以太坊生态系统迁移到 rollup 以利用他们的可扩展性，还是存在不小的挑战的。

一些关键的挑战包括:

用户和生态系统的适应：很少有应用程序使用 rollup，用户对 rollup 并不熟悉，很少有钱包开始集成 rollup。商户和慈善机构还不接受这种方式的付款。

跨 Rollup 交易：有效地移动资产和数据 (例如通过预言机输出) 从一个 rollup 到另一个 rollup，而不需要经过基础层。

  

审计激励机制：如何最大限度地提高至少一个诚实节点实际将完全验证 optimistic rollup 的可能性，以便在出现问题时发布欺诈证明? 对于小规模的 rollup(多达几百个 TPS)，这不是一个重要的问题，人们可以简单地依赖利他主义，但对于大规模 rollup，还是需要更明确的推理。

探索 Plasma 和 Rollup 之间的设计空间：有没有技术可以把一些，但不是全部的与状态更新相关的数据放到链上，从中能得出什么有用的结论吗？

最大化预确认的安全性：许多 rollup 为更快的用户体验提供了「预确认」的概念，其中排序者立即提供了一个承诺，即交易将包含在下一批中，而如果他们违背他们的诺言，排序者存款将被销毁。但是这个计划的经济安全性是有限的，因为有可能在同一时间对很多参与者做出很多承诺。这种机制还能改进吗?

  

提高对缺席的排序者的响应速度：如果一个 rollup 的排序者突然脱机，那么遇到这种情况的时候，最大程度地快速和低价地恢复排序者作用是十分有价值的，方法要么就是快速和廉价地大量退出到一个不同的 rollup，要么就是赶紧换一个排序者。

  

高效的 zk：生成一个 ZK-SNARK 证明，证明通用 EVM 代码 (或现有智能合约可以编译到的某些不同 VM) 已正确执行，并具有给定的结果。

### 结论

Rollup 是一个强大的新的 Layer 2 扩展范例，预计在短期和中期 (也可能是长期) 将成为以太坊扩展的基石。他们已经看到了以太坊社区对于这件事的巨大兴趣，与之前的 Layer2 扩展尝试不同，他们可以支持通用 EVM 代码，允许现有的应用程序轻松迁移。为了做到这一点，他们做出了一个关键的妥协:不尝试完全脱离链，而是把每个交易的少量数据留在链上。

有很多种 Rollup，在设计领域也有很多选择：比如使用 optimistic rollup 的欺诈证明，或者使用 ZK rollup 的有效性证明 (也就是 ZK-SNARKs)。排序者 (可以向链发布交易批次的用户) 可以是一个中心化的参与者，也可以是一个自由参与者，或者是介于两者之间的许多其他选择。Rollup 仍然是一项早期技术，开发仍在快速进行中，但它们确实有效，其中一些 (特别是 Loopring、ZKSync 和 DeversiFi) 已经运行了几个月。在未来的几年里，Rollup 空间将会出现更多令人兴奋的工作。

---

*Originally published on [mikeweiyi4](https://paragraph.com/@mikeweiyi4/v-rollup)*
