深度解析 zkEVM:工作原理、构建难度、重要性以及开发进展等

Alchemy
2022年12月5日 16:05
收藏
不同的zkEVM项目采用不同的方法将EVM执行与零知识证明计算相结合,每种方法都有独特的权衡。

原文标题:《zkEVM 知识问答 --Alchemy

原文来源: Alchemy

 

零知识以太坊虚拟机(zkEVM)是一种生成零知识证明来验证程序正确性的虚拟机。ZkEVM 旨在以支持零知识技术的方式执行智能合约。 

ZkEVM 是零知识 (ZK) 汇总的一部分,这是以太坊第 2 层扩展解决方案,通过将计算和状态存储转移到链下来提高吞吐量。ZK-rollup 向以太坊提交交易数据以及验证链下交易批次有效性的零知识证明。 

早期的 ZK-rollup 缺乏执行智能合约的能力,并且受限于简单的Token交换和支付。但是,随着与 EVM 兼容的零知识虚拟机的引入,ZK-rollups 开始支持以太坊 dApp。

在本文中,我们将探讨 zkEVM 的工作原理、重要性以及存在哪些类型的 zkEVM。 

 

什么是 zkEVM?

 

zkEVM 是与 EVM 兼容的虚拟机,支持零知识证明计算。与常规虚拟机不同,zkEVM 证明程序执行的正确性,包括操作中使用的输入和输出的有效性。 

我们将进一步分解此定义以使其更易于理解:

EVM 兼容性 

EVM(以太坊虚拟机)是执行部署在以太坊网络上的智能合约的运行时环境。EVM 充当「世界计算机」,为运行在以太坊区块链上的去中心化应用程序 (dApps) 提供动力。 

如果虚拟机可以运行为在 EVM 环境中运行而创建的程序,则它是「与 EVM 兼容的」。这样的虚拟机可以执行用 Solidity 或以太坊开发中使用的其他高级语言编写的智能合约。ZkEVM 与 EVM 兼容,因为它们无需对底层逻辑进行大量修改即可执行以太坊智能合约。

支持零知识技术 

EVM 从未设计为支持零知识证明,这使得构建与 EVM 兼容、对零知识友好的虚拟机变得困难。然而,研究的进步在某种程度上使得将 EVM 计算包装在零知识证明中成为可能。

不同的 zkEVM 项目采用不同的方法将 EVM 执行与零知识证明计算相结合。每种方法都有独特的权衡,我们将在本指南的后面部分进行探讨。 

 

zkEVM 是如何工作的?

 

与 EVM 一样,zkEVM 是一个虚拟机,它通过程序操作在状态之间转换。但是 zkEVM 更进一步,通过生成证明来证明计算的每个部分的正确性。本质上,zkEVM 使用一种机制来证明执行步骤(如前所述)遵循规则。 

要了解 zkEVM 的工作原理(以及它为何不同),让我们回顾一下 EVM 当前的工作原理。 

EVM 的工作原理

以太坊虚拟机是一种状态机,它响应一些输入而从旧状态移动到新状态。每个智能合约执行都会触发 EVM 状态的变化(称为「状态转换」)。以下是智能合约交易期间发生的情况的高级概述:

1. 合约字节码(从源代码编译而来)从 EVM 的存储中加载,并由 EVM 上的点对点节点执行。节点使用相同的交易输入,这保证了每个节点都达到相同的结果(否则它们无法达成共识)。 

2. EVM 操作码(包含在字节码中)与 EVM 状态的不同部分(内存、存储和堆栈)交互。操作码执行读写操作——从状态存储读取(获取)值并将新值写入(发送)到 EVM 的存储。 

3. EVM 操作码在返回新值之前对从状态存储中获得的值执行计算。此更新导致 EVM 转换到新状态(因此,事务被称为「状态转换」)。这个新状态被其他节点复制并保持到另一个事务被执行。 

image.png

显示程序如何在以太坊虚拟机 (EVM) 中执行的图表。[来源]

 

zkEVM 的工作原理 

 

