以太坊扩容2:Optimistic Rollup和ZK Rollup的工作原理

本文深入探讨了Layer2解决方案与独立链的主要区别,重点在于数据可用性(DA)。Layer2依赖以太坊控制DA,安全性由以太坊保障,但牺牲了可扩展性。文章详细对比了Optimistic Rollup和ZK Rollup两种主流Layer2方案,包括其工作原理、特性及优缺点,并分析了它们在实际应用中的差异与市场表现,为理解Layer2技术提供了全面的视角。

Layer 2 解决方案和独立链之间的主要区别在于数据可用性 (DA)。在 Layer 2 中,DA 由 Ethereum 控制,而 Layer 2 仅负责计算。这意味着用户数据的安全性完全由 Ethereum 保证,而 Layer 2 仅仅充当工具,不能恶意行事。最多,它可能会让你感到恼火,例如,不将你的交易包含在区块中(审查)。

然而,让 Ethereum 控制数据可用性 (DA) 也有其缺点。最大的问题是,它的可扩展性远不如独立链。Ethereum 的每秒交易数 (tps) 无法与独立链相媲美,而且与独立链相比,gas 费用也更高。毕竟,Layer 2 需要将交易打包到 Ethereum 网络上,这既消耗时间又消耗 gas。

除此之外,Layer 2 机制与独立链有许多相似之处。例如,Optimistic Rollup 类似于 Plasma,而 ZK Rollup 类似于 Validium。

主流的 Layer 2 解决方案如下:

  • Optimistic Rollup:这是 Plasma 的 Layer 2 版本。Optimistic Rollup 采用欺诈证明机制。
  • ZK Rollup:这是 Validium 的 Layer 2 版本。ZK Rollup 利用 zkSNARK 或 zkSTARK 算法。

Optimistic Rollup

Optimistic Rollup 继承了 Plasma 的欺诈证明机制,以确保数据的有效性。其基本思想是乐观地接受 operator 提交到 Ethereum 上的结果,然后等待第三方提交挑战。

工作原理

参考下图,可以描述 Optimistic Rollup (op rollup) 的工作原理:

https://medium.com/ethereum-optimism/ovm-deep-dive-a300d1085f52

如你所见,总体方法与 Plasma 类似:

  1. Op Rollup 定期将交易数据和状态根提交给 Ethereum。
  2. Optimistic:Ethereum 最初乐观地接受 operator 的提交,将交易数据和状态根放在链上。
  3. 欺诈证明:存在一个窗口期(挑战期),通常约为 7 天,在此期间,第三方可以提交欺诈证明并验证潜在的欺诈行为。
  4. 激励机制:奖励和惩罚根据挑战的结果来确定。

op rollup 和 Plasma 之间的比较如下:

此外,Optimistic Rollup (op rollup) 具有一些值得注意的特性:

  1. 权益证明 (PoS) 机制:operator(验证者)的选择通常采用 PoS 机制,这有助于激励机制的实施。但是,也可能存在完全中心化的 operator。

  2. 数据压缩:Operator 需要将所有交易数据打包并提交给 Ethereum。为了节省存储空间,采用了数据压缩技术。这里有一个很好的例子,演示了如何解码 op rollup 提交给 Ethereum 的数据。

  3. OVM (Optimistic Virtual Machine):如果发生欺诈,需要在 Ethereum 上重新执行相应的 layer2 交易。Op rollup 包含一个 OVM(在 Optimism 中称为 OVM,在 Arbitrum 中称为 AVM),作为 Ethereum 上的嵌入式合约,它模拟 layer2 环境并重新执行相应的交易。在这里,你可以找到 OVM 如何工作的详细解释。

  4. 挑战次数:当发生欺诈时,挑战者和断言者之间可能存在多轮交互,通常涉及两种策略:

    (1). 单轮:这代表 Optimism 产品。它涉及单轮交互,挑战者发出挑战,OVM 重新执行交易以确定最终结果。这个过程相对简单,但成本较高。OVM 需要重新执行交易,要求挑战者向 Layer 1 Ethereum 提供额外数据,这会增加链上数据并产生相应的 gas 费用。

    (2). 多轮:这代表 Arbitrum 产品。核心思想是将交易的执行分成多个步骤,并找到最小的可执行步骤。过程如下:

    • 挑战者对特定交易发起挑战。
    • 断言者(被挑战者)使用二分法协议分割交易,并等待挑战者继续。
    • 挑战者挑战有问题的部分。
    • 断言者进一步将步骤细分为两半,并等待挑战者挑战有问题的部分。此过程持续进行,直到挑战者确定最小的有问题的步骤。
    • 在 Layer 1 上重新执行最小的步骤。
    • 挑战结束。

    重要的是要注意,整个多轮挑战过程发生在 Layer 2 (l2) 上,而 Layer 1 (l1) 负责验证挑战的有效性,并且仅重新执行最小的挑战单元。考虑到 Layer 2 在 gas 费用和执行速度方面比 Layer 1 Ethereum 表现更好,因此在成本和执行效率方面,多轮交互优于单轮交互。这减轻了 Layer 1 的负担,并提高了整体成本效益和执行效率。

  5. 流动性提供者 (LP):引入一个解决方案来解决流动性提供者提款时间慢的问题。LP 充当中间人,用户可以将正在提款的资产转移到 LP。一旦 LP 确认资产的非争议性,他们会直接向用户提供资金,并收取一定的费用。然后,LP 处理特定的挑战过程。

