zkVM 测试报告:评估 Nescience 的零知识虚拟机

  • Vac.dev
  • 更新于 2天前
  • 阅读 139

zkVM 测试报告

介绍

在我们之前的博客文章中对 zkVM 的初步探索之后 [1],我们进行了系列测试,以确定最适合 Nescience 架构的 zkVM [2]。本文概述了测试过程、结果和结论。此外,完整的测试套件和脚本可以在我们的 GitHub 页面上找到 [3],以便其他人复制结果或进一步探索候选者。请注意,我们选择不在基准测试中使用硬件加速,因为我们的项目面向广泛的受众。特别是,我们不能默认假设支持 AVX512,因为它通常仅在高端 CPU 中可用。

我们已将以下 zkVM 列入测试名单:

  • SP1 [4]
  • RISC0 [5]
  • Nexus [6]
  • ZkMIPS [7]
  • ZkWASM [8]
  • Valida [9]

为什么选择这些候选者?

在缩小 zkVM 的范围时,我们关注了几个关键因素:

  • 真正的零知识功能:zkVM 必须展示或接近展示生成和验证零知识证明的能力。
  • 性能基准:我们寻求在性能方面有坚实基准的 zkVM,特别是在速度和效率方面。
  • 特定功能:对于 Nescience,查找表、预编译和递归能力等功能至关重要。

我们需要一个支持这些功能的 zkVM,以便进行强大的项目开发。

候选者的初步信息

  1. SP1 是一个高性能的开源 zkVM,能够验证任意 Rust(或任何 LLVM 编译语言)程序的执行。SP1 利用 Plonky3,支持递归证明,并支持包括基于 ECC 的算法(如 Groth16)在内的广泛加密算法。虽然它支持聚合,但似乎不以传统方式支持零知识。

  2. RISC0 zkVM 允许证明任意 Rust 代码的正确执行。基于 RISC-V 架构,它本质上适用于实现标准加密哈希函数,如 SHA-256 和 ECDSA。RISC0 采用 STARKs,提供 98 位的安全级别。它支持多种编程语言,包括 C 和 Rust,得益于其与 LLVM 和 WASM 的兼容性。

  3. Nexus 是一个模块化、可扩展的开源 zkVM,具有高度并行化、优化的证明者和友好的贡献者,使用 Rust 编写。它专注于性能和安全性,采用 Nova 折叠方案,特别适合递归证明。Nexus 还支持预编译和定向编译,除了 Rust 外,还提供 C++ 支持。

  4. ZkMIPS 是一个基于 Plonky2 和 MIPS 微架构的通用可验证计算基础设施,旨在增强以太坊作为全球结算层的能力。它也可以运行任意 Rust 代码。值得注意的是,zkMIPS 是此列表中唯一使用 MIPS 操作码集的 zkVM。

  5. ZkWASM 遵循并支持未修改的标准 WASM 字节码规范。由于 Rust 代码可以编译为 WASM 字节码,因此理论上可以在 zkWASM 机器上运行任何 Rust 代码,提供灵活性和广泛的语言支持。

  6. Valida 是一个基于 STARK 的虚拟机,旨在在多个类别中改进现有技术:

    • 代码重用:该虚拟机具有 RISC 风格的指令集,简化了对传统编程语言的支持。正在开发一个后端编译器,将 LLVM IR 编译为 Valida ISA,使得用 Rust、Go、C++ 等编写的程序能够以最小或无源代码更改进行证明。
    • 证明者性能:Valida 旨在最大化证明者性能,兼容 31 位字段,限制为 3 次约束,并具有最小的指令解码。它直接在内存上操作,而不使用通用寄存器或专用堆栈,利用更新的查找参数来减少跨芯片通信中涉及的跟踪开销。
    • 可扩展性:Valida 设计为可定制,可以轻松扩展以包含任意数量的用户定义指令。使用过程宏在编译时构建所需的机器,避免任何运行时惩罚。

Valida 似乎处于开发的早期阶段,但已经展示了可观的性能指标。

测试计划

为了全面评估每个 zkVM,我们设计了一个两阶段的测试过程:

  • 阶段 1:算术运算

    第一阶段专注于评估 zkVM 处理基本算术运算的能力:加法、减法、乘法、除法、模除和平方根计算。我们围绕七边形数设计了测试,这要求 zkVM 同时处理多个算术运算。通过这种方法,我们可以测量处理复杂数学计算的效率和速度,这是 zkVM 性能的关键要素。

  • 阶段 2:内存消耗

    在第二阶段,我们评估了每个 zkVM 在重负载下管理内存的能力。我们测试了几种数据结构,包括列表、哈希映射、双端队列、队列、BTreeMaps、哈希集合和二叉堆。每个 zkVM 都经历了以下操作的测试:

    • 插入:zkVM 向结构中添加数据的速度有多快?
    • 删除:zkVM 是否有效地处理内存释放?
    • 附加:zkVM 能否有效地扩展数据结构?
    • 搜索:zkVM 在检索存储数据时的速度和效率如何?

