zl程序教程

您现在的位置是:首页 >  其它

当前栏目

零知识EVM:什么是ZK-EVM? ZK-EVM的类型及其优缺点

什么 类型 知识 及其 优缺点 zk
2023-09-11 14:17:07 时间

参考文章:

https://vitalik.eth.limo/general/2022/08/04/zkevm.html

What is a zkEVM?

编译:Tokenview

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

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

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

什么是 ZK-EVM?

ZK-EVM 是一个支持零知识证明计算的 EVM 兼容的虚拟机。与普通虚拟机不同,ZK-EVM 可以证明程序执行的正确性,包括操作中使用的输入和输出的有效性。 我们将进一步分解此定义以使其更易于理解:

EVM 兼容性

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

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

支持零知识技术

EVM 在设计之时,并未考虑到要支持零知识证明,这使得构建 EVM 兼容的零知识友好虚拟机变得困难。不过伴随研究方面的进展,使得可以将 EVM 的计算包裹到零知识证明中。不同的 ZK-EVM 项目采用不同的方法将 EVM 执行与零知识证明计算相结合。

V神:分析当前4种不同类型ZK-EVM的优缺点

近日,以太坊创始人Vitalik Buterin发文解释了“不同类型的ZK-EVM和类似ZK-EVM的项目,以及它们之间的权衡”。V神总结称,‘就我个人而言,我希望随着时间的推移,通过ZK-EVM的改进和以太坊本身的改进相结合,使其ZK-SNARK更加友好,一切都将成为Type1。在这样的未来,我们将有多个ZK-EVM实现,它们既可以用于ZK汇总,也可以用于验证以太坊链本身。 从理论上讲,以太坊不需要为Layer1使用单一的ZK-EVM实现进行标准化;不同的客户可以使用不同的证明,因此我们继续从代码冗余中受益。但是,要实现这样的未来,还需要相当长的时间。与此同时,我们将在扩展以太坊和基于以太坊的ZK-rollup的不同路径中看到许多创新。’下文是V神关于EVM等效性的不同类型以及优缺点介绍。

类型1(完全等效于以太坊)

类型1 ZK EVM力求完全和毫不妥协地与以太坊等效。它们不改变以太坊系统的任何部分,来更容易生成证明。它们不会取代哈希、状态树、交易树、预编译或任何其他共识逻辑,无论它有多么外围。

优点:完美兼容性

我们的目标是能够像现在一样验证以太坊区块,或者至少验证执行层(因此,不包括信标链共识逻辑,但包括所有交易执行以及智能合约和账户逻辑)。

类型1 ZK-EVM 是我们最终需要的,使以太坊第 1 层本身更具可扩展性。从长远来看,在 类型2或类型3的 ZK-EVM 中测试出的对以太坊的修改可能会引入到以太坊本身,但这种重新架构也有其自身的复杂性。

类型1 ZK-EVM 也是汇总的理想选择,因为它们允许汇总重复使用大量基础设施。例如,以太坊执行客户端可以按原样使用来生成和处理汇总块(或者至少,它们可以在实现提款后使用,并且可以重新使用该功能来支持将 ETH 存入汇总中)。

缺点: 验证时间

以太坊最初并不是围绕ZK友好性设计的,因此以太坊协议的许多部分需要大量计算才能进行 ZK 证明。类型 1 旨在精确复制以太坊,因此它无法缓解这些低效率。目前,以太坊区块的证明需要很多小时才能产生。目前,以这种情况可以通过巧妙的工程来大规模并行化验证器,或者从长远来看,可以通过ZK-SNARK ASIC来缓解。

类型2 (完全等效于EVM)

类型2  ZK-EVM 力求完全等效于EVM,但不完全等同于以太坊。也就是说,它们“从内部”看起来完全像以太坊,但它们在外部有一些不同,特别是在数据结构上,如块结构和状态树。

其目标是与现有应用程序完全兼容,但对以太坊进行一些小的修改,以使开发更容易,并更快地生成证明。

优点:在虚拟机级实现完美等效

类型2 ZK-EVM对保存以太状态等内容的数据结构进行更改。幸运的是,这些结构是EVM本身不能直接访问的,因此在以太坊上运行的应用程序几乎总是在类型2 ZK-EVM汇总上工作。您将无法按原样使用以太坊执行客户端,但您可以通过一些修改来使用它们,并且您仍然可以使用EVM调试工具和大多数其他开发人员基础设施。