Optimistic Rollup 总结

  • 使用经济模型防止不当行为。采用欺诈证明机制,layer 1 上的区块确认(最终确定)并具有 7 天的挑战期。
  • 提款速度慢,需要等待 7 天。
  • 流动性提供者 (LP) 可以有效地解决提款速度慢的问题。
  • 支持智能合约。
  • Ethereum 控制数据可用性 (DA)。
  • Optimistic rollup 流程简单,用户接受度高,目前在总锁定价值 (TVL) 方面高于 zk rollup。

ZK Rollup

Zk rollup 采用 zkSNARK 或 zkSTARK 数学算法来确保数据的安全性,这与依赖经济模型来保证安全的 optimistic rollup 不同。zk rollup 更高效、更安全,但它对技术和硬件的要求更高,这使得 operator 不太愿意参与。

工作原理

ZK 算法

zk 算法是整个 zk rollup 的核心,并且非常复杂。以 zk-SNARK 为例,可以简要描述算法的核心思想如下:

  1. 验证者和证明者

在 zk-SNARK 算法中,如下图所示,有两个角色:

https://medium.com/@kotsbtechcdac/introduction-to-zero-knowledge-proof-the-protocol-of-next-generation-blockchain-305b2fc7f8e5

1). 证明者:向验证者提交证明以证明其有效性。

2). 验证者:验证证明的有效性。

Vitalik 在这里写了一篇精彩的文章:( https://medium.com/@VitalikButerin/quadratic-arithmetic-programs-from-zero-to-hero-f6d558cea649)

我们将引用他的示例。整个 zk-proof 过程如下:

1). 有一个公式 f(x) = x³ + x + 5。

2). 证明者想要证明两个结论:

结论 1:证明者声称当输入 x 为 3 时,f(x) 等于 35。

结论 2:证明者已执行完整的计算。

3). 证明者将证明提交给验证者。

4). 验证者通过证明验证证明者的诚实性。

2. 约束和多项式

重要的是要注意证明者想要证明什么:

结论 1:证明者声称当输入 x 为 3 时,f(x) 等于 35。 结论 2:证明者执行了完整的计算过程。

让我们看看如何证明这两个结论:

  • 结论 1,证明者声称当输入 x 为 3 时,f(x) 等于 35。

这个结论似乎比较容易证明。验证者可以直接将提供的值 x=3 代入公式并进行计算。这是可能的,因为正在使用一个简单的公式。但是,如果计算非常耗时,假设计算一次需要 10 分钟,那么验证者重新计算它的成本将会非常高。验证者可以在不重新执行计算的情况下验证计算结果。 这是一个必要的条件,因为在计算领域,它属于 NP 问题,其中只验证结果而不解决它。

在实际的 zk-rollup 场景中,证明者负责交易执行,而验证者不重新执行交易进行验证。在这种情况下,需要通过结论 2 来证明结论 1。

  • 结论 2,证明者执行了完整的计算过程。

这个结论的目的是推断结论 1。现在,想想如何在不重新计算的情况下证明一个结果是正确的。证明者这里采取的方法是将方程分解为单独的小步骤,其中每个步骤都称为约束。有四个约束如下:

sym_1 = x * x
y = sym_1 * x
sym_2 = y + x
out = sym_2 + 5

然后,证明者将来自每个小步骤的输入和生成的值(x、sym_1、y、sym_2、out)作为证明交给验证者。这些值是方程的中间值,这意味着如果(x、sym_1、y、sym_2)是正确的,那么 out 也一定是正确的。

验证者可以得出结论:

1). 证明者肯定执行了完整的计算过程。否则,就不会有正确的中间值。

2). 当 x=3 时,f(x)=35 是正确的,因为所有的中间值都是正确的。

你一定在想,如果我们验证所有的中间值,那不就相当于验证者重新执行逻辑了吗?没错,但这里让我们假设有一种方法可以在不执行计算的情况下验证中间值。在这种情况下,上述逻辑成立:如果输入和中间值是正确的,那么结果是正确的。原因是它们满足约束。