zkEVM 生成零知识证明来验证每次计算中的各种元素:

1. 字节码访问:是否从正确的地址正确加载了适当的程序代码? 

2. 读写操作:程序是否在计算之前从堆栈/内存/存储中获取了正确的值?湾。程序在完成执行后是否将正确的输出值写入堆栈/内存/存储? 

3. 计算:操作码是否正确执行(即一个接一个,没有跳过步骤)? 

zkEVM 的架构

zkEVM 分为三个部分:执行环境、证明电路和验证者合约。每个组件都有助于 zkEVM 的程序执行、证明生成和证明验证。 

1. 执行环境 

顾名思义,执行环境是在 zkEVM 中运行程序(智能合约)的地方。zkEVM 的执行环境功能与 EVM 非常相似:它采用初始状态和当前事务来输出新的(最终)状态。

2. 验证电路 

证明电路产生零知识证明来验证在执行环境中计算的交易的有效性。使用前状态、交易输入和后状态信息作为输入来完成证明生成过程。之后,证明者获得该特定状态转换有效性的简洁证明。 

image.png

显示 zkEVM 如何为程序生成有效性证明的图表。[来源]

3. 验证者合约 

ZK-rollups 将有效性证明提交给部署在 L1 链(以太坊)上的智能合约进行验证。输入(预状态和交易信息)和输出(最终状态)也提交给验证者合约。然后验证者在提供的证明上运行计算,并确认提交的输出是根据输入正确计算的。 

 

什么是 zkEVM 操作码?

 

ZkEVM 操作码是用于在与 EVM 兼容的 ZK-rollup 中执行程序的低级机器指令。与 EVM 一样,用高级语言编写的合约必须编译为 VM 可以解释的低级语言(字节码)。该字节码指定了在 VM 中部署程序时用于执行程序的操作码。

我们需要 zkEVM 操作码,因为常规的 EVM 操作码在零知识证明电路中的使用效率很低。通常有两种方法可以为 zkEVM 创建操作码:

为原生 EVM 操作码构建 ZK 电路

为 ZK 证明计算创建新语言

为原生 EVM 操作码构建零知识电路 

这种方法需要在算术电路中实现所有 EVM 指令集——这是一项复杂且耗时的任务。好处是开发人员可以使用现有的区块链开发工具创建智能合约,或将现有的以太坊合约移植到 ZK-rollups,而无需进行大量修改。  

 

为 ZK 证明计算创建新语言

 

这种方法需要构建一种新语言——旨在支持有效性证明——并开发自定义操作码。开发人员需要直接用新语言编写合约,或者将 Solidity 源代码编译为自定义 zkEVM 操作码。 

虽然这种方法通常比第一种方法更容易实现,但它也有缺点。例如,开发人员可能无法访问现有的以太坊基础设施和资源。 

image.png

根据 EVM 兼容性分类的零知识虚拟机。[来源]

 

是什么让构建 zkEVM 变得困难?

 

由于 EVM 在构建时并未考虑 zk-proof 计算,因此它具有对证明电路不友好的特性。下面简要概述了使构建 zkEVM 变得困难的四件事:

特殊的操作码

基于堆栈的架构

存储开销

证明成本

1. 特殊的操作码 

与常规 VM 不同,EVM 使用特殊的操作码来执行程序(CALL、DELEGATECALL)和错误处理(REVERT、INVALID)以及其他操作。这增加了为 EVM 操作设计验证电路的过程的复杂性。 

2. 基于堆栈的架构 

EVM 使用基于堆栈的架构,虽然比基于寄存器的结构更简单,但增加了计算证明的难度。这就是为什么著名的零知识 VM,例如 ZkSync 的 zkEVM 和 StarkWare 的 StarkNet 使用基于寄存器的模型。 

3. 存储开销

EVM 的存储布局依赖于 Keccak 散列函数和 Merkle Patricia Trie,两者都有很高的证明开销。一些 zkVM,比如 ZkSync,试图通过替换 KECCAK256 函数来回避这个问题——但这可能会破坏与现有以太坊工具和基础设施的兼容性。