但也有少数例外。对于验证历史以太坊区块的Merkle证明以验证关于历史交易、收据或状态的声明的应用程序,出现了一种不兼容性(例如,桥梁有时会这样做)。用不同的哈希函数取代Keccak的ZK-EVM将打破这些证明。然而,我通常建议不要以这种方式构建应用程序,因为未来的以太更改(例如。Verkle Trees)甚至在以太本身上也会破坏这样的应用。对以太坊本身来说,一个更好的替代方案是添加未来可靠的历史访问预编译。

缺点:改进了验证时间,但仍然很慢

类型2 ZK-EVM提供比类型1更快的验证时间,主要是通过移除依赖于不必要的复杂和zk不友好加密的以太坊堆栈的部分。特别是,它们可能会改变以太坊的Keccak和基于RLP的Merkle Patricia树,可能还会改变区块和接收结构。类型2 ZK-EVM可能会使用不同的哈希函数,例如,Poseidon。另一个自然的修改是修改状态树以存储代码散列和keccak,从而不再需要验证散列来处理EXTCODEHASH和EXTCODECOPY操作码。

这些修改显著提高了验证时间,但它们不能解决所有问题。由于EVM固有的低效性和对zk的不友好性,证明EVM原样的过程仍然很缓慢。一个简单的例子是内存:因为MLOAD可以读取任何32字节,包括“未对齐”的块(其中开始和结束不是32的倍数),MLOAD不能简单地解释为读取一个块;相反,它可能需要读取两个连续的块,并执行位操作来合并结果。

类型2.5 (与EVM等效,不包括Gas费用)

显著改善最坏情况验证时间的一种方法是大幅增加EVM中特定操作的Gas费成本,这是zk验证非常困难的。这可能涉及预编译、KECCAK操作码,还可能涉及调用合约或访问内存、存储或恢复的特定模式。

不断变化的Gas费用成本可能会降低开发人员工具的兼容性,并破坏了一些应用程序,但通常认为它的风险低于“更深层次的”EVM更改。开发人员应该注意,在交易中需要的Gas费用不要超过一个区块的容量,不要使用硬编码的Gas费用数量进行调用(这已经是很长时间以来对开发人员的标准建议)。

类型3 (几乎等效于EVM)

类型3 zk EVM几乎与EVM等效,但在精确等效性方面做出了一些牺牲,以进一步缩短验证器时间并使 EVM 更易于开发。

优点:更容易构建,验证时间更快

类型3 ZK-EVM可能会删除一些在ZK-EVM实现中特别难实现的功能。在这里,预编译通常位于列表的顶部;此外,类型3 zkVM在处理合约代码、内存或堆栈方面有时也有细微的差异。

缺点:更多的不兼容

类型3  ZK-EVM的目标是与大多数应用程序兼容,并且只需要对其余部分进行最少的重写。也就是说,会有一些应用程序需要重写,因为它们使用了类型3  ZK-EVM删除的预编译,或者因为对边缘情况的微妙依赖(而这些边缘情况是由EVM以不同的方式处理的)。

类型4 (高级语言等效)

类型 4 系统通过获取以高级语言(例如SolidityVyper或两者都编译到的中间语言)编写的智能合约源代码并将其编译为明确设计为 ZK-SNARK 友好的某种语言来工作.

优点:验证时间非常快

如果不对每个EVM执行步骤的所有不同部分进行zk 证明,而是直接从高级代码开始,就可以避免很多开销。

在这篇文章中,我只用一句话来描述这个优势(与下面列出的与兼容性相关的缺点相比),但这不应该被解释为价值判断!直接从高级语言编译确实可以大大降低成本,并通过使其更容易被验证来帮助去中心化。

缺点:更多的不兼容

一个用Vyper或Solidity编写的“正常”应用程序可以被编译下来,它会“正常工作”,但有一些重要的方面,很多应用程序不是“正常工作”的:

1 合约在类型4 系统中的地址可能与它们在EVM中的地址不同,因为CREATE2合约地址取决于确切的字节码。这破坏了依赖于尚未部署的“反事实合约”、ERC-4337钱包、EIP-2470和许多其他应用程序。

2 手写的EVM字节码更难使用。为了提高效率,许多应用程序在某些部分使用手写EVM字节码。类型4 系统可能不支持它,尽管有一些方法可以实现有限的EVM字节码支持来满足这些用例,而不需要成为一个完整的Type3ZK-EVM。

3 许多调试基础设施不能被继承,因为这些基础设施运行在EVM字节码上。也就是说,通过从“传统”高级或中级语言(例如 LLVM)更多地访问调试基础架构,可以缓解这一缺点。

开发人员应该注意这些问题。