这一阶段的目的是识别任何内存瓶颈,并确定 zkVM 是否能够高效地管理高强度任务,这对 Nescience 项目的复杂数据密集型过程至关重要。

机器规范

测试在以下硬件配置上进行:

  • CPU:AMD EPYC 7713 "Milan" 64 核处理器(总共 128 线程)
  • RAM:600GiB DDR4 3200MHz ECC RAM,分布在 16 个 DIMM 上
  • 主机操作系统:Proxmox 8.3
  • 虚拟机监控器:KVM
  • 网络层:Open vSwitch
  • 机器型号:Supermicro AS-2024US-TRT

结果

1. SP1

SP1 在其证明中不提供零知识能力,但提供了可观的性能,尽管略逊于其主要竞争对手。内存泄漏很少,保持在 700 KB 以下。有趣的是,SP1 在基本算术测试中消耗的 RAM 比在内存分配测试中更多,展示了团队在负载下有效处理内存的能力。在基本测试中,分配主要集中在 9-16 B、33-64 B 和 65-128 B 范围内。对于内存分配,大多数落在 129-256 B 范围内。

  • 阶段 1:Hept 100 测试
    • 证明大小:3.108 MB
    • 证明时间:16.95 秒
Image 1 Image 2 Image 3 Image 4 Image 5
  • 阶段 2:Vec 10000 测试
    • 证明大小:3.17 MB
    • 证明时间:20.85 秒
Image 1 Image 2 Image 3 Image 4 Image 5

2. RISC0

RISC0 在证明大小和生成时间方面表现出色,排名靠前(除了 Valida 和 zkWASM 的基本测试)。它的内存管理也很好,轻微泄漏低于 0.5 MB,受控的 RAM 消耗保持在 2.2 GB 以下。RISC0 的内存分配一致,主要集中在 17-32 B 和 33-64 B 范围内。

  • 阶段 1:Hept 100 测试
    • 证明大小:217.4 KB
    • 证明时间:9.73 秒
Image 1 Image 2 Image 3 Image 4 Image 5
  • 阶段 2:Vec 10000 测试
    • 证明大小:217.4 KB
    • 证明时间:16.63 秒
Image 1 Image 2 Image 3 Image 4 Image 5

根据这些结果,RISC0 是 Nescience 的一个可靠候选者。


3. Nexus

Nexus 的性能为基于折叠方案的 zkVM 提供了有趣的见解。令人惊讶的是,证明大小在不同工作负载下保持一致,没有显著的内存泄漏(低于 700 KB)。然而,尽管 RAM 消耗在更高工作负载下略有增加(最高达到 1.2 GB),Nexus 在内存分配测试中的表现不佳,使其不适合我们的用例。

  • 分配细节:

    • 基本测试:大多数分配集中在 65-128 B
    • 内存密集型测试:分配在 129-256 B 范围内
  • 阶段 1:Hept 100 测试

    • 证明大小:46 MB
    • 证明时间:12.06 秒
Image 1 Image 2 Image 3 Image 4 Image 5
  • 阶段 2:Vec 10000 测试
    • 证明大小:46 MB
    • 证明时间:56 分钟
Image 1 Image 2 Image 3 Image 4 Image 5

4. ZkMIPS

ZkMIPS 提供了一个有趣的案例。虽然它在基本测试中在证明大小和生成时间方面表现良好,但这以显著的 RAM 使用和内存泄漏为代价。内存分配测试显示出令人担忧的 6.7 GB 内存泄漏,在基本测试中泄漏了 0.5 GB。尽管如此,RAM 消耗(虽然高达 17+ GB)在更高工作负载下保持稳定。分配大小分布在多个范围内,17-32 B、65-128 B 和 257-512 B 段的集中度显著。

  • 阶段 1:Hept 100 测试
    • 证明大小:4.3 MB
    • 证明时间:9.32 秒
Image 1 Image 2 Image 3 Image 4 Image 5
  • 阶段 2:Vec 10000 测试
    • 证明大小:4.898 MB
    • 证明时间:42.57 秒
Image 1 Image 2 Image 3 Image 4 Image 5

这个 zkVM 提供了混合结果,证明生成强大但内存管理问题令人担忧。


5. ZkWASM

不幸的是,ZkWASM 在两个阶段的证明大小和生成时间方面表现不佳。RAM 消耗特别高,在基本测试中超过 7 GB,在内存分配测试中高达 57 GB。尽管其内存使用量令人印象深刻,但证明大小分别为 18 KB 和 334 KB,仍然相对较大。分配大小主要集中在 33-64 B 范围内,邻近的Slot也贡献了一些小但显著的数量。

  • 阶段 1:Hept 100 测试
    • 证明大小:18 KB
    • 证明时间:42.7 秒
Image 1 Image 2 Image 3 Image 4 Image 5
  • 阶段 2:Vec 10000 测试
    • 证明大小:334 KB
    • 证明时间:323 秒
Image 1 Image 2 Image 3 Image 4 Image 5

6. Valida

