ZK范式系列之zkVM介绍(1)
1. 引言
zkVM(Zero-Knowledge Virtual Machine,零知识虚拟机):
- 是一种功能强大的虚拟机,
- 利用零知识证明 (zero-knowledge proof,ZKP) 来保证计算的完整性和隐私性。
零知识证明(ZKP):
- 是一种密码学技术,
- 使一方能够向另一方证明声明的有效性,而无需透露任何其他信息。
- 简单来说,这就像证明prover知道某秘密,但实际上并没有透露该秘密本身。
zkVM 正在推动可验证计算的未来。
- 该技术具有巨大的潜力,可通过为数据隐私、安全交易、去中心化金融 (DeFi)、法规遵从性等提供强大的解决方案来彻底改变各个领域。
- 通过在不泄露敏感信息的情况下验证计算,zkVM 推动了向无信任系统的范式转变。
本文深入探讨了 zkVM 的世界。将探索 ZKP 的基础知识,揭示 zkVM 的内部工作原理,介绍 zkEVM(一种特定类型的 zkVM)的概念,并提供评估不同 zkVM 解决方案的框架。
这是由三部分组成的ZK范式系列文章的第一部分:
- 1)第1部分:何为 zkVM?
- 2)第2部分:zkVM 设计权衡
- 3)第3部分:zkVM 自定义 ISA(指令集架构)
2. 揭开 zkVM 和ZK密码学的神秘面纱
“在未来 5 年内,我们将像讨论区块链协议应用一样讨论零知识协议的应用。过去几年的突破所释放的潜力将席卷主流”
- Espresso Systems的Jill Gunter,2021 年 5 月
自 2021 年以来,零知识 (ZK) 领域已发展成为一个涵盖多个领域的多样化生态系统,包括原语、网络和应用程序。然而,尽管 ZK 的发展历史和最近由 ZK 提供支持的 Rollup(如 Starknet 和 zkSync Era)的推出取得了进展,但 ZK 的大部分内容对于其用户和整个密码学领域来说仍然是个谜。
但时代在变。Lita团队认为ZK密码学是 一种功能强大、普遍适用的工具,可用于扩展和保护任何软件。简而言之,ZK密码学是大规模采用密码学技术的桥梁。再次引用 Jill 的话,在 web2 和 web3 中,任何涉及零知识证明的东西都会创造巨大的价值(包括基本价值和投机价值)。密码学领域最优秀的人才正在努力迭代,以使ZK密码学在经济上可行并准备好投入生产。即便如此,在所设想的范式成为现实之前,该行业无疑还需要取得一些进展。
如果要比较零知识证明和比特币的采用,那么比特币从边缘爱好者论坛网络货币发展成为贝莱德认可的“数字黄金”的原因之一是开发者和社区创作的大量文献引起了人们的兴趣。就目前而言,零知识证明存在于泡沫中的泡沫之中。信息分散且两极分化;文章要么充斥着难以理解的术语,要么太过通俗,无法传达任何除了重复使用的例子(如“沃尔多在哪里”)之外的有意义的信息。似乎每个人(专家和外行)都知道零知识是什么,但没有人能描述它的实际工作原理。
作为对零知识范式做出贡献的团队之一,Lita团队希望揭开这些工作的神秘面纱,帮助更广泛的受众构建理解和分析 ZK 系统和应用程序的规范基础,以促进相关方之间的教育和讨论,并促进相关信息的传播。
tldr;无法用零知识来发展零知识。(You can’t grow zero knowledge with zero knowledge.)
3. 何为ZKP?
如果之前对零知识证明 (ZKP) 一无所知,强烈推荐 Wired 2022年1月的这个视频以五个难度级别以交互方式解释了该概念,并提供了易于理解的示例和演示。
简单来说,零知识证明使一方(证明者)能够向另一方(验证者)证明他们知道某件事,而无需透露这件事是什么或任何其他信息。更具体地说,零知识证明可以证明对某段数据或计算结果的了解,而无需透露数据或输入。创建零知识证明的过程涉及一系列数学模型,以将计算结果转换为一段原本毫无意义的信息,证明代码成功执行,之后可以进行验证。
在某些情况下,验证经过多轮代数转换和密码学操作后构建的证明所需的工作量比运行计算所需的工作量要少。这种独特的安全性和可扩展性组合使ZK密码学成为如此强大的工具。
3.1 了解 zkSNARKs 和 zkSTARKs
zkSNARKs:Zero Knowledge Succinct Non-Interactive Argument of Knowledge 零知识简洁非交互式知识论证
- 依靠初始(可信或不可信)设置过程来建立验证参数
- 需要证明者和验证者之间至少进行一次交互
- 证明尺寸小且易于验证
- a16zcrypto的Jolt和zkSync、 Scroll和 Linea等 rollups使用基于 SNARK 的证明
zkSTARKs: Zero Knowledge Scalable Transparent Argument of Knowledge 零知识可扩展透明知识论证
- 无需可信设置
- 通过使用可公开验证的随机性来创建无需信任的可验证系统,从而提供高透明度,即生成可证明的随机参数进行证明和验证
- 高度可扩展,因为它们可以快速(并非总是如此)生成和验证证明,即使底层witness(数据)的规模很大
- 不需要证明者和验证者之间的交互
- 代价是 STARKs 会生成更大的证明,这比 SNARKs 更难验证
- 与某些 zkSNARKs 证明相比,该证明更难验证,但并不像其他证明那么难验证
- Starknet以及 Lita、Risc Zero和Succinct Labs等 zkVM都使用了 STARK
(注意:Succinct 的桥使用 SNARK,但 SP1 是基于 STARK 的协议)
值得注意的是,所有 STARKs 都是 SNARKs,但并非所有 SNARKs 都是 STARKs。
若想全面了解 SNARK 和 STARK,建议阅读:
- Axiom的Yan Zhang和Yi Sun撰写的系列文章Privacy in Cryptocurrencies: Zero-Knowledge and zk-SNARKs;
- Ventali Tan 的 github中的系列文章。
4. 何为zkVM?
虚拟机 (VM) 是运行程序的程序。在上下文中,zkVM 是作为生成零知识证明的系统实现的虚拟计算机,或用于为任何程序或计算生成 ZKP 的通用电路或工具。
zkVM 消除了设计和编写 ZK 时学习复杂数学和密码学的需要,并允许任何开发人员执行用他们喜欢的语言编写的程序并生成 ZKP,从而更容易与零知识集成和交互。从广义上讲,大多数对 zkVM 的引用都隐含地包括附加到执行程序的虚拟机上的编译器工具链和证明系统,而不仅仅是虚拟机本身。 zkVM 的主要组件及功能有:
每个组件的设计和实现都由:
- 证明的选择(SNARKs 或 STARKs)
- 和 zkVM 的指令集架构 (instruction set architecture,ISA)
决定。
- 传统上,ISA 指定 CPU 的功能(数据类型、寄存器、内存等)以及 CPU 执行程序时执行的操作顺序。
- 在上下文中,ISA 确定 VM 可解释和执行的机器代码。
选择 ISA 可能会对 zkVM 的可访问性和可用性以及证明生成过程的速度和效率产生根本性的影响,并支撑任何 zkVM 的构建。
以下是一些 zkVM 及其组件的示例:
目前,将从高层次上关注每个组件之间的交互,以便在后续文章中提供一个框架来理解代数和密码学过程以及 zkVM 的设计权衡。
5. zkVM vs. zkEVM:了解主要区别
zkEVM(Zero-Knowledge Ethereum Virtual Machine,零知识以太坊虚拟机)是一种专门为以太坊区块链量身定制的 zkVM:
- 旨在使用 ZKP 执行以太坊智能合约,同时保持与以太坊虚拟机 (EVM) 的兼容性。
zkEVM 的主要优势在于其能够增强以太坊的可扩展性和隐私性。通过在链下处理多笔交易,然后在链上使用单一证明来证明其有效性,zkEVM 减少了以太坊主网上的计算负载并确保了用户的隐私。这使得 zkEVM 成为提高基于以太坊的应用程序和交易效率和安全性的重要工具。
zkVM 和 zkEVM 之间的关系在于它们共同使用零知识证明来提供隐私和可扩展性。虽然 zkVM 为各种区块链和应用程序提供了通用解决方案,但 zkEVM 专门针对以太坊生态系统进行了优化。这两种技术在区块链的未来中都发挥着至关重要的作用,满足了人们对私密、安全和高效的无信任交互日益增长的需求。
6. 抽象的 zkVM 流程
下图是 zkVM 的抽象、通用流程图,在程序通过 zkVM 组件时,根据程序的格式(输入/输出)进行拆分和分类。将在后续文章中深入研究每个过程。
zkVM 的进程流程一般如下:
- 编译器阶段
- 1)编译器首先将用传统语言(C、C++、Rust、Solidity)编写的程序编译为机器代码。机器代码的格式由 ISA 的选择决定。
- VM虚拟机阶段
- 2)VM 执行机器代码并生成execution trace执行轨迹,即底层程序的一系列步骤。其格式由算术化选择以及多项式约束集预先确定。常见的算术化方案包括Groth16中的 R1CS 、Halo2中的PLONKish 算术化以及plonky2和plonky3中的 AIR 。
- Prover阶段
- 3)证明者收到迹并将其表示为一组受一组约束约束的多项式,本质上是通过以数学方式映射事实将计算转化为代数。
- 4)证明者使用多项式承诺方案 (Polynomial Commitment Scheme,PCS) 对这些多项式做出承诺。承诺方案是一种协议,允许证明者创建某些数据 X 的指纹,这称为对 X 的承诺,然后使用对 X 的承诺在不透露 X 的情况下证明有关 X 的事实。PCS 就是指纹——为该计算约束的“预处理”简洁版本。这允许证明者使用验证者在以下步骤中提出的随机值来证明有关计算的事实(现在以多项式方程表示)。
- 5)证明者运行多项式交互式预言证明 (Polynomial Interactive Oracle Proof,PIOP),以表明已承诺的多项式代表满足给定约束的执行轨迹。PIOP 是一种交互式证明协议,由一系列轮次组成,其中证明者向多项式发送承诺,验证者用随机域值响应,证明者在这些随机值下提供多项式的评估,类似于使用随机值“求解”多项式方程以概率说服验证者。
- 6)应用 Fiat-Shamir 启发式算法:证明者以非交互模式运行 PIOP,其中验证者的行为仅限于发送伪随机挑战点。在密码学中,Fiat-Shamir 启发式算法将交互式知识证明转换为数字签名以供验证。此步骤对该proof进行加密并使其成为零知识。
- 7)证明者必须让验证者相信,相对于它发送给验证者的多项式承诺,所声称的多项式评估是正确的。为此,证明者生成“evaluation评估”或“opening”证明,该证明由多项式承诺方案(指纹)提供。
- Verifier阶段
- 8)验证者按照证明系统的验证协议检查证明,可以使用约束或承诺。验证者根据证明的有效性接受或拒绝结果。
概括来说,一个zkVM proof证明,对于给定的程序、给定的结果和给定的初始条件,存在一些输入,当从给定的初始条件执行时,程序会产生给定的结果。可将此陈述与流程相结合,得出以下对 zkVM 的描述:
- zkVM proof可以证明,对于给定的 VM 程序和给定的输出,存在某些输入会导致给定的程序在 VM 上执行时产生给定的输出。
7. 如何评估zkVM?
应该用什么标准来评估 zkVM?换句话说,什么时候应该说一个 zkVM 比另一个更好?
- 说实话,答案取决于用例。
Lita 的市场研究表明,对于大多数商业用例,在速度、效率和简洁性中,最重要的属性是速度或core-time效率,具体取决于应用程序。
- 有些应用程序对价格敏感,希望优化低能耗和低资本使用;对于这些应用程序,core-time效率可能是最重要的优化指标。
- 其他应用程序,特别是金融或交易相关的应用程序,对延迟敏感,希望优化速度。
大多数公开的性能比较都只关注速度,这很重要,但不是性能的整体衡量标准。还有一些重要的属性可以衡量 zkVM 的可靠性;其中大多数都达不到生产就绪标准,即使对于市场领先的现有企业来说也是如此。
Lita 提出了一种更全面的方法来评估 zkVM:
在此建议根据以下标准对 zkVM 进行评估,并将其分为两个子集:
- 1)基线:衡量 zkVM 的可靠性
- 正确性
- 安全
- 信任假设
- 2)性能:衡量 zkVM 的功能
- 效率
- 速度
- 简洁行
7.1 基线:正确性、安全性和信任假设
在评估 zkVM 是否适用于关键任务应用程序时,应将正确性和安全性视为基准。需要有足够的理由对正确性充满信心,并声称具有足够强的安全性。此外,对于应用程序来说,信任假设需要足够弱。
如果没有这些属性,zkVM 对于应用程序来说可能比无用更糟糕,因为它可能无法按规定执行,并使用户面临黑客攻击和漏洞攻击。
7.1.1 正确性
所谓正确性,是指:
- VM 必须按预期执行计算
- 证明系统必须满足其声称的安全属性
正确性由3个属性组成:
- 1)健全性:证明系统是真实的,因此它所证明的一切都是正确的。验证者拒绝虚假陈述的证明;只有当输入确实产生结果时,它才会接受计算结果。
- 2)完备性:证明系统是完备的,可以证明所有真实陈述。如果证明者声称它可以证明计算结果,那么它必须能够提供验证者接受的证明。
- 3)零知识:拥有证明并不会透露更多关于计算输入的信息,就像知道结果本身一样
可以有完备性而无可靠性:如果证明系统证明了一切,包括虚假性,显然它是完备的,但不可靠。
相反,可以有可靠性而无完备性:如果证明系统证明了某个程序存在,但无法证明计算,显然它是可靠的(毕竟,它从未证明过任何虚假性),但不完备。
7.1.2 信任假设
所谓信任假设,是指:
- 假设证明者和验证者诚实,从而得出 zkVM 可靠运行的结论
当 zkVM 具有信任假设时,这通常采用可信设置过程的形式。在使用证明系统生成第一个证明之前,ZK 证明系统的设置过程会运行一次,以生成一些称为“设置数据”的信息。在可信设置过程中,一个或多个人会生成一些随机性,这些随机性会被纳入设置数据中,并且需要假设其中至少有一个人删除了他们纳入设置数据的随机性。
实践中有两种常见的信任假设模型。
- 1)诚实多数信任假设是指在一组 N 个个体中,超过 N/2 的个体在与系统的某些特定交互中表现出诚信,这在区块链中很常见
- 2)“1-of-N” 信任假设指出,在一组 N 个个体中,至少有一个人在与系统的一些特定交互中表现出诚信,这通常用于基于 MPC 的工具和应用程序。
人们普遍认为,在其他条件相同的情况下,没有信任假设的 zkVM 比需要信任假设的 zkVM 更安全。
7.1.3 安全性
所谓安全性,是指:
- 与健全性、完整性和零知识的容忍度有关
实际上,所有三个正确性属性都具有非零容差。这意味着所有证明都是正确性的统计概率,而不是绝对确定性。容差是指一个属性失败的最大可容忍概率。零容差当然是理想的,但 zkVM 在实践中并没有对所有这些属性都实现零容差。完美的健全性和完整性似乎与简洁性不相容,并且没有已知的方法可以实现完美的零知识。衡量安全性的一种常见方法是使用安全位,其中 1 / ( 2 n ) 1 / (2^n) 1/(2n) 的容差称为 n n n位安全。安全位越多越好。
如果 zkVM 完全正确,那并不一定意味着它是可靠的。正确性仅意味着 zkVM 满足其安全属性,直至声明的容差。这并不意味着声明的容差足够低,可以投入市场。此外,如果 zkVM 足够安全,那并不意味着它是正确的;安全性指的是声明的容差,而不是实际实现的容差。只有当 zkVM 既完全正确又足够安全时,才能说 zkVM 可靠,直至声明的容差。
7.1.3.1 理解零知识安全
当在谈论安全性时,主要与 zkVM 的设计和评估指标有关。然而,零知识安全也指利用零知识证明来增强隐私和安全性的系统和协议。
如,零知识云存储是零知识安全的一种应用。它使用 ZKP 来确保服务提供商无法访问加密密钥或存储的数据。这保证了只有数据所有者才能解密和访问其信息,从而提供高水平的隐私和安全性。通过应用零知识安全原则,零知识云存储可保护敏感数据免遭未经授权的访问和泄露,从而确保强大的数据隐私和完整性。
7.2 zkVM 三难困境:在 zkVM 中平衡速度、效率和简洁性
速度、效率和简洁性都是可变的属性。所有这些因素都会影响 zkVM 的最终用户成本。 在评估中如何衡量它们取决于应用程序。通常,最快的解决方案不是最高效或最简洁的;最简洁的解决方案不是最快或最高效的;等等。
先定义每个属性,然后再解释它们的关系:
- 1)速度:
- 证明者能多快生成证明
- 以挂钟时间来衡量,即从计算开始到结束所用的时间
速度应根据特定的测试程序、输入和系统进行定义和测量,以确保可以对其进行定量评估。此指标对于对延迟敏感的应用程序至关重要,因为这些应用程序必须能够及时获得证明,但随之而来的是更高的开销和更大的证明尺寸。
-
2)效率
- 证明者消耗的资源,越少越好
- 可以用用户时间(即程序代码所耗费的计算机时间)来近似
prover消耗两种资源:core-time和空间。因此效率可以细分为core-time效率和空间效率。
- core-time效率:prover在所有核上运行的平均时间乘以运行prover的核数量。对于单核prover,core-time消耗和速度是一回事。对于在多核系统上以多核模式运行的多核prover,core-time消耗和速度不是一回事。如果一个程序充分利用了 5 个核或线程 5 秒,那么用户时间就是 25 秒,挂钟时间就是 5 秒。
- 空间效率:指使用的存储容量,如 RAM。
用户时间是衡量运行计算所消耗能量的指标,这一点很有意思。在几乎所有时间所有核都得到充分利用的情况下,CPU 的能耗应该保持相对稳定。在这种情况下,受 CPU 限制、主要为用户模式的代码执行所花费的用户时间应该与该代码执行所消耗的瓦时数(即能量)大致成线性比例。
对于任何规模足够大的证明运营而言,节约能源消耗或计算资源的使用应该是一件有趣的事情,因为证明的能源费用(或云计算费用)是一笔可观的运营成本。出于这些原因,用户时间是一个有趣的指标。较低的证明成本使服务提供商能够将较低的证明价格转嫁给对成本敏感的客户。
这两种效率都与证明过程的能耗和证明过程所用的资本量有关,而后者又与证明的财务成本有关。为了使效率的定义可操作化以便于测量,必须相对于一个或多个测试程序、每个程序的一个或多个测试输入以及一个或多个测试系统进行定义。 -
3)简洁性
- 生成证明的大小以及验证证明的复杂性
简洁性是三个不同指标的综合,其中证明验证的复杂性进一步细分为:
- 证明尺寸:证明的物理大小,通常以kB千字节为单位
- 证明验证时长:验证证明所需的时间。
- 证明验证空间:证明验证期间的内存使用情况
验证通常是单核操作,因此速度和core-time效率在这种情况下通常是等同的。与速度和效率一样,实施简洁性的定义需要指定测试程序、测试输入和测试系统集。
定义了每个性能属性后,现在来说明优化一个属性相对于其他属性的微小影响。
- 速度:证明生成速度快,证明规模大,但证明验证速度慢。生成证明需要消耗更多资源,效率低下
- 简洁性:证明者需要更多时间来压缩证明。但证明验证速度很快。证明越简洁,计算开销就越高
- 效率:最小化资源使用会降低证明生成的速度和证明的简洁性
一般来说,优化一种品质意味着不会优化另一种品质,因此需要进行多维分析,根据具体情况选择最佳解决方案。
在评估中对这些属性进行加权的一个好方法可能是定义每个属性的可接受水平,然后确定哪些属性最重要。最重要的属性应该进行优化,但其他所有属性的水平应保持足够好。
下图总结了“评估 zkVM 的属性:正确性、安全性、信任假设、速度、效率、简洁性” 中每个属性及其主要考虑因素:
参考资料
[1] Lita团队2024年9月4日博客 A ZERO KNOWLEDGE PARADIGM: Part 1 Intro to zkVMs