miden-vm:基于 STARK 技术的零知识虚拟机项目

STARK-based virtual machine

分支59Tags79
文件最后提交记录最后更新时间
24 天前
1 个月前
5 天前
9 天前
5 天前
3 天前
4 天前
9 天前
3 天前
3 天前
9 天前
5 天前
1 个月前
3 天前
5 天前
2 个月前
14 天前
1 个月前
3 天前
24 天前
4 天前
4 天前
1 年前
1 年前
5 天前
5 天前
1 个月前
3 个月前
9 天前
23 天前
1 个月前
5 天前
4 个月前

Miden Virtual Machine

LICENSE LICENSE Test Build RUST_VERSION Crates.io

基于 STARK 的虚拟机。

警告: 本项目仍处于 Alpha 阶段。它尚未经过审计,可能存在缺陷和安全漏洞。该实现尚不满足生产环境使用要求。

警告: 对于 no_std,官方仅支持 wasm32-unknown-unknownwasm32-wasip1 目标。

概述

Miden VM 是一个使用 Rust 编写的零知识虚拟机。对于在 Miden VM 上执行的任意程序,都可以自动生成基于 STARK 的执行证明。随后,任何人可使用该证明验证程序已正确执行,而无需重新执行程序,也无需知晓程序内容。

Miden VM 使用 Plonky3 作为证明系统,但进行了部分修改。更多信息请参见 p3-miden 仓库。

在最新稳定版本中,虚拟机的大部分核心功能已经稳定,大部分 STARK 证明生成功能也已实现。我们仍在调整虚拟机的内部机制和外部接口,因此每次新版本发布时都可能出现一些破坏性变更。

  • 如需了解 Miden VM 的工作原理,请查阅文档
  • 如需开始使用 Miden VM,请查阅 miden-vm crate。
  • 如需进一步了解 STARK,请参见参考资料章节。

状态与特性

下一版 VM 正在 next 分支中开发;有关当前尚未发布的版本以及所有过往版本中所做的更改,请参见更新日志

特性亮点

Miden VM 是一款功能完备的虚拟机。尽管它为零知识证明生成进行了优化,但仍提供了人们预期中常规虚拟机应有的各项特性。这里列举几项:

  • 流程控制。 Miden VM 是图灵完备的,并支持常见的流程控制结构,例如条件语句以及由计数器/条件控制的循环。它不限制循环的最大迭代次数,也不限制控制流逻辑的深度。
  • 过程与执行上下文。 Miden 汇编程序可以拆分为称为 procedures 的子例程,程序执行可以跨越多个相互隔离的上下文,每个上下文都拥有自己专用的内存空间。这些上下文分为 root contextuser contexts。用户上下文可以通过可自定义的内核调用访问根上下文。
  • 内存。 Miden VM 支持可读写的随机访问内存。过程可以预留全局内存的一部分,以便更轻松地管理局部变量。
  • 丰富的指令集。 Miden VM 为 32 位无符号整数提供原生操作(算术运算、比较运算和位运算),并提供内置指令,用于使用 Poseidon2 哈希函数(VM 的原生哈希函数)计算哈希和验证 Merkle 路径。
  • 外部库。 Miden VM 支持针对预定义库编译程序。VM 自带其中一个这样的库:Miden miden-core-lib,它增加了对 64 位无符号整数等特性的支持。开发者可以构建其他类似库,以符合自身用例的方式扩展 VM 的功能。
  • 非确定性。与传统虚拟机不同,Miden VM 支持非确定性编程。这意味着证明者可以在 VM 外部执行额外工作,然后向 VM 提供执行 hints。这些提示可大幅提升某些类型计算的效率,也可以为 VM 提供秘密输入。
  • 可自定义宿主。 Miden VM 可以使用用户定义的宿主进行实例化。这些宿主用于在执行/证明生成期间向 VM 提供外部数据(通过非确定性输入),并可将 VM 连接到任意数据源(例如数据库或 RPC 调用)。
  • 快速处理器执行模式。 除了用于证明生成、能够产生轨迹的处理器外,Miden VM 还包含一个快速处理器,可以以高达 320 MHz 的频率执行程序,从而支持快速的程序测试与调试等多种用途。
  • 预编译。 Miden VM 支持 precompiles,允许程序将开销较大的 计算延迟到宿主执行。VM 验证会认证未决延迟根;一个聚合预编译 证明可以稍后结算兼容的延迟执行。

计划中的特性

在未来几个月内,我们计划敲定 VM 的设计,并实现以下特性的支持:

  • 递归证明。 Miden VM 很快将能够验证其自身执行的证明。这将支持无限递归证明,成为现实应用中极其有用的工具。
  • 更好的调试。 Miden VM 将提供更好的调试体验,包括设置断点、更完善的源码映射,以及更完整的程序分析信息。

