首页 / 以太坊知识 / 什么是 zkEVM(零知识以太坊虚拟机)?

什么是 zkEVM(零知识以太坊虚拟机)?

前言
zkEVM 通过生成零知识证明来验证程序的正确性,它以支持零知识技术的方式执行智能合约。zkEVM 是 zk-rollups 的一部分。zk-rollups 是以太坊 L2 扩展解决方案,它通过将计算和状态存储转移到链外来提高吞吐量,并将交易数据与零知识证明一起提交给以太坊,以验证链外交易批的有效性。早期的 zk-rollups 无法执行智能合约,只被局限地应用在简单的代币交换和支付之中。随着引入 EVM 兼容的 zkVM,zk-rollups 才开始支持以太坊 dApps。

在这篇文章中,我们将探讨 zkEVM 如何工作,为什么它如此重要,以及目前有哪些类型的 zkEVM。

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

EVM 的兼容性
EVM 是一个 runtime 环境,用来执行部署在以太坊上的智能合约。EVM 的功能就好比是一台为运行在以太坊区块链上的 dApps 提供动力的 “世界计算机” 。如果一个虚拟机能够运行那些可以在 EVM 环境中运行的程序,那么它就是 “EVM 兼容” 的,这样的虚拟机可以执行那些用 Solidity 或以太坊开发中使用的其它高级语言编写的智能合约。也就是说,zkEVM 之所以 EVM 兼容,是因为它可以执行以太坊智能合约,且同时无需对底层逻辑进行大量修改。

支持零知识技术

EVM 在设计之时,并未考虑到要支持零知识证明,这使得构建 EVM 兼容的零知识友好虚拟机变得困难。不过伴随研究方面的进展,使得可以将 EVM 的计算包裹到零知识证明中。

不同的 zkEVM 项目采用不同的方法结合 EVM 的执行和零知识证明的计算。每种方法都有各自的权衡考虑,这将在后文中探讨。

zkEVM 是如何工作的 ?
与 EVM 一样,zkEVM 也是一个基于程序操作结果而在不同状态之间转换的虚拟机。但 zkEVM 更进一步,它通过产生一个证明来证明计算的每一部分是正确的。本质上,zkEVM 使用一种机制来证明执行步骤是遵循了规则的。为了理解 zkEVM 是如何工作的,让我们先回顾一下 EVM 目前是如何工作的。
EVM 如何工作
EVM 是一个状态机,它根据某些输入从旧状态转换到新状态。每个智能合约的执行都会触发 EVM 状态的变化(称为 “状态转换”)。下面是一个智能合约交易过程中所发生情况的高级概述。1. 合约字节码(由源代码编译而成)从 EVM 的存储中加载,并由 EVM 上的点对点节点执行。节点使用相同的交易输入,以保证每个节点都将得到相同的结果(否则他们无法达成共识)。2. EVM 操作码(包含在字节码中)与 EVM 状态的各个部分(内存、存储和堆栈)交互。操作码执行读写操作(read-write operations) —— 从状态存储中读取(获取)数值,并将新数值写入(发送)到 EVM 的存储中。3. EVM 操作码在返回新数值之前,会对从状态存储中获得的数值进行计算,这种更新会使 EVM 转换到一个新的状态(交易因此被称为 “状态转换”)。这个新状态被其它节点复制,直到另一个交易被执行。

如图显示了程序(智能合约)如何在 EVM 中执行


zkEVM 如何工作

zkEVM 通过生成零知识证明来验证每次计算中的各种元素。1. 字节代码访问:是否从正确的地址正确加载了适当的程序代码?2. 读写操作:    a. 在计算之前,程序是否从堆栈/内存/存储中获取了正确的值?    b. 在完成执行之后,程序是否将正确的输出值写入了堆栈/内存/存储?3. 计算:操作码是否正确执行(即一个接一个,不跳步)


zkEVM 的结构

zkEVM 分为三个部分:执行环境、证明电路和验证者合约。每部分都对 zkEVM 的程序执行、证明生成和证明验证有所贡献。

1. 执行环境

顾名思义,执行环境是程序(智能合约)在 zkEVM 中运行的地方。zkEVM 的执行环境功能很像 EVM:采取初始状态和当前交易来输出一个新的(最终的)状态。

2. 证明电路

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

3. 验证者合约

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

什么是 zkEVM 操作码?

zkEVM 操作码是用于在 EVM 兼容的 zk-rollups 中执行程序的低级机器指令。与 EVM 一样,用高级语言编写的合约必须被编译成虚拟机可以解释的低级语言(字节码),当在虚拟机中部署程序的时候,该字节码指定了执行程序时所需使用的操作码。zkEVM 操作码是非常有必要的,因为普通的 EVM 操作码在零知识证明电路中的使用效率非常低。通常有两种方法来创建 zkEVM 的操作码:

  1. 为原生 EVM 操作码建立零知识电路
  2. 为零知识证明计算创建新语言


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

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


