当您听到“虚拟机”这个词时,您首先想到的是什么?
如果您想到的是计算机,那么您就离事实不远了。虚拟机本质上是一个可以运行其他程序的程序,通常通过指令的获取-解码-执行循环。它有点像物理计算机的虚拟表示。
关于虚拟机在现代计算基础设施中发挥的基本作用,我还有很多可以分享的内容,但我们今天不在这里讨论这个问题。今天,我们在 zk-proofs 的背景下讨论虚拟机。我们正在谈论 zkVM。
让我们开始吧。
如果您已经进入零知识领域一段时间,您很可能听说过 zkEVM,或零知识以太坊虚拟机。 zkEVM 是一种虚拟机,它以与零知识证明(zk-proof)计算兼容的方式执行以太坊智能合约。
zkEVM 将任意数量的以太坊交易压缩为一个低成本且简洁的有效性证明。这允许在没有信任假设的情况下将 EVM 的运行委托给强大的节点,同时将主干(验证器)保留在廉价的硬件上,从而促进可访问性和去中心化。
不幸的是,以太坊虚拟机并不是为了在 zk 电路中运行而设计的,因为当时很少有人知道什么是零知识。因此,在实现 zkEVM 时必须做出一些权衡,从选择不与以太坊等效到让 Gas 成本不反映证明者成本(查看Vitalik 关于 zkEVM 类型的文章)。
换句话说,以太坊的局限性改变了实施和优化 zkEVM 产生的有效性证明的难度。更重要的是,它还需要重做所有对安全性非常重要的测试、模糊测试和审计。
如果有一种方便、简单的方法可以让您编写一个高级程序并执行它,并获得输出和证明,而无需了解任何有关零知识的知识,该怎么办?
zkVM(零知识虚拟机)是一种作为 zk 证明系统电路实现的虚拟机,通过 zk 证明保证安全且可验证的可信性。您不是证明特定程序的执行,而是证明虚拟机的执行。
zkVM 可以显着减少实施 zk-proof 的耗时和出错率。
zkVM 并不是一个新概念。第一个在零知识内进行任意计算的系统是TinyRAM,创建于 2013 年,它处理随机存取存储器。此后,DSL(领域特定语言)出现了。像Circcom和Noir这样的语言在低级电路和高级专业语言之间创建了一个中间地带。从那里,我们到达了Cairo-VM和Miden。 Cairo-VM 由 Starkware 于 2021 年构建,具有多项功能,包括优化的有效性证明、一种类似于 Rust 的用于编写可证明程序的现代语言,以及一个允许高效执行 Cairo 代码的程序。
Polygon 的方法 Miden 旨在对开发人员友好。开发人员无需学习任何有关密码学或 zk 证明的知识即可在 Miden VM 上运行智能合约,因为 zkVM 具有多语言支持。
从那时起,出现了多种虚拟机,包括RISC Zero zkVM和Succinct 的 SP1。稍后我们将深入探讨这些方法。
那么 zkEVM 和 zkVM 之间的主要区别是什么?
zkEVM 可能有点复杂,因为以太坊虚拟机具有复杂的规格。 zkEVM 的开发、维护和审核成本高昂,因为它们基本上是另一种 EVM 实现,以多项式方程而不是普通编程语言编写。
另一方面,zkVM 则更简单一些。他们可以让所有应用程序能够在每笔交易中相对无缝地使用 zk 证明。更改和扩展证明系统代码库、进行审计以及使用更广泛的工具(例如更多编程语言)变得更加容易。有关 zkEVM 和 zkVM 之间的差异以及以太坊扩展和 zk-proofs 的更多详细信息,请查看这篇优秀文章。
Taiko 团队一直在为以太坊基金会的 PSE zkEVM做出贡献。更具体地说,我们使用Axiom、EZKL和Scroll也贡献的“ Halo2-KZG ”证明系统将每个 EVM 操作码实现为手动电路,分担实现和审计的负担。然后,当提交一个包含由 EVM 指令组成的交易列表的区块时,zkEVM 能够通过组合所有电路的输出来生成证明。
由于 zk 证明非常复杂,并且几乎包括将以太坊实现为一组多项式方程,因此存在与证明系统、电路编译器和 zkEVM 代码本身相关的风险。这就是 Taiko 实现多证明者系统的原因,该系统涉及为单个区块生成多种类型的证明。因此,即使一种类型的证明在某种程度上受到损害,其他证明也可以通过检测错误的状态转换来确保系统继续安全运行。
随着时间的推移,我们已经转向 zkVM 模型。我们还可以修改客户端并运行它,生成 zk-proof。我们通过从使用与 ASIC 相当的系统(即,将客户端编写为专用加密电路)升级到使用通用 CPU 来实现这一点,只不过在该 CPU 上运行的客户端已经过编写、测试和审核。
为了确保 Taiko 的稳健性,我们不断使我们所依赖的密码学假设多样化。我们通过构建一个多重证明系统并为多个 zkVM(RISC Zero、SP1、Powdr)做出贡献来实现这一目标。我们继续投资 Halo2-KZG,因为 RISC-Zero 和 SP1 是基于 STARK 的,而 Powdr+Halo2 将是基于 SNARK 的(有关这些 zkVM 的更多详细信息,请参阅下一节)。
Taiko 还使用 SGX(即 Software Guard Extensions),这是一组与安全相关的指令代码,有助于增强隐私和安全性,而不会泄露数据本身。我们基于 geth/reth 修改执行客户端,以便它们可以在 SGX enclave 中运行,只需进行最少的修改(查看Taiko 的实现 Raiko)。然后,客户端生成一个 SGX 证明(查看Justin Drake 的这篇文章了解更多详细信息)。
要了解有关 Taiko 多重证明方法的更多信息,请查看Taiko 的 ZK 工程师 Cecilia 撰写的文章。
RISC Zero 构建了一个通用 zkVM,它允许开发人员证明任意 Rust 代码的正确执行,使他们能够利用现有工具来构建程序。虽然这使得验证代码变得更加方便,但这也意味着 RISC Zero 团队必须构建一个可能需要更复杂计算才能添加新功能的电路。
SP1 是 zkVM 市场中相对较新的参与者,是 Succinct 的第一代 zkVM,可验证任意 Rust(或任何 LLVM 编译语言)程序的执行情况。与 RISC Zero zkVM 一样,SP1 不需要开发人员学习专门知识。该团队最近发布了 SP1 Reth,这是一个使用 SP1 构建的开源性能 1 型 zkEVM,他们本质上是在 zkVM 中运行以太坊客户端。
Powdr 是一个 zkVM 编译器堆栈,可帮助构建 zkVM 和类似的证明框架。开发人员可以使用 powdr 执行动态执行,以及定义算术约束、查找等。该团队的目标是多个后端,包括 Halo2-KGZ、eSTARKS 和 SuperNova。
Valida 是一个社区驱动的基于 STARK 的 VM,致力于代码重用、证明者性能和可扩展性。
Nexus zkVM 是一种模块化、可扩展、开源和高度并行化的 zkVM,设计为在足够的机器功率的情况下以每秒万亿个 CPU 周期运行。 zkVM 用 Rust 编写,专注于性能和安全性。
Delphinus Lab 正在构建 zkWASM(支持 Web Assembly 的 zkSNARK 虚拟机。一种二进制指令格式,可用作 C、C++ 和 Rust 等编程语言的编译器)。 zkWASM 将作为 WASM 运行时上运行的应用程序和链上智能合约之间的去信任层运行。
Nil 基金会正在构建zkLLVM,这是一个从高级编程语言到可在 EVM 上验证的可证明计算协议的输入的编译器。 zkLLVM 的每个证明输出都是 EVM 内变量。
CirC 是一个编译器基础设施,支持从高级(有状态、统一)语言到(无状态、非统一、存在量化)电路的编译。
Nova 是一种高速递归 SNARK,可实现 IVC(增量可验证计算)。 IVC 是一种强大的加密原语,允许证明者以增量方式生成“长时间运行”顺序计算的正确执行证明。
zkVM 代表了零知识计算领域的重大发展,为开发人员提供了安全、可验证地执行程序的强大工具。虽然 zkEVM 为零知识计算铺平了道路,但 zkVM 提供了更灵活且对开发人员友好的方法。
如果没有 zk-proof 社区令人难以置信的持续努力,这篇文章就不可能完成。特别感谢 Taiko 团队的 Mamy Ratsimbazafy 和 Brecht Devos,以及 RISC Zero 的 Paul Gafni。
探索我们的招聘网站上的空缺职位 。
要了解 Taiko 的最新动态:
GitHub: https://github.com/taikoxyz
为 Taiko 做出贡献并赚取 GitPOAP!您还将成为我们自述文件的贡献者。开始使用 贡献指南。