约束等同于关系描述。例如,约束“sym_1 = x * x”描述了 sym_1 和 x 之间必须保持的关系。

例如,有人让你猜一种动物,并给你一些约束:

  • 它嘎嘎叫。
  • 它是一种家禽。
  • 它可以游泳。

基于这些约束,你很可能会猜到它是一只鸭子。它也可能是一只鹅,因为约束不是很具体,而且有些鹅也会嘎嘎叫。

回到主题,约束描述了输入和输出之间的关系。zk-SNARK 算法的核心本质如下:证明者提供一个三元组(输入、输出、中间值)作为证明,验证者根据约束验证输出的正确性。

下一个问题是如何验证中间值。自然地,执行每个中间值是不可行的,因为它相当于验证者重新执行公式。因此,数学家们引入了一个技巧,可以简单地解释为将多个约束组合成一个最终约束。通过执行这个约束,可以在一个步骤中完成验证。一般过程如下:

1). R1CS(Rank-1 Constraint System):将多个约束组织成一个方程组,然后将其转换为向量运算。

2). QAP(Quadratic Arithmetic Program):使用多点值插值,将向量运算转换为多项式方程。

这样,上述四个算术运算最终将被转换为一个多项式方程。你可以在这里尝试 ( https://asecuritysite.com/encryption/go_qap)。这实现了将多个约束组合成一个约束的目标。

引入多项式方程作为最终约束有两个优点:

  • 通过执行一次计算,可以验证所有的中间值和结果。
  • 不同的多项式方程可能存在显著的差异。即使系数发生细微的变化,也会导致曲线形式发生巨大的变化。这降低了冲突的可能性,意味着多项式 A 的解不会巧合地成为多项式 B 的解。

以上是 SNARK 算法的基本原理。但是,由于篇幅有限,还有许多细节没有描述,例如引入 PCP(Probabilistically Checkable Proof) 随机抽样。这意味着不需要执行所有的约束;而是随机验证一些约束来检查它们是否满足条件。例如,在 zk-SNARK 的情况下,真实数据通过同态加密(例如椭圆曲线配对)隐藏,这会将计算域从数字字段转换为椭圆曲线。

有关该算法的更多详细信息,你可以参考资源“Why and How zk-SNARK Works: Definitive Explanation”。 https://arxiv.org/pdf/1906.07221.pdf

3. 电路

电路也是 zk-SNARK 算法的一个具有挑战性的方面。为什么我们需要使用电路?

在前面的例子中,我们演示了如何证明一个公式,但是程序员处理的是代码,因此他们需要将代码转换为公式。事实上,所有的算法都可以用数学公式来编写,那些熟悉函数式编程的人对这个概念有更深入的理解。

例如,有一段代码:

def qeval(x):
    y = x**3
    return x + y + 5

转换为数学公式为 f(x) = x³ + x + 5。

要执行 zk-SNARK 证明,还需要进一步转换为生成中间值的公式。

sym_1 = x * x
y = sym_1 * x
sym_2 = y + x
out = sym_2 + 5

仔细观察,转换后的结果实际上由简单的加法和乘法运算组成,与数字电路中的加法和乘法门完美对应。

因此,可以跳过编写初始代码,直接使用电路来表达逻辑。因此,出现了这样的代码(这里是一个完整的 circom 示例):

    //__1. verify sender account existence
    component senderLeaf = HashedLeaf();
    senderLeaf.pubkey[0] <== tx_sender_pubkey[0];
    senderLeaf.balance <== account_balance;

    component senderExistence = GetMerkleRoot(levels);
    senderExistence.leaf <== senderLeaf.out;
    for (var i=0; i<levels; i++) {
        senderExistence.path_index[i] <== tx_sender_path_idx[i];
        senderExistence.path_elements[i] <== tx_sender_path_element[i];
    }
    senderExistence.out === account_root;

    //__2. verify signature
    component msgHasher = MessageHash(5);
    msgHasher.ins[0] <== tx_sender_pubkey[0];
    msgHasher.ins[1] <== tx_sender_pubkey[1];

    component sigVerifier = EdDSAMiMCSpongeVerifier();
    sigVerifier.enabled <== 1;
    sigVerifier.Ax <== tx_sender_pubkey[0];
    sigVerifier.Ay <== tx_sender_pubkey[1];

    //__3. Check the root of new tree is equivalent
    component newAccLeaf = HashedLeaf();
    newAccLeaf.pubkey[0] <== tx_sender_pubkey[0];

的确,这是一个使用电路实现的常见交易执行逻辑。

因此,在 zk rollup 中,使用电路的目的是将逻辑分解为单独的中间步骤,这个过程称为扁平化。这样做是为了生成约束和中间值。最终,它被转换成一个多项式表达式来参与 zk 计算。

4. ZK 算法总结

总而言之,zk-SNARK 算法的过程如下:

1). 将代码转换为电路(约束)以生成中间值(trace)。