为零知识证明计算创建新语言

这种方法需要为有效性证明开发一种新语言和自定义操作码。开发人员直接用新语言编写合约,或者将 Solidity 源代码编译为自定义的 zkEVM 操作代码。虽然这种方法通常比第一种方法更容易实现,但可能导致开发人员无法访问现有的以太坊基础设施和资源。
图片根据 EVM 兼容性,对 zkVM 进行分类。

构建 zkEVM 的困难点在哪里

由于 EVM 在建造时并没有考虑到零知识计算,所以它的一些特性对证明电路来说是不太友好的。以下四个方面是使构建 zkEVM 变得困难的主要原因:

  1. 特殊操作码
  2. 基于堆栈的结构
  3. 存储开销
  4. 证明成本


1. 特殊操作码

与普通的虚拟机有所不同,EVM 在程序执行(CALL、DELEGATECALL)和错误处理(REVERT、INVALID)等操作中使用了特殊的操作码,它增加了 EVM 操作证明电路设计过程的复杂性。


2. 基于堆栈的架构

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


3. 存储开销

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


4. 证明成本

即使解决了上述问题,仍还需处理生成证明的过程。生成零知识证明需要专门的硬件,以及需要投资大量的时间、金钱和精力成本。以上这些问题阻碍了建立与 EVM 兼容的 zkEVM。然而,零知识技术方面的一些突破,在一定程度上已经可以缓解这些问题带来的影响,这使人们重新对 zkEVM 解决方案产生兴趣。为什么 zkEVM 如此重要
建立功能齐全的 zkEVM 将鼓励开发与 EVM 兼容的 zk-rollups 项目。这样做有几个优点:

  1. 安全的可扩展性
  2. 更便宜的成本
  3. 更快的最终确定性和资本效率
  4. 网络效应


1. 安全的可扩展性

根据协议规则,所有验证节点必须重新执行在 EVM 中进行的所有计算。这种方法确保了安全性,因为以太坊节点可以独立验证程序的正确性,但它限制了以太坊网络的可扩展性,每秒只能管理 15-20 笔交易。与 EVM 兼容的 zk-rollups 可以在解决以太坊吞吐量问题的同时,而不破坏网络的安全性。和其它扩展协议一样,zk-rollups 不受以太坊共识协议规则的影响,并且可以优化执行速度。一些估测资料显示,zk-rollups 每秒可以处理约 2000 个交易,且不会产生高额费用。除此以外,与其它扩展项目相比,zk-rollups 具有更高的安全保障 —— 它们用有效性证明验证链外计算的正确性。也就是说,智能合约在 L2 上执行的交易可以在 L1(以太坊)上得到可靠的验证,但无需节点重新执行操作。这大大增加了以太坊的处理速度且不降低安全性。


2. 更便宜的成本

Rollups 通过将交易数据作为 CALLDATA 写入以太坊,来承袭以太坊主网的安全性。不过 optimistic rollups 和 zk-rollups 需要在以太坊上发布的数据多少是有区别的。由于 optimistic rollups 不提供链外交易的有效性证明,所以它们需要在链上发布所有与交易相关的数据(包括签名和交易参数)。如果不把所有数据放在链上,挑战者就无法构建用于争议无效 rollups 交易的欺诈证明。相反,即使只向以太坊发布最少的数据量,zk-rollups 也负担得起。因为有效性证明已经保证了状态转换的可信性。zkEVM 甚至可以省略交易输入,只发布最终的状态变化,进一步减少对 CALLDATA 的需求。这对开发者和用户来说都是有益的,因为很大比例的 rollups 成本来自于在链上发布数据。通过将 CALLDATA 的调用减少到最低限度,zk-rollups 可以降低 dapps 的使用成本,比如去中心化的交易所、NFT市场、预测市场等等。


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

除了更好的安全性之外,zk-rollups 相较 optimistic rollups 还有一个优势:更快的最终确定性。区块链中的最终确定性是指交易变为不可逆所需的时间;只有当网络参与者对交易的有效性有客观证明时,交易才能最终完成最终确定性。基于 zk-rollups,在 zkEVM 中执行的交易通常在发布到以太坊上后立即被最终确定。归功于每个交易批都带有即时可验证的有效性证明,以太坊主链可以快速应用状态更新。由于 optimistic rollups 只发布没有证明的虚拟机交易,所以挑战期必须在交易实现最终确定性之前结束。挑战期长达 1-2 周,在此期间,任何人都可在交易提交给以太坊之后对其提出挑战。较慢的最终确定性对用户体验有很多影响。例如,在挑战期结束之前,用户不能从 rollups 中提取资产。或许流动性供应商愿意解决这个问题,但如果提款涉及高额资产甚至 NFT,可能他们也无能为力了。但 zkEVM 没有上述这些问题。更快的最终确定性对于重量级用户来说是非常好的,如 NFT 交易者、DeFi 投资者或需要无缝移动资产(特别是在 L1 和 L2 之间)的套利交易者。