编译为 WebAssembly。

Miden VM 以纯 Rust 编写,可以编译为 WebAssembly。对于大多数 crate,Rust 的 std 标准库默认会被链接。要编译到两个受支持的 wasm32 目标之一,请使用 cargo--no-default-features 标志,确保 Rust 标准库不会被链接(no_std 方式编译)。

本工作区的 .cargo/config.toml 会为 wasm32-unknown-unknown 目标设置 -C target-feature=+simd128,从而启用 Plonky3 的 SIMD128 后端,使 WASM 中的哈希计算(Blake3、Poseidon2)更快。Cargo 仅将 .cargo/config.toml 应用于从本工作区(或其嵌套目录)运行的构建;下游用户如果将 Miden 作为依赖项构建(例如通过 web-sdk),必须自行设置该标志,例如使用 RUSTFLAGS="-C target-feature=+simd128" 或自己的 .cargo/config.toml,以获得相同的加速效果。

并发证明生成

当启用了 concurrent 特性进行编译时,证明者将使用多个线程生成 STARK 证明。有关并发证明生成的收益,请查看下方的基准测试。

内部,我们使用 rayon 进行并行计算。因此,若要控制生成 STARK 证明时使用的线程数,可以使用 RAYON_NUM_THREADS 环境变量。

项目结构

工作区包含以下主要 crate。内部支持 crate 和基准测试 crate 已省略。

领域 Crate 用途
VM core 定义指令集与共享的 VM 类型。
VM assembly 解析并汇编 Miden Assembly 程序。
VM processor 执行程序并构建执行轨迹。
VM air 定义用于检查 VM 执行的约束。
VM prover 基于执行轨迹生成 STARK 证明。
VM verifier 验证 VM 执行证明。
VM miden-vm 提供主库和命令行接口。
共享代码 field 为 Miden Rust 代码提供通用的域元素类型。
共享代码 crypto 提供整个工作区使用的加密原语。
证明系统 lifted-air 为 lifted STARK 协议定义 AIR trait 与符号约束。
证明系统 lifted-stark 实现 lifted STARK 证明与验证。
证明系统 stark-transcript 提供证明协议所用的 transcript 通道。
证明系统 constraint-compiler 将符号 AIR 约束编译为求值器代码。
预编译 precompiles 定义延迟计算与预编译注册表。
预编译 precompiles-air 定义预编译 AIR 与通用证明设置。
预编译 precompiles-prover 在证明过程中构建预编译证明数据。
预编译 precompiles-verifier 验证预编译证明与注册表数据。
包与工具 core-lib 提供标准 Miden Assembly 库。
包与工具 mast-package 存储编译后的 MAST 产物及其依赖项与导出项。
包与工具 project 加载并构建 Miden 项目。
包与工具 package-registry 定义包注册表与依赖解析接口。
包与工具 package-registry-local 提供本地包注册表及其命令行接口。
包与工具 miden-format 格式化 Miden Assembly 源文件。

文档

docs/ 目录中的文档使用 Docusaurus 构建,并会自动并入用于主文档网站的 miden-docs 主仓库。对 next 分支的修改会触发自动化部署流程。构建 docs/ 目录前,需要先安装 npm 包。

性能

以下基准测试结果仅可作为未来预期性能的粗略参考。之所以如此,是因为许多优化尚未应用;一旦我们投入时间进行性能优化,预计会有一定加速。

关于性能的几点一般说明:

  • 执行时间主要由证明生成时间决定。实际上,运行程序所需时间通常不到生成证明所需时间的 0.01%。
  • 证明验证时间非常快。大多数情况下低于 1 ms,但有时可能高达 2 ms 或 3 ms。
  • 证明生成过程可动态调整。一般而言,执行时间、证明大小和安全级别之间存在权衡(即对于给定的安全级别,可以在一定程度上通过增加执行时间来减小证明大小)。
  • 证明生成时间和证明验证时间都受到 STARK 协议中使用的哈希函数的显著影响。以下基准测试中,我们使用的是 BLAKE3,这是一种非常快速的哈希函数。

要更新以下 Blake3 结果,请运行与 CI 相同的 Criterion 基准测试:

RAYON_NUM_THREADS=16 cargo run --profile optimized -p miden-vm-blake3-bench --bin blake3-nonregression -- run \
  --repo-root . \
  --output-dir target/blake3-nonregression \
  --rayon-num-threads 16 \
  --sample-size 10 \
  --light-sample-size 100 \
  --measurement-time-secs 1 \
  --warm-up-time-secs 1 \
  --bench-axes all \
  --git-ref "$(git rev-parse HEAD)"