Valida 在证明生成速度和大小方面表现出色,证明大小为 280 KB,证明时间小于 1 秒。然而,由于 Valida 对 Rust 的支持有限,无法进行性能分析。Valida 目前使用 LLVM 后端编译 Rust,将 LLVM IR 转换为其 C/C++ 实现,这在处理 Rust 特有的数据结构或依赖项时会导致错误。因此,复杂的内存交互无法进行测试,目前不建议将 Valida 与 Rust 代码一起使用。为此已在 GitHub 上开设了一个问题。


Stage 1

zkVM 证明时间 证明大小 峰值 RAM 消耗 内存泄漏
SP1 16.95 s 3.108 MB 2.1 GB 656.8 KB
RISC0 9.73 s 217.4 KB 1.9 GB 470.5 KB
Nexus 12.06 s 46 MB 9.7 MB 646.5 KB
ZkMIPS 9.32 s 4.3 MB 17.3 GB 453.8 MB
ZkWASM 42.7 s 18 KB 8.2 GB 259.4 KB
Valida < 1 s 280 KB N/A N/A

Stage 2

zkVM 证明时间 证明大小 峰值 RAM 消耗 内存泄漏
SP1 20.85 s 3.17 MB 1.9 GB 616 KB
RISC0 16.63 s 217.4 KB 2.3 GB 485.3 KB
Nexus 56 m 46 MB 1.9 GB 616 KB
ZkMIPS 42.57 s 4.898 MB 18.9 GB 6.9 GB
ZkWASM 323 s 334 KB 58.8 GB 259.4 KB
Valida N/A N/A N/A N/A

总结

在对六个 zkVM 候选者进行广泛评估后,RISC0 成为最佳选择。它在证明生成时间和大小方面表现出色,同时保持合理的内存占用。凭借强大的零知识证明能力和对多种编程语言的支持,它很好地满足了我们在隐私、性能和灵活性方面的项目需求。其在性能和效率之间的整体平衡使其在此阶段成为最可行的 zkVM。

Valida 尽管在高证明性能方面具有潜力,但仍处于早期开发阶段,并且存在 Rust 集成问题。目前的 LLVM IR 转换限制意味着它无法处理复杂的内存交互,因此暂时不合格。然而,一旦其开发成熟,Valida 可能成为一个强有力的替代方案,我们计划在其发展过程中重新审视它。

SP1 尽管最初引人关注,但未能满足零知识证明的要求。它在算术运算方面的表现令人满意,但由于缺乏 ZK 功能,无法进一步考虑,这对我们的隐私优先目标至关重要。

Nexus 展现了一致的证明大小和可管理的内存使用,但在内存密集型任务中的表现平平,以及其证明大小(尤其是对于较大工作负载)使其不再是顶级竞争者。虽然 zkMIPS 提供了可靠的证明时间,但内存问题过于严重,无法忽视,使其不适合。

最后,zkWASM 的结果最差,在证明大小和生成时间上都表现不佳。尽管它在 WASM 字节码支持方面具有潜力,但过高的 RAM 消耗(在内存测试中高达 57 GB)使其在 Nescience 的用例中不切实际。

总之,RISC0 在此阶段是 Nescience 的最佳选择,但 Valida 仍然是未来的候选者,随着其开发进展。

未来,我们计划将 RISC0 和 SP1 与 CUDA 加速进行比较。理想情况下,到那时,更多的 zkVM 将包括类似的加速能力,从而实现跨平台的更公平和全面的比较。

我们希望听到你对我们的 zkVM 测试过程和结果的看法!你是否同意我们的结论,还是认为我们错过了一个有前景的 zkVM?我们始终欢迎社区的反馈、见解和建议。

加入讨论并分享你对 我们论坛 的看法,或通过我们的 GitHub 页面 自行尝试测试!

参考文献

[1] 探索 zkVM:哪些项目真正符合零知识虚拟机的标准?来源于 https://learnblockchain.cn/article/9668

[2] Nescience:以用户为中心的状态分离架构。来源于 https://vac.dev/rlog/Nescience-state-separation-architecture

[3] 我们的 GitHub 页面用于 zkVM 测试。来源于 https://github.com/vacp2p/nescience-zkvm-testing

[4] 介绍 SP1:一个高性能、100% 开源、友好的贡献者 zkVM。来源于 https://blog.succinct.xyz/introducing-sp1/

[5] 第一个通用 zkVM。来源于 https://www.risczero.com/zkvm

[6] Nexus 2.0 zkVM。来源于 https://docs.nexus.xyz/

[7] ZKM 架构。来源于 https://docs.zkm.io/zkm-architecture

[8] ZK-WASM。来源于 https://delphinuslab.com/zk-wasm/

[9] Valida zkVM 设计。来源于 https://delendum.xyz/writings/2023-05-10-zkvm-design.html

我是 AI 翻译官,为大家转译优秀英文文章,如有翻译不通的地方,在这里修改,还请包涵~

点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
Vac.dev
Vac.dev
Vac is a principle-driven research and development group that provides technical support to each IFT(Institute of Free Technology https://free.technology/ ) startup.