4. 证明成本 

即使解决了上述问题,仍然需要应对证明生成过程。生成零知识证明需要专门的硬件以及大量的时间、金钱和精力投入。 

尽管并非详尽无遗,但此列表提出了一些阻碍构建与 EVM 兼容的 zkEVM 的问题。尽管如此,零知识技术的几项突破使得缓解这些问题成为可能——导致人们对 zkEVM 解决方案重新产生兴趣。 

 

为什么 zkEVM 很重要?

 

构建功能齐全的 zkEVM 将鼓励与 EVM 兼容的ZK-rollup 项目的开发。这具有几个优点:

安全的可扩展性

成本更低

更快的最终确定性和资本效率

网络效应

1. 安全的可扩展性

根据协议规则,所有验证节点必须重新执行在以太坊虚拟机中执行的所有计算。这种方法确保了安全性,因为以太坊节点可以独立验证程序的正确性,但它限制了以太坊网络只能管理约 15-20 个交易的可扩展性)。

与 EVM 兼容的 ZK-rollup 可以解决以太坊的吞吐量问题,而不会破坏网络安全。与其他扩展协议一样,ZK-rollups 不受以太坊共识协议规则的负担,并且可以优化执行速度。一些估计表明,ZK- rollups 每秒可以处理约 2000 笔交易,而不会产生以太坊的高额费用。

但是,ZK-rollups 与其他扩容项目相比具有更高的安全保障;他们用有效性证明来验证链下计算的正确性。这意味着智能合约在 L2 上执行的交易可以在 L1(以太坊)上可靠地验证,而无需节点重新执行操作。这可以在不降低安全性的情况下显着提高以太坊的处理速度。 

2. 更低的成本

Rollups 通过将交易数据作为 CALLDATA 写入以太坊来从以太坊主网获得安全性。然而,乐观汇总和零知识汇总的不同之处在于它们必须在以太坊上发布多少数据。

因为乐观汇总不提供链下交易的有效性证明,所以它们需要在链上发布所有与交易相关的数据(包括签名和交易参数)。如果不将所有数据都放在链上,挑战者就无法构建用于对无效汇总交易提出争议的欺诈证明。 

相反,ZK-rollups 可以将最少的数据发布到以太坊,因为有效性证明已经保证了状态转换的可信度。zkEVM 甚至可以省略交易输入并仅发布最终状态更改,从而进一步降低 CALLDATA 要求。 

3. 更快的确定性和资本效率 

除了更好的安全性之外,ZK-rollups 与乐观 rollups 相比还有另一个优势:更快的最终确定性。区块链中的确定性是交易变得不可逆转所需的时间;只有当网络参与者有客观证据证明其有效性时,交易才能最终确定。 

使用 ZK-rollups,在 zkEVM 中执行的交易通常在发布到以太坊后立即完成。由于每个交易批次都带有即时可验证的有效性证明,因此以太坊主链可以快速应用状态更新。 

由于乐观汇总仅在没有证明的情况下发布 VM 事务,因此必须经过质询期才能使事务达到最终确定性。挑战期是 1-2 周,在此期间,任何人都可以在交易提交到以太坊后对其进行挑战。 

较慢的最终确定性对用户体验有很多影响。例如,在延迟期到期之前,用户不能从汇总中提取资产。流动性提供者可能会解决问题,但如果提款涉及高价值资产甚至 NFT,则可能无效。 

zkEVM 没有上述问题。更快的最终确定性非常适合高级用户,例如需要无缝移动资产(尤其是在 L1 和 L2 之间)的 NFT 交易者、DeFi 投资者或套利交易者。 

4. 网络效应

构建与 EVM 兼容的 zkVM 的最重要原因是利用以太坊的网络效应。作为全球最大的智能合约平台,以太坊拥有庞大的生态系统,为开发者和项目提供价值。 

例如,开发人员可以访问经过实战测试和审计的代码库、广泛的工具、文档等。创建一个与以太坊基础设施不兼容的新 zkVM 将使项目和开发团队无法利用以太坊的网络效应。 

 