结果会写入 target/blake3-nonregression/result.json;测试框架不会解析 miden-vm runmiden-vm prove 的文本输出。该基准测试会记录 execute_for_proving_syncbuild_traceprove_trace_synce2e_prove。它也会接受历史的 execute_trace_inputs_sync 维度输入,并将这两种拼写统一规范化为稳定的 execute_for_proving_sync 指标键。e2e_prove 指标会在每个样本上执行程序运行与轨迹生成,但只统计证明器阶段的耗时。测试框架还会在开始对证明密集型维度计时之前,先对程序执行一次证明与验证。

单核证明器性能

在单个 CPU 核心上运行时,当前版本的 Miden VM 大约以 20 - 25 KHz 的频率工作。在下述基准测试中,该 VM 在 Apple M4 Max CPU 的单线程下运行 Blake3 示例 程序。所生成证明的目标安全级别为 96 位。

VM 周期数 执行时间 证明时间 内存占用 证明大小
214 0.3 ms 885 ms 200 MB 80 KB
216 0.7 ms 3.6 sec 750 MB 100 KB
218 1.2 ms 14.7 sec 2.9 GB 116 KB
220 6 ms 59 sec 11 GB 136 KB

由上表可见,证明时间大致会随周期数的翻倍而翻倍,但证明体积的增长要慢得多。

多核证明器性能

STARK 证明生成具有大规模并行化能力。因此,利用多个 CPU 核心可以大幅缩短证明生成时间。例如,在 16 核 CPU(Apple M4 Max)上运行时,当前版本的 Miden VM 可达到约 170 KHz 的频率。而在 64 核 CPU(Amazon Graviton 4)上运行时,该 VM 可达到约 200 KHz 的频率。

在下述基准测试中,该 VM 以 96 位目标安全级别运行相同的 Blake3 示例程序 220 个周期:

机器 执行时间 证明时间 执行占比 隐含频率
Apple M1 Pro (16 线程) 9 ms 14.2 sec 0.1% 70 KHz
Apple M4 Max (16 线程) 6 ms 5.9 sec 0.2% 170 KHz
Amazon Graviton 4 (64 线程) 11 ms 4.9 sec 0.2% 205 KHz
AMD EPYC 9R45 (64 线程) 7.5 ms 3.7 sec 0.2% 270 KHz
AMD Ryzen 9 9950X (16 线程) 7.2 ms 7.2 sec 0.1% 145 KHz
AMD Ryzen 9 9950X (32 线程) 6.5 ms 6.5 sec 0.1% 161 KHz

递归友好的证明

上述基准测试中的证明使用 BLAKE3 哈希函数生成。尽管该哈希函数本身速度极快,但在 Miden VM 中执行时效率并不很高。因此,使用 BLAKE3 生成的证明并不适合递归证明验证。为支持高效的递归证明,我们需要使用算术化友好的哈希函数。Miden VM 原生支持 Poseidon2,它就是其中一种哈希函数。算术化友好哈希函数的缺点之一在于,它们明显慢于常规哈希函数。

在下面的基准测试中,我们使用 Poseidon2 哈希函数代替 BLAKE3,在 96 位目标安全级别下,对同一 BLAKE3 示例程序执行 220 个周期:

机器 执行时间 证明时间 相比 BLAKE3 的变慢倍数
Apple M1 Pro(16 线程) 9 毫秒 25.5 秒 1.8 倍
Apple M4 Max(16 线程) 6 毫秒 10.1 秒 1.7 倍
Amazon Graviton 4(64 线程) 11 毫秒 7.7 秒 1.6 倍
AMD EPYC 9R45(64 线程) 7.5 毫秒 6.9 秒 1.9 倍
AMD Ryzen 9 9950X(16 线程) 7.2 毫秒 16.0 秒 2.2 倍
AMD Ryzen 9 9950X(32 线程) 6.5 毫秒 12.9 秒 2.0 倍

参考资料

Miden VM 生成的执行证明基于 STARK。STARK 是一种新颖的计算证明方案,可让你生成能够高效验证的证明,以表明某项计算已正确执行。该方案由 Technion - 以色列理工学院的 Eli Ben-Sasson、Michael Riabzev 等人提出。STARK 不需要初始可信设置,并且依赖的密码学假设极少。

以下是进一步了解 STARK 的一些资料:

Vitalik Buterin 关于 zk-STARK 的博客系列:

Alan Szepieniec 的 STARK 教程:

StarkWare 的 STARK 数学博客系列:

StarkWare 的 STARK 教程:

许可

任何有意提交以纳入本仓库的贡献,按照 Apache-2.0 许可证的定义,均按 MITApache 2.0 双重许可,且不附加任何额外条款或条件。