在软件席卷世界之后,ZK 正在革新区块链的一切。ZK 是一种通用机制,任何保密需求都能成为其应用场景,而 EVM 等图灵完备的虚拟机在理论上具备可以计算一切的可能。此时,将 ZK 和 VM 结合而来的 ZKVM 便具备无限可能。
一字之差,千里之别
在关于 ZKVM 的争论上,最主要的是其和 ZKEVM的区别和竞争。在部分开发者看来,ZKVM 是 ZKEVM 无法落地情况下的一种补充。
ZKVM(Zero-Knowledge Virtual Machine)是一种基于 RISC-V 微架构的可验证计算机。它类似于一个真实的嵌入式 RISC-V 微处理器,使得程序员能够像编写其他代码一样编写零知识证明(ZK proofs)。
这种平台主要基于 zk-STARKs 技术,比如其中的代表项目 RISC Zero。RISC Zero 实现了零知识虚拟机 (zkVM) 而不是 zkEVM。两者的区别在于“VM”(代表“虚拟机”)比 EVM 更通用。zkVM 几乎可以运行任何在计算机上运行的软件,而不仅是任何可以在以太坊上运行的软件。
ZKVM 的目标是为Web3开发提供一种高效、安全的方式来构建去中心化应用(DApps),同时保护用户隐私。
ZKEVM(Zero-Knowledge Ethereum Virtual Machine)是Ethereum生态系统中的一个概念,旨在开发与以太坊虚拟机(EVM)兼容的零知识证明系统。通过使用零知识证明,ZKEVM 可以将多个交易捆绑在一起,在链外进行验证,然后向以太坊主网提交单一的证明,从而显著降低以太坊网络的计算负荷并增强其可扩展性。
目前,像 zkSync Era 这样的新兴ZK Rollup项目正在迅速发展,总锁定价值(TVL)达到了6.68亿美元,自2023年4月以来增长了660%。
简单总结下,ZKVM 是用更分离和嵌入式的思维去实现对以太坊的兼容。分离是指 ZKVM 可以用任意语言和开发工具去支持以太坊虚拟机,并且保持对以太坊兼容的跟进和升级;嵌入式是指 ZKVM 不是 EVM 层级实现的兼容,而是在外部实现并将其对接到以太坊虚拟机之上。
并且在 ZKVM 发展进程中,先后得到了 a16z 和 Scroll 等顶级 VC 和 Rollup 的长期支持和看好。a16z甚至自行实现了 ZKVM 库,以便于开发者使用。
项目一览,观其未来
如前所述,相较于 ZKEVM 而言,ZKVM 更为通用,但是要实现高度兼容以太坊,并且保持效率上的优势并不容易。
a16z 使用 ZK-SNARK 技术构建了名为 Jolt 的ZKVM 方案,在其中,a16z 讨论了虚拟机(VM)和 SNARKs (Succinct Non-Interactive Arguments of Knowledge)技术之间的关系。
从结构上而言,ZKVM 可以分解为 VM 和 ZK 技术两部分。虚拟机是一种计算机程序执行的抽象,它包括一组原始指令(ISA)和支持的寄存器和内存类型,而 SNARKs 技术用于证明计算机程序的正确执行。
通常 SNARKs 由前端和后端组成,前端将计算机程序转换为等效的电路可满足性实例,后端允许证明者证明自己知道电路的满足分配。虚拟机可以通过现有的编译器基础设施和工具链来利用,这使得开发者可以直接将高级语言编写的程序转换为虚拟机的汇编代码,并受益于对这些编译器的先前审计或其他验证工作。
但是虚拟机的电路实现通常比不使用虚拟机的电路要大得多,这导致SNARKs证明的速度较慢。
此外,为了向开发者提供高级编程语言,虚拟机需要一个编译器将高级计算机程序转换为虚拟机的汇编代码,这增加了工作量。因此,虚拟机的设计需要权衡简单性和SNARK友好性之间的关系。
面对以上问题,Jolt 通过重新排序执行轨迹来提升运行效率。具体而言,Jolt 使用了一种称为vRAM 的技术,该技术将执行轨迹重新排序,并按照执行的指令进行分组。通过这种方式,Jolt 能够消除之前工作中执行未实际执行的指令所需的冗余电路。这种重新排序的执行轨迹可以通过标准的随机排列检查程序进行确认。
在经过上述步骤后,Jolt 会将 Lasso 应用于重新排序的执行轨迹,以验证每个指令的正确性。通过使用批处理技术,这不会增加与单个 Lasso 调用相比的验证成本。
Lasso是一种新的查找参数(lookup arguments)方法,它适用于索引和非索引查找。在Jolt中,Lasso的作用是用于验证每个指令的正确性。具体而言,Lasso 通过将每个指令的完整评估表存储在一个预先确定的表中,将指令的执行步骤替换为单个查找操作。对于每个指令,表中存储了指令在所有输入对(x,y)上的评估结果f(x,y)。通过使用Lasso,Jolt能够验证每个指令的执行是否正确。
并且 Jolt 还使用了排列不变指纹技术来提高内存检查的效率。具体而言,Jolt 将每个指令的评估表连接起来,并将其表示为一个可分解的表。通过这种方式,Jolt 能够将每个指令的评估表的结果作为输入提供给 Lasso 进行验证,而无需对所有可能的输入进行验证。这种排列不变指纹技术避免了随着表大小增长而增加的成本。
此外,Jolt还使用了排列不变指纹技术来确保不相关的子表查询结果被忽略,从而进一步提高了内存检查的效率。综上所述,Jolt通过重新排序执行轨迹和使用排列不变指纹技术来提高运行效率。
在 VC 的实践之外,Scroll 是 ZKVM 赛道最前沿的存在,其提出了名为 Ceno 的零知识虚拟机(zkVM)框架,它利用简洁、非交互式的零知识证明来实现对任何代码的可验证计算。
该框架将程序执行证明分为两个阶段。在第一阶段,该过程将程序执行分解为段,识别和分组相同的部分。然后,通过数据并行电路对这些段进行证明,允许有不同数量的重复。在随后的阶段,验证者根据段的重复次数和原始程序重建程序的控制和数据流。第二阶段可以通过统一的递归证明进一步证实。
针对执行中的效率而言,Ceno 提出了两种具体的设计概念,其中分段和并行化发生在两个级别:操作码和基本块。这两种设计都试图最小化影响电路大小的控制流,并支持动态复制数量,确保计算成本与实际执行的代码直接相关,即用户只需支付实际使用的部分。
特别是在并行化设计中,通过在第二阶段提出一种创新的数据流重构技术,Ceno 可以大大减少与原始程序执行相比的堆栈操作。需要注意的是,这两种设计是互补而不是互斥的。在同一个 zkVM 中整合这两种方法可以释放更大的潜力,以适应不同的程序需求。
结语
ZKVM 在 2024 年发展进入快车道,一方面,面对 Solana 和 TON 等竞争对手的追赶,以太坊生态需要保持自己的技术优势,另一方面,ZKVM 的大规模应用将会把 ZK 技术真正通用化和实用化,创造出更多的经济价值。