0xMiden/miden-vm
GitHub: 0xMiden/miden-vm
这是一个基于 STARK 技术的零知识虚拟机,能够为在 Rust 环境下执行的程序自动生成可验证的计算完整性证明。
Stars: 734 | Forks: 281
# Miden Virtual Machine
[](https://github.com/0xMiden/miden-vm/blob/main/LICENSE-MIT)
[](https://github.com/0xMiden/miden-vm/blob/main/LICENSE-APACHE)
[](https://github.com/0xMiden/miden-vm/actions/workflows/test.yml)
[](https://github.com/0xMiden/miden-vm/actions/workflows/build.yml)
[](https://www.rust-lang.org/tools/install)
[](https://crates.io/crates/miden-vm)
一个基于 STARK 的虚拟机。
**警告:** 本项目处于 alpha 阶段。尚未经过审计,可能存在 bug 和安全漏洞。此实现尚不适合生产环境使用。
**警告:** 对于 `no_std`,仅官方支持 `wasm32-unknown-unknown` 和 `wasm32-wasip1` 目标。
## 概述
Miden VM 是一个用 Rust 编写的零知识虚拟机。对于在 Miden VM 上执行的任何程序,都可以自动生成基于 STARK 的执行证明。然后,任何人都可以使用此证明来验证程序执行是否正确,而无需重新执行程序,甚至无需了解程序的内容。
Miden VM 使用 [Plonky3](https://github.com/0xMiden/Plonky3) 作为证明系统,尽管进行了一些修改。有关更多信息,请参阅 [`p3-miden`](https://github.com/0xMiden/p3-miden) 仓库。
在最新的稳定版本中,VM 的大部分核心功能已经稳定,并且已经实现了大部分 STARK 证明生成。我们仍在更改 VM 内部和外部接口,因此您应该预料到每个新版本都会有一些破坏性变更。
- 如果您想了解更多关于 Miden VM 如何工作的信息,请查看 [文档](https://docs.miden.xyz/miden-vm/)。
- 如果您想开始使用 Miden VM,请查看 [miden-vm](./miden-vm) crate。
- 如果您想了解更多关于 STARKs 的信息,请查看 [参考资料](#references) 部分。
### 状态和功能
VM 的下一个版本正在 [next](https://github.com/0xMiden/miden-vm/tree/next) 分支中进行开发;有关当前未发布版本以及每个过去版本中所做更改的列表,请参阅 [更新日志](https://github.com/0xMiden/miden-vm/blob/next/CHANGELOG.md)。
#### 功能亮点
Miden VM 是一个功能齐全的虚拟机。尽管针对零知识证明生成进行了优化,但它提供了人们从常规 VM 中期望的所有功能。仅举几例:
- **流程控制。** Miden VM 是图灵完备的,支持熟悉的流程控制结构,如条件语句和计数器/条件控制的循环。对最大循环次数或控制流逻辑的深度没有任何限制。
- **程序和执行上下文。** Miden 汇编程序可以分解为称为 _程序_ 的子例程,程序执行可以跨越多个隔离的上下文,每个上下文都有自己的专用内存空间。这些上下文分为 _根上下文_ 和 _用户上下文_。可以通过自定义内核调用从用户上下文访问根上下文。
- **内存。** Miden VM 支持读写随机存取内存。程序可以保留部分全局内存,以便更容易地管理局部变量。
- **丰富的指令集。** Miden VM 为 32 位无符号整数提供原生操作(算术、比较和位运算),以及使用 Poseidon2 哈希函数(VM 的原生哈希函数)计算哈希和验证 Merkle 路径的内置指令。
- **外部库。** Miden VM 支持根据预定义库编译程序。VM 附带这样一个库:Miden `miden-core-lib`,它增加了对 64 位无符号整数等内容的支持。开发人员可以构建其他类似的库,以适合其用例的方式扩展 VM 的功能。
- **非确定性**。与传统虚拟机不同,Miden VM 支持非确定性编程。这意味着证明者可以在 VM 之外做额外的工作,然后向 VM 提供 _提示_。这些提示可用于显着加快某些类型的计算,以及向 VM 提供秘密输入。
- **可自定义的主机。** Miden VM 可以使用用户定义的主机进行实例化。这些主机用于在执行/证明生成期间向 VM 提供外部数据(通过非确定性输入),并且可以将 VM 连接到任意数据源(例如,数据库或 RPC 调用)。
- **快速处理器执行模式。** 除了用于证明生成的跟踪生成处理器之外,Miden VM 还包括一个可以高达 320 MHz 的速度执行程序的快速处理器,从而实现快速的程序测试和调试。
- **预编译。** Miden VM 支持 [预编译](./docs/src/design/stack/precompiles.md),允许程序将昂贵的计算委托给主机,同时在 STARK 证明内生成可审计的证据。这可以有效地验证签名方案和哈希函数等操作,否则这些操作在 VM 中原生执行的成本高得令人望而却步。
#### 计划中的功能
在未来几个月中,我们计划完成 VM 的设计并实现对以下功能的支持:
- **递归证明。** Miden VM 将很快能够验证其自身执行的证明。这将实现无限递归证明,这是现实世界应用程序中非常有用的工具。
- **更好的调试。** Miden VM 将提供更好的调试体验,包括能够设置断点、更好的源映射以及更完整的程序分析信息。
#### 编译为 WebAssembly。
Miden VM 是用纯 Rust 编写的,可以编译为 WebAssembly。对于大多数 crate,默认链接 Rust 的 `std` 标准库。要编译到两个受支持的 `wasm32` 目标之一,请使用 `cargo` 的 `--no-default-features` 标志以确保不链接 Rust 标准库(*即,在 `no_std` 中编译*)。
#### 并发证明生成
当启用 `concurrent` 功能编译时,证明者将使用多个线程生成 STARK 证明。有关并发证明生成的好处,请查看下面的基准测试。
在内部,我们使用 [rayon](https://github.com/rayon-rs/rayon) 进行并行计算。因此,要控制用于生成 STARK 证明的线程数,您可以使用 `RAYON_NUM_THREADS` 环境变量。
### 项目结构
该项目组织成几个 crate,如下所示:
| Crate | Description |
| --------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| [core](core) | 包含定义 Miden VM 指令集、程序结构的组件,以及其他 crate 使用的一组实用函数。 |
| [assembly](crates/assembly) | 包含 Miden 汇编器。汇编器用于将 Miden 汇编源代码编译为 Miden VM 程序。 |
| [processor](processor) | 包含 Miden VM 处理器。处理器用于执行 Miden 程序并生成程序执行跟踪。然后,Miden 证明者使用这些跟踪来生成正确程序执行的证明。 |
| [air](air) | 包含 Miden VM 处理器逻辑的 _代数中间表示_ (AIR)。VM 在证明生成和验证期间使用此 AIR。 |
| [prover](prover) | 包含 Miden VM 证明者。证明者用于生成证明正确执行 Miden VM 程序的 STARK 证明。在内部,证明者使用 Miden 处理器来执行程序并生成执行跟踪。 |
| [verifier](verifier) | 包含一个轻量级验证器,可用于验证由 Miden VM 生成的程序执行证明。 |
| [miden-vm](miden-vm) | 将 Miden VM 处理器、证明者和验证器公开的功能聚合在一个位置,并为 Miden VM 提供 CLI 接口。 |
| [core-lib](crates/lib/core) | 包含 Miden 核心汇编库。Miden 核心库的目标是为常用的原语提供高度优化且经过实战检验的实现。 |
| [test-utils](crates/test-utils) | 包含用于测试 Miden VM 程序执行的实用程序。 |
## 文档
`docs/` 文件夹中的文档是使用 Docusaurus 构建的,并自动合并到主要的 [miden-docs](https://github.com/0xMiden/miden-docs) 仓库中,用于主文档网站。对 `next` 分支的更改会触发自动部署工作流。文档文件夹需要在构建之前安装 npm 包。
## 性能
下面的基准测试应仅作为对未来预期性能的粗略指南。许多优化尚未应用的原因,我们预计一旦我们花一些时间进行性能优化,速度就会有所提高。
关于性能的一些一般说明:
- 执行时间主要由证明生成时间主导。实际上,运行程序所需的时间通常不到生成证明所需时间的 0.01%。
- 证明验证时间非常快。在大多数情况下,它在 1 毫秒以下,但有时高达 2 毫秒或 3 毫秒。
- 证明生成过程是动态可调的。通常,在执行时间、证明大小和安全级别之间存在权衡(即,对于给定的安全级别,我们可以通过增加执行时间来减小证明大小,在一定范围内)。
- 证明生成和证明验证时间都受到 STARK 协议中使用的哈希函数的极大影响。在下面的基准测试中,我们使用 BLAKE3,这是一种非常快的哈希函数。
### 单核证明者性能
当在单个 CPU 核心上执行时,当前版本的 Miden VM 以大约 20 - 25 KHz 的速度运行。在下面的基准测试中,VM 在 Apple M4 Max CPU 上以单线程执行 [Blake3 示例](miden-vm/masm-examples/hashing/blake3_1to1/)程序。生成的证明具有 96 位的目标安全级别。
| VM cycles | Execution time | Proving time | RAM consumed | Proof size |
| :------------: | :------------: | :----------: | :----------: | :--------: |
| 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 | 11.1 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 位目标安全级别下为 220 个周期执行相同的 Blake3 示例程序:
| Machine | Execution time | Proving time | Execution % | Implied Frequency |
| ------------------------------ | :------------: | :----------: | :---------: | :---------------: |
| Apple M1 Pro (16 threads) | 14.5 ms | 14.7 sec | 0.1% | 70 KHz |
| Apple M4 Max (16 threads) | 11.1 ms | 5.9 sec | 0.2% | 170 KHz |
| Amazon Graviton 4 (64 threads) | 10.7 ms | 5.7 sec | 0.2% | 175 KHz |
| AMD EPYC 9R45 (64 threads) | 7.5 ms | 4.5 sec | 0.2% | 220 KHz |
| AMD Ryzen 9 9950X (16 threads) | 7.6 ms | 7.6 sec | 0.1% | 138 KHz |
| AMD Ryzen 9 9950X (32 threads) | 7.3 ms | 6.8 sec | 0.1% | 154 KHz |
### 适合递归的证明
上述基准测试中的证明是使用 BLAKE3 哈希函数生成的。虽然此哈希函数非常快,但在 Miden VM 中执行效率不高。因此,使用 BLAKE3 生成的证明不太适合递归证明验证。为了支持高效的递归证明,我们需要使用算术友好的哈希函数。Miden VM 原生支持 Poseidon2,就是这样一种哈希函数。算术友好哈希函数的缺点之一是它们明显比常规哈希函数慢。
在下面的基准测试中,我们在 96 位目标安全级别下使用 Poseidon2 哈希函数代替 BLAKE3 为 220 个周期执行相同的 Blake3 示例程序:
| Machine | Execution time | Proving time | Slowdown vs BLAKE3 |
| ------------------------------ | :------------: | :----------: | :----------------: |
| Apple M1 Pro (16 threads) | 14.5 ms | 31.9 sec | 2.2x| Apple M4 Max (16 threads) | 11.1 ms | 12.9 sec | 2.2x |
| Amazon Graviton 4 (64 threads) | 10.7 ms | 9.5 sec | 1.7x |
| AMD EPYC 9R45 (64 threads) | 7.5 ms | 8.6 sec | 1.9x |
| AMD Ryzen 9 9950X (16 threads) | 7.4 ms | 18.9 sec | 2.5x |
| AMD Ryzen 9 9950X (32 threads) | 7.3 ms | 14.8 sec | 2.2x |
## 参考资料
Miden VM 生成的执行证明基于 STARKs。STARK 是一种新颖的计算证明方案,允许您创建一个可高效验证的证明,证明计算已正确执行。该方案由 Eli Ben-Sasson、Michael Riabzev 等人在 Technion - Israel Institute of Technology 开发。STARK 不需要初始可信设置,并且依赖于非常少的加密假设。
以下是一些有关 STARKs 的学习资源:
- STARKs 白皮书:[Scalable, transparent, and post-quantum secure computational integrity](https://eprint.iacr.org/2018/046)
- STARKs 与 SNARKs:[A Cambrian Explosion of Crypto Proofs](https://nakamoto.com/cambrian-explosion-of-crypto-proofs/)
Vitalik Buterin 关于 zk-STARKs 的博客系列:
- [STARKs, part 1: Proofs with Polynomials](https://vitalik.eth.limo/general/2017/11/09/starks_part_1.html)
- [STARKs, part 2: Thank Goodness it's FRI-day](https://vitalik.eth.limo/general/2017/11/22/starks_part_2.html)
- [STARKs, part 3: Into the Weeds](https://vitalik.eth.limo/general/2018/07/21/starks_part_3.html)
Alan Szepieniec 的 STARK 教程:
- [Anatomy of a STARK](https://aszepieniec.github.io/stark-anatomy/)
- [BrainSTARK](https://aszepieniec.github.io/stark-brainfuck/)
StarkWare 的 STARK Math 博客系列:
- [STARK Math: The Journey Begins](https://medium.com/starkware/stark-math-the-journey-begins-51bd2b063c71)
- [Arithmetization I](https://medium.com/starkware/arithmetization-i-15c046390862)
- [Arithmetization II](https://medium.com/starkware/arithmetization-ii-403c3b3f4355)
- [Low Degree Testing](https://medium.com/starkware/low-degree-testing-f7614f5172db)
- [A Framework for Efficient STARKs](https://medium.com/starkware/a-framework-for-efficient-starks-19608ba06fbe)
StarkWare 的 STARK 教程:
- [STARK 101](https://starkware.co/stark-101/)
## 许可证
任何有意提交以包含在此存储库中的贡献,根据 Apache-2.0 许可证的定义,均应在 [MIT](./LICENSE-MIT) 和 [Apache 2.0](./LICENSE-APACHE) 许可证下获得双重许可,且不包含任何附加条款或条件。
标签:AI工具, Layer 2, Miden VM, Plonky3, Rollup, Rust, STARK, WASM, ZKP, 区块链, 可视化界面, 可验证计算, 密码学, 手动系统调用, 生成式AI安全, 网络流量审计, 虚拟机, 证明生成, 通知系统, 隐私计算, 零知识证明