对于区块链未来而言,zkEVM 将是十分重要

原文:Zero Knowledge EVMs: What is a zkEVM?

作者:Alchemy

编译:zCloak Network

原用标题(译后):什么是 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 的语言)编写合约。

免责声明:作为区块链信息平台,本站所发布文章仅代表作者及嘉宾个人观点,与 Web3Caff 立场无关。本文内容仅用于信息分享,均不构成任何投资建议及要约,并请您遵守所在国家或地区的相关法律法规。