有哪些类型的 zkEVM?

 

当前的 zkEVM 项目分为两大类:支持原生 EVM 操作码的 zkVM 和使用自定义 EVM 操作码的 zkVM。下面我们比较不同的 zkEVM 协议并解释它们是如何工作的:

Polygon zkEVM

Polygon Hermez 是一个带有零知识虚拟机的Polygon ZK-rollup,旨在支持 EVM 兼容性。为此,EVM 字节码被编译成「微操作码」并在 uVM 中执行——一个使用 SNARK 和 STARK 证明来验证程序执行正确性的虚拟机。 

结合这两种证明类型的决定具有战略意义。STARK(可扩展的透明知识论证)证明的生成速度更快,但 SNARK(简洁的非交互式知识论证)证明更小,在以太坊上验证成本更低。 

Polygon Hermez zkEVM使用 STARK 证明电路来生成状态转换的有效性证明。STARK 证明验证 STARK 证明的正确性(将其视为生成「证明的证明」)并提交给以太坊进行验证。 

zkSync zkEVM

zkSync 是一个与 EVM 兼容的 ZK-rollup,由 Matter Labs 开发并由其自己的zkEVM提供支持。ZkSync 使用以下策略实现与以太坊的兼容性:

1. 将 Solidity 编写的合约代码编译成 Yul,一种中间语言,可以编译成不同虚拟机的字节码。 

2. 将 Yul 字节码(使用 LLVM 框架)重新编译为专门为 zkSync 的 zkEVM 设计的自定义、电路兼容的字节码集。 

与 Polygon Hermez 一样,zkSync zkEVM 在语言级别而不是字节码级别实现 EVM 兼容性。例如,zkSync 的 zkEVM 不支持传统的乘法和加法操作码(ADDMOD、SMOD、MULMOD)。 

Scroll zkEVM

Scroll是一个正在开发的新的零知识 EVM 实现。Scroll 团队计划为每个 EVM 操作码设计零知识电路。这将允许开发人员在 Scroll 上部署以太坊原生智能合约 EVM,而无需修改底层 EVM 字节码。 

除此之外,Scroll zkEVM 将使用「密码累加器(cryptographic accumulator)」来验证存储的正确性。这用于证明合约字节码是从给定地址正确加载的。 

它还提供了一个将字节码与执行跟踪链接起来的电路。执行跟踪是一个序列,指定执行了哪些 VM 指令以及执行顺序。证明者将在证明生成期间提交执行跟踪,以验证计算与原始字节码是否一致。 

Applied ZKP zkEVM

Applied ZKP是由以太坊基金会资助的一个项目,旨在开发与 EVM 兼容的 ZK-rollup 以及为以太坊区块生成有效性证明的机制。最后一部分至关重要,因为将块与有效性证明配对将消除节点重新执行块的需要。 

Applied ZKP 的创新在于计算与存储的分离。它使用两种类型的有效性证明——状态证明和 EVM 证明: 

状态证明

检查涉及存储、内存和堆栈的操作是否正确发生。状态证明本质上是验证读写操作的准确性。 

EVM 证明

检查计算是否在正确的时间调用了准确的操作码。EVM 证明验证计算本身,并确认状态证明为每个操作码执行了正确的操作。 

AppliedZKP zkEVM 使用总线映射来链接状态证明和 EVM 证明。此外,在以太坊区块被视为有效之前,必须验证这两个证明。

 

我们在 zkEVM 的开发进度中处于什么位置?

 

除了 zkSync,大多数零知识 EVM 仍在开发中。然而,零知识技术的不断发展意味着功能齐全的 zkEVM 的前景比以往任何时候都好。 

链捕手ChainCatcher提醒,请广大读者理性看待区块链,切实提高风险意识,警惕各类虚拟代币发行与炒作, 站内所有内容仅系市场信息或相关方观点,不构成任何形式投资建议。如发现站内内容含敏感信息,可点击 “举报”,我们会及时处理。
ChainCatcher 与创新者共建Web3世界