2). 将约束转换为多项式以进行证明验证。

3). 证明者运行电路代码以生成证明,其中包括输入、输出和中间值。

4). 验证者利用多项式来验证证明。

这样,验证者就可以在不重新执行计算的情况下验证输出的正确性。当与加密算法结合使用时,即使某些输入或中间值被隐藏,也可以验证输出的正确性。

结合 circom 工具,我们使用以上描述来对应一个真实的 zk rollup layer2 开发过程。

请注意,L1 上的智能合约中的约束对应于 L2 上的电路。换句话说,如果修改了 L2 上的电路,则无法通过 L1 上的验证。现在,让我们考虑以下情况:在 zk rollup 中,operator 可以窃取我的token吗?例如,如果 Alice 将 10 ETH 转账给 Bob, operator 可以将其更改为 5 ETH 吗?

答案显然是否定的,因为 Alice 的交易将用作 zk 算法的输入。如果它被篡改,签名验证电路将无法通过。即使 operator 篡改了电路,电路逻辑也将与部署在 lay1 上的智能合约不同,因此自然无法通过验证。

使用电路实现复杂的逻辑(尤其是区块链交易逻辑)时,其复杂性会变得非常明显。此外,它需要记录大量的中间值(通常称为 traces 或 witnesses),这显然会消耗资源。因此,当前 zk 算法存在两个常见问题也就不足为奇了:

1). 硬件要求高。

2). 难以进行通用计算,这意味着它很容易支持简单的转账交易,但很难支持通用的 EVM(Ethereum Virtual Machine)功能。但是,各种 zkEVM(Zero-Knowledge Ethereum Virtual Machine)解决方案已经出现,正在逐步解决这个问题。

ZK Rollup 过程

一旦你理解了 zk 算法,zk rollup 的过程就变得容易掌握了。让我们将其与 Optimism 进行比较。

https://trapdoortech.medium.com/l2-deep-dive-into-ovm-e2229052ed00

在过程方面,很明显 zk 和 op 的主要区别在于它们的证明方法。Op 使用 OVM 来处理挑战,而 zk 采用 zk 证明。zk rollup 过程如下:

1). ZK rollup 定期将交易数据和状态根提交给 Ethereum 网络。

2). 有效性证明:Layer 2 提交 zk 证明,Ethereum Layer 1 使用算法验证交易执行结果的正确性。

ZK Rollup 总结

  • 通过算法确认交易有效性,无需信任。
  • 提款速度快,最终确定大约需要 10 分钟,这主要是由于生成证明的过程非常耗时。
  • 最初,支持智能合约具有挑战性,但是这个问题正在逐步得到解决。
  • 存在很高的技术和硬件壁垒。

ZKR 和 OPR 的比较

简要比较如下:

总的来说,zk rollup (zkr) 和 optimistic rollup (opr) 之间很难确定优劣。虽然 zk rollup 似乎具有架构优势,但 opr rollup 目前在总锁定价值 (TVL) 方面处于领先地位,这主要是由于以下原因:

1). Zk rollup 在理论上更安全,但也更复杂,导致用户接受度低于 opr rollup。

2). 虽然 opr rollup 的资产提款时间较长,但流动性提供者 (LP) 的参与对普通用户的影响很小。

3). Opr rollup 对 Ethereum Virtual Machine (EVM) 有很好的支持,并且对 DApp 更加友好,而 zk rollup 在支持方面面临挑战。尽管最近出现了几种 zkEVM 解决方案,但它们尚未被广泛接受。

4). Opr rollup 采用经济模型,而 zk rollup 遵循算法模型。尽管算法模型更安全,但其市场表现不一定超过经济模型。经济模型在生态系统内具有优势。

5). 在 gas 费用方面,如果区块中的交易较少,则 zk rollup 的 gas 费用较高,因为它需要额外的计算来生成证明,这与 opr rollup 不同。但是,在交易量较高的情况下,zk rollup 是否具有优势不一定,这取决于存储在链上的数据。通常,opr rollup 在链上包含所有交易数据,这可能会给人留下 opr rollup 交易费用较高的印象。然而,现实情况并非如此。例如,Polygon zkEVM 在链上包含所有交易数据,而 zkSync 和 Starknet 仅包含部分数据。包含所有链上数据并不能提供优于 opr rollup 的优势,虽然包含部分数据与 opr rollup 相比降低了 gas 费用,但它因数据可用性 (DA) 问题而受到批评。

  • 原文链接: medium.com/@geraldlee082...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
geraldlee0825
geraldlee0825
江湖只有他的大名,没有他的介绍。