文章详细介绍了零知识以太坊虚拟机(zkEVM),其定义、工作原理、架构及与以太坊智能合约的兼容性,并探讨了zkEVM在提高以太坊扩展性与安全性方面的重要性。此外,比较了不同类型的zkEVM及其各自的实现方式。
零知识以太坊虚拟机(zkEVM)是一种生成 零知识证明 以验证程序正确性的虚拟机。zkEVM 旨在以支持零知识技术的方式执行智能合约。
zkEVM是 零知识 (ZK) Rollups 的一部分,是以太坊Layer2的扩展解决方案,通过将计算和状态存储转移到链外来提高吞吐量。ZK-Rollup 将交易数据和验证链下交易批次有效性的零知识证明一起提交给以太坊。
早期的 ZK-Rollup 只能执行简单的代币交换和支付,缺乏常规的智能合约执行能力。但随着 EVM 兼容的零知识虚拟机的引入,ZK-Rollup 开始支持以太坊去中心化应用(dApp)。
在这篇文章中,我们将探索 zkEVM 是如何工作的,它的重要性,以及存在哪些类型的 zkEVM。
zkEVM 是一种 EVM 兼容的虚拟机,支持零知识证明计算。与常规虚拟机不同,zkEVM 证明程序执行的正确性,包括操作中使用的输入和输出的有效性。
我们将进一步拆解这个定义,以便于理解:
EVM(以太坊虚拟机) 是在以太坊网络上部署的智能合约执行的运行时环境。EVM 起着“全球计算机”的作用,驱动着在以太坊区块链上运行的去中心化应用(dApp)。
如果一个虚拟机能够运行在 EVM 环境下创建的程序,那么它就是“EVM 兼容的”。这种 VM 可以执行用 Solidity 或其他在以太坊开发中使用的高级语言编写的智能合约。zkEVM 是 EVM 兼容的,因为它们可以在没有大量修改底层逻辑的情况下执行以太坊智能合约。
EVM 从未设计为支持零知识证明,这使得构建 EVM 兼容的、对零知识友好的虚拟机变得困难。然而,研究的进展使得在一定程度上,可以将 EVM 计算包裹在零知识证明中。
不同的 zkEVM 项目采取不同的方法,将 EVM 执行与零知识证明计算结合在一起。每种方法都有独特的折衍,我们将在本指南的后面部分探讨。
与 EVM 类似,zkEVM 是一种虚拟机,随着程序操作会从一个状态转换到另一个状态。但 zkEVM 更进一步,生成证明以证明计算的每个部分的正确性。基本上,zkEVM 使用机制来证明执行步骤(前面描述过的)遵循了规则。
要理解 zkEVM 是如何工作的(以及它为什么不同),让我们回顾一下 EVM 目前的工作原理。
以太坊虚拟机是一个状态机,根据某些输入从旧状态转换到新状态。每次智能合约执行都会触发 EVM 状态的变化(称为“状态转移”)。以下是智能合约交易过程中发生的高层次概述:
合约字节码(从源代码编译而来)从 EVM 的存储中加载,并由 EVM 上的点对点节点执行。节点使用相同的交易输入,这保证了每个节点得出的结果相同(否则它们无法达成一致)。
EVM 操作码(包含在字节码中)与 EVM 状态的不同部分(内存、存储和栈)进行交互。操作码执行读写操作—— 读取(获取)来自状态存储的值以及 写入(发送)新值到 EVM 的存储中。
EVM 操作码对从状态存储中获取的值进行计算,然后返回新值。此更新导致 EVM 转移到新状态(交易因此被称为“状态转移”)。此新状态由其他节点复制,并保持不变,直到执行另一个交易。
一幅展示以太坊虚拟机(EVM)中程序是如何执行的示意图。
zkEVM 生成零知识证明以验证每次计算中的各种元素:
字节码访问:正确的程序代码是否从正确的地址加载?
读写操作: a. 程序在计算之前是否从栈/内存/存储中获取了正确的值?b. 程序在执行完成后是否将正确的输出值写入栈/内存/存储?
计算:操作码是否按照正确的顺序(即一个接一个)正确执行?
zkEVM 分为三个部分:执行环境、证明电路和验证合约。每个组件对 zkEVM 的程序执行、证明生成和证明验证有所贡献。
顾名思义,执行环境就是程序(智能合约)在 zkEVM 中运行的地方。zkEVM 的执行环境功能与 EVM 类似:它接受初始状态和当前交易以输出一个新的(最终)状态。
证明电路生成零知识证明,以验证在执行环境中计算的交易的有效性。证明生成过程使用预状态、交易输入和后状态信息作为输入完成。之后,证明者获得该特定状态转移有效性的简洁证明。
一幅展示 zkEVM 如何为程序生成有效性证明的示意图。
ZK-rollups 会将有效性证明提交给部署在 L1 链(以太坊)上的智能合约进行验证。输入(预状态和交易信息)和输出(最终状态)也会提交给验证合约。然后,验证者对提供的证明进行计算,确认提交的输出是否根据输入正确计算。
zkEVM 操作码是用于在 EVM 兼容的 ZK-rollup 中执行程序的低级机器指令。与 EVM 一样,用高级语言编写的合约必须被编译为虚拟机可以解释的低级语言(字节码)。该字节码指定了在虚拟机中执行程序时使用的操作码。
我们需要 zkEVM 操作码,因为常规的 EVM 操作码在零知识证明电路中效率较低。生成 zkEVM 操作码一般有两种方法:
为本地 EVM 操作码构建 ZK 电路
创建 ZK 证明计算的新语言
这种方法要求在算术电路中实现 所有 EVM 指令集,这是一个复杂且耗时的任务。好处是开发者可以使用 现有的区块链开发工具 创建智能合约,或将现有的以太坊合约移植到 ZK-rollups,而无需大量修改。
这种方法需要构建一种新语言,以支持有效性证明,并开发自定义操作码。开发者需要直接用新语言编写合约,或将 Solidity 源代码编译为自定义 zkEVM 操作码。
虽然这种方法的实施通常比第一种方法简单,但也有缺点。例如,开发者可能无法访问现有的以太坊基础设施和资源。
按照 EVM 兼容性分类的零知识虚拟机。
因为 EVM 的设计并未考虑到 zk 证明计算,所以它具有对证明电路不友好的特性。以下是让构建 zkEVM 变得困难的四个原因的简要概述:
特殊操作码
基于栈的架构
存储开销
证明成本
与常规虚拟机不同,EVM 使用特殊操作码进行程序执行(CALL,DELEGATECALL)和错误处理(REVERT,INVALID),以及其他操作。这为设计 EVM 操作的证明电路增加了复杂性。
EVM 使用基于栈的架构,尽管比基于寄存器的结构简单,但使证明计算的难度增加。因此,著名的零知识虚拟机,如 ZkSync 的 zkEVM 和 StarkWare 的 StarkNet 使用基于寄存器的模型。
EVM 的存储布局依靠 Keccak 哈希函数和 Merkle Patricia Trie,这两者的证明开销都很高。一些 zkVM,如 ZkSync,试图解决这个问题,替换 KECCAK256 函数,但这会破坏与现有以太坊工具和基础设施的兼容性。
即使解决了上述问题,仍然必须处理证明生成过程。生成零知识证明需要专用的硬件以及大量的时间、金钱和精力投资。
虽然这个列表并不详尽,但呈现了一些妨碍构建 EVM 兼容 zkEVM 的问题。尽管如此,零知识技术的一些突破 使得减轻这些问题成为可能——从而导致人们对 zkEVM 解决方案的重新关注。
构建一个完全面向功能的 zkEVM 将促使 EVM 兼容的 ZK-rollup 项目 的发展。这带来了几个优势:
安全的可扩展性
更低的成本
更快的最终性和资本效率
网络效应
根据协议规则,所有验证节点必须重新执行以太坊虚拟机中进行的所有计算。这确保了安全性,因为以太坊节点可以独立验证程序的正确性,但它对以太坊网络能够管理的可扩展性施加了限制(大约 ~ 15-20 个交易)。
EVM 兼容的 ZK-rollup 可以修复以太坊的吞吐量问题,而不会破坏网络安全。与其他扩展协议一样,ZK-rollups 并未受到以太坊共识协议规则的负担,可以优化执行速度。一些估计表明 ZK-rollups 可以处理 ~ 2000 笔交易每秒,而不会遭受以太坊的高费用。
然而,与其他扩展项目相比,ZK-rollup 具有更高的安全保障;它们通过有效性证明检验链下计算的正确性。这意味着在 L2 上执行智能合约进行的交易可以在 L1(以太坊)上可靠地进行验证,而无需节点重新执行操作。这可以显著提高以太坊的处理速度而不降低安全性。
Rollup通过将交易数据写入以太坊作为CALLDATA从以太坊主网获得安全性。然而,乐观 Rollup 和 ZK-rollup 在需要在以太坊上发布的数据量上有所不同。
由于 乐观 Rollup 不提供链外交易的有效性证明,因此必须在链上发布所有与交易相关的数据(包括签名和交易参数)。不将所有数据放在链上,挑战者无法构建用于争议无效 Rollup 交易的欺诈证明。
相反,ZK-rollup 由于有效性证明已然保证了状态转移的可信性,因此可以在以太坊上发布最小数据。zkEVM 甚至可以省略交易输入,仅发布最终状态变化,进一步减少 CALLDATA 的要求。
这对开发者和用户有利,因为 大部分 Rollup 成本 来自于在链上发布数据。通过将 CALLDATA 降至最低,ZK-rollup 可以让使用去中心化应用(dApp)的成本更低,例如去中心化交易所、NFT 市场、预测市场等。
除了更好的安全性,ZK-rollup 相对于乐观 Rollup 还具有另一个优势:更快的最终性。在区块链中,最终性是交易变得不可逆转所需的时间;只有在网络参与者对其有效性有客观证明的情况下,交易才能最终确定。
使用 ZK-rollup,zkEVM 中执行的交易通常在发布到以太坊后立即实现最终性。由于每个交易批次都附带着可以立即验证的有效性证明,因此主以太坊链可以快速应用状态更新。
由于乐观 Rollup 仅在不证明的情况下发布虚拟机交易,因此必须经过挑战期才能实现交易的最终性。挑战期为一至两周,这段时间内任何人都可以在交易提交给以太坊后对其提出挑战。
较慢的最终性对用户体验有许多影响。例如,用户在延迟期结束之前无法从 Rollup 中提取资产。流动性提供者可能会解决这个问题,但如果提取涉及高价值资产甚至 NFT,则可能会失效。
zkEVM 既没有以上的问题。更快的最终性对权力用户,如 NFT交易者、DeFi 投资者或需要在资产之间无缝移动(特别是在 L1 和 L2 之间)的套利交易者来说非常重要。
构建 EVM 兼容 zkVM 的最主要原因是利用以太坊的网络效应。作为全球最大的智能合约平台,以太坊拥有一个为开发者和项目提供价值的大生态系统。
例如,开发者可以访问经过实践检验和审计的代码库、丰富的工具、文档等。创建一个与以太坊基础设施不兼容的新 zkVM 会使项目和开发团队无法利用以太坊的网络效应。
当前的 zkEVM 项目大致分为两类:支持本地 EVM 操作码的 zkVM 和使用自定义 EVM 操作码的 zkVM。以下是我们对不同 zkEVM 协议的比较以及它们的工作原理的阐述:
Polygon Hermez 是一个 Polygon ZK-rollup,其零知识虚拟机旨在支持 EVM 兼容性。为了实现这一点,EVM 字节码被编译成“微操作码”,并在使用 SNARK 和 STARK 证明来验证程序执行正确性的 uVM 中执行。
结合这两种证明类型的决定具有战略意义。STARK(可扩展透明知识论证)证明生成速度更快,但 SNARK(简明非交互知识论证)证明的体积更小且在以太坊上验证成本较低。
Polygon Hermez zkEVM 使用 STARK 证明电路来生成状态转移的有效性证明。STARK 证明验证 STARK 证明的正确性(可以认为是生成“证明的证明”),并提交给以太坊进行验证。
zkSync 是由 Matter Labs 开发的 EVM 兼容 ZK-rollup,并由其自己的 zkEVM 提供支持。zkSync 通过以下策略实现与以太坊的兼容性:
将用 Solidity 编写的合约代码编译为 Yul,这是一种可以编译成不同虚拟机字节码的中间语言。
使用 LLVM 框架重新编译 Yul 字节码为一套自定义的、兼容电路的字节码集,专为 zkSync 的 zkEVM 设计。
与 Polygon Hermez 相似,zkSync zkEVM 在语言层面实现 EVM 的兼容性,而不是在字节码层面。例如,传统的乘法和加法操作码(ADDMOD、SMOD、MULMOD)不被 zkSync 的 zkEVM 支持。
Scroll 是一种正在开发的新零知识 EVM 实现。Scroll 团队计划为每个 EVM 操作码设计零知识电路。这将使开发者能够在 Scroll 上部署以太坊原生智能合约,而无需修改底层 EVM 字节码。
Scroll zkEVM 还将使用一种“密码累加器”来验证存储的正确性。这用于证明合约字节码是否从给定地址正确加载。
它还提供了一个电路,用于将字节码与执行跟踪关联。执行跟踪是一个序列,指定了执行了哪些虚拟机指令以及顺序。证明者将在证明生成期间提交执行跟踪,以验证计算是否与原始字节码一致。
Applied ZKP 是一个由以太坊基金会资助的项目,旨在开发 EVM 兼容的 ZK-rollup 和为以太坊块生成有效性证明的机制。后者至关重要,因为将块与有效性证明配对将消除节点重新执行块的需要。
Applied ZKP 的创新在于将计算与存储分离。它使用两种类型的有效性证明—— 状态证明 和 EVM证明:
检查与存储、内存和栈相关的操作是否正确发生。状态证明本质上验证读写操作的准确性。
检查计算是否在正确的时间调用了准确的操作码。EVM 证明不仅验证计算本身,还确认状态证明在每个操作码上执行的操作是正确的。
AppliedZKP zkEVM 使用总线映射将状态证明和 EVM 证明链接在一起。此外,只有在以太坊块被视为有效之前,两个证明都必须通过验证。
除了 zkSync 外,大多数零知识 EVM 仍处于开发中。尽管如此,零知识技术的不断发展意味着全面功能 zkEVM 的前景比以往任何时候都要更好。
与此同时,开发者可以利用 StarkNet 零知识虚拟机的零知识应用的好处。StarkNet 并不兼容 EVM,但可以将 Solidity 源代码编译为自定义 ZK 友好的字节码。你也可以选择用 Cairo(StarkNet 的语言)编写合约。
- 原文链接: alchemy.com/overviews/zk...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!