4. 网络效应

构建 EVM 兼容的 zkVM 的最重要原因是为了利用以太坊的网络效应。以太坊作为世界上最大的智能合约平台,拥有一个为开发者和项目提供价值的庞大生态系统。例如,开发人员可以访问经过审计和战斗测试的代码库、广泛的工具、文档等。如若创建一个与以太坊基础设施不兼容的新 zkVM, 则会阻断项目和开发团队利用以太坊的网络效应。存在哪些类型的 zkEVM

目前的 zkEVM 项目主要分为两类:支持原生 EVM 操作码的 zkVM,和使用定制 EVM 操作码的 zkVM。接下来我们将比较不同的 zkEVM 协议,并了解它们是如何工作的。

  • Polygon zkEVM

Polygon Hermez 是一个具有 zkVM 的 Polygon zk-rollup,旨在支持 EVM 的兼容性。为此,EVM 字节码被编译成 “微操作码(micro opcodes)” 并在 uVM 中执行,uVM 使用 SNARK 证明和 STARK 证明来验证程序执行的正确性。将这两种证明类型结合起来是一个战略性的决定。STARK 证明的生成速度更快,SNARK 由于证明更小,所以在以太坊上验证会更便宜。Polygon Hermez zkEVM 使用一个 STARK 证明电路来生成状态转换的有效性证明,用 SNARK 证明验证 STARK 证明的正确性(可以认为是生成 “证明的证明”),并将 SNARK 证明提交到以太坊进行验证。

  • zkSync zkEVM

zkSync 由 Matter Labs 开发,是一个由自己的 zkEVM 驱动的 EVM 兼容的 zk-rollups。ZkSync 通过以下策略实现了 EVM 兼容。1. 将 Solidity 编写的合约代码编译成 Yul。Yul 是一种可以被不同的虚拟机编译成字节码的中间语言。2. 将 Yul 字节码(使用 LLVM 框架)重新编译为专为 zkSync zkEVM 设计的自定义、电路兼容的字节码集。与 Polygon Hermez 一样,zkSync zkEVM 在语言层面实现了 EVM 的兼容性,而不是在字节码层面。例如,zkSync zkEVM 不支持传统的乘法和加法操作码(ADDMOD、SMOD、MULMOD)。

  • Scroll zkEVM

Scroll 是一个正在开发的新的 zkEVM 实现。Scroll 团队计划为每个 EVM 操作码设计零知识电路。这将允许开发人员在 Scroll 上部署以太坊原生智能合约 EVM,而无需修改底层 EVM 字节码。在其它方面,Scroll zkEVM 将使用 “加密累积器(cryptographic accumulator)” 来验证存储的正确性。这被用来证明合约字节码从给定的地址被正确地加载。它还提供了一个电路,用于将字节码与执行跟踪联系起来。执行跟踪是一个序列,它指定了哪些虚拟机指令以何种顺序被执行。证明者将在证明生成过程中提交执行跟踪,以验证计算是否与原始字节码一致。

  • AppliedZKP zkEVM

Applied ZKP 是一个由以太坊基金会资助的项目,旨在开发一个 EVM 兼容的 zk-rollup 和一个为以太坊区块生成有效性证明的机制。后者是至关重要的,因为将区块与有效性证明配对将消除节点重新执行区块的需要。Applied ZKP 的创新是将计算与存储分离。它使用两种类型的有效性证明 —— 状态证明和 EVM 证明。

  • 状态证明

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

  • EVM 证明

检查计算是否在正确的时间调用了正确的操作码。EVM 证明验证了计算本身,也确认了状态证明对每个操作码执行了正确的操作。AppliedZKP zkEVM 使用一个总线映射来连接状态证明和 EVM 证明。而且,在以太坊区块被视为有效之前,这两个证明都必须得到验证。

zkEVM 的开发行至何处了?
除了 zkSync,大多数 zkEVM 仍在开发完善中。尽管如此,零知识技术的不断发展意味着全功能的 zkEVM 的前景比以往任何时候都要好。同时,开发者可以利用 StarkNet zkVM 来发挥零知识应用的优势。StarkNet 虽然与 EVM 不兼容,但可以将 Solidity 源代码编译成自定义的零知识友好的字节码。你也可以选择用 Cairo(StarkNet 的语言)编写合约。

本文来自网络,不代表币懂得立场,转载请注明出处:http://www.blogboleh.com/682

币懂得作者

上一篇
下一篇

为您推荐

发表评论

您的电子邮箱地址不会被公开。

联系我们

联系我们

0898-88881688

在线咨询: QQ交谈

邮箱: email@zhutibaba.com

工作时间:周一至周五,9:00-17:30,节假日休息
关注微信
微信扫一扫关注我们

微信扫一扫关注我们

手机访问
手机扫一扫打开网站

手机扫一扫打开网站

返回顶部