a16z/jolt
GitHub: a16z/jolt
Jolt 是一个基于查找表技术的 RISC-V 零知识虚拟机,旨在以最简洁的架构实现快速、可扩展的通用 SNARK 证明。
Stars: 990 | Forks: 310
# Jolt

只需一个查找表。
Jolt 是一个面向 RISC-V 的 zkVM(零知识虚拟机),旨在成为同类通用方案中最简单、最快且最具可扩展性的实现。本仓库目前包含了 Jolt 针对 RISC-V 64 位基础整数指令集 + 用于整数乘除法的 M 标准扩展 + 用于原子操作的 A 标准扩展 + 用于压缩指令的 C 标准扩展(RV64IMAC)的实现。_欢迎贡献者!_
## 资源
### 文档
[The Jolt Book](https://jolt.a16zcrypto.com/)
- 🚧 目前正在更新中 🚧
### 论文
[Jolt: SNARKs for Virtual Machines via Lookups](https://eprint.iacr.org/2023/1217) \
Arasu Arun, Srinath Setty, Justin Thaler
[Twist and Shout: Faster memory checking arguments via one-hot addressing and increments](https://eprint.iacr.org/2025/105) \
Srinath Setty, Justin Thaler
[Unlocking the lookup singularity with Lasso
](https://eprint.iacr.org/2023/1216) \
Srinath Setty, Justin Thaler, Riad Wahby
### 博客文章
初始发布:
- [发布 Jolt](https://a16zcrypto.com/posts/article/a-new-era-in-snark-design-releasing-jolt/)
- [Jolt 初始实现常见问题解答](https://a16zcrypto.com/posts/article/faqs-on-jolts-initial-implementation/)
更新:
- 2024 年 11 月 12 日 [博客](https://a16zcrypto.com/posts/article/jolt-an-update/) [视频](https://a16zcrypto.com/posts/videos/an-update-on-jolts-development-roadmap/)
- 2025 年 8 月 18 日 (Twist and Shout 升级) [博客](https://a16zcrypto.com/posts/article/jolt-6x-speedup/)
- 2025 年 10 月 15 日 (Jolt 64 位证明) [博客](https://a16zcrypto.com/posts/article/64-bit-proving-jolt/)
### 背景
- [证明、论证与零知识](https://people.cs.georgetown.edu/jthaler/ProofsArgsAndZK.pdf)
## 快速入门
对于希望使用 Jolt 进行构建的开发者,请查看 [快速入门指南](https://jolt.a16zcrypto.com/usage/quickstart.html)。
对于希望为 Jolt 做贡献的开发者,请按照以下说明操作。
## 安装
你需要 Rust [nightly](./rust-toolchain.toml) 版本。
如果你已经安装了 `rustup`,则无需执行任何操作,因为它会在
首次调用 `cargo` 时自动安装正确的工具链以及任何附加目标。
克隆本仓库:
```git clone git@github.com:a16z/jolt.git```
要检查 `rustup` 是否选择了正确版本的 Rust,请在
克隆的仓库内运行 `rustup show`。
```cd jolt; rustup show```.
安装 Jolt CLI:
```cargo install --path .```
## 构建
本仓库使用 workspaces,每个 workspace 都可以单独构建,例如:
```cargo build -p jolt-core```
要实现更快的增量构建,请使用 `build-fast` 配置:
```cargo build --profile build-fast -p jolt-core```
## 测试
可以使用以下命令运行 `jolt-core` 的单元和端到端测试:
```cargo test -p jolt-core```
[`examples`](./examples/) 目录中的示例可以通过如下方式运行,例如:
```cargo run --release -p sha2-chain```
## 性能分析
### 执行性能分析
Jolt 使用 [tokio-rs/tracing](https://github.com/tokio-rs/tracing) 进行执行性能分析。
要生成追踪记录,请运行例如:
```cargo run --release -p jolt-core profile --name sha3 --format chrome```
其中 `--name` 可以是 `sha2`、`sha3`、`sha2-chain`、`fibonacci` 或 `btreemap`。相应的客户端程序可以在 [`examples`](./examples/) 目录中找到。基准测试输入在 [`bench.rs`](./jolt-core/src/benches/bench.rs) 中提供。
上面的命令将在工作空间根目录输出一个名为 `trace-.json` 的 JSON 文件,可以在 [Perfetto](https://ui.perfetto.dev/) 中查看。
为了在追踪记录中轻松查看 CPU 和内存使用情况,你可以使用 `--features monitor`,它将会把这些指标记录为 tracing 事件:
```
cargo run --release --features monitor -p jolt-core profile --name sha3 --format chrome
# 将 counter 事件转换为 Perfetto counter track,以便于可视化
python3 scripts/postprocess_trace.py benchmark-runs/perfetto_traces/*.json
```
你还可以启用 pprof 进行详细的 CPU 性能分析:
```cargo run --release --features pprof -p jolt-core profile --name sha3 --format chrome```
这会生成一个 `.pb` 配置文件,你可以在 [pprof](https://github.com/google/pprof) 中查看它:
```go tool pprof -http=:8080 target/release/jolt-core benchmark-runs/pprof/sha3_prove.pb```
### 内存性能分析
Jolt 使用 [allocative](https://github.com/facebookexperimental/allocative) 进行内存性能分析。
Allocative 允许你(递归地)测量实现了 `Allocative` trait 的数据结构所占用的堆空间总量,并可选地生成火焰图。
在 Jolt 中,大多数 sumcheck 数据结构都实现了 `Allocative` trait,我们会在阶段 2-5 的开始和结束时生成火焰图(参见 [`jolt_dag.rs`](https://github.com/a16z/jolt/blob/main/jolt-core/src/zkvm/dag/jolt_dag.rs))。
要生成 allocative 输出,请运行:
```RUST_LOG=debug cargo run --release --features allocative -p jolt-core profile --name sha3 --format chrome```
如上所述,`--name` 可以是 `sha2`、`sha3`、`sha2-chain`、`fibonacci` 或 `btreemap`。
上面的命令会将内存使用信息记录到命令行,并输出多个 SVG 文件,例如 `stage3_start_flamechart.svg`,可以在你选择的网络浏览器中查看。
### 调试
Jolt 的模拟器 Tracer 目前不支持附加调试器。
但是,它支持客户端程序中发生 panic 时的回溯。
默认情况下,发布版本的客户端 ELF 会被剥离符号,因此回溯不会包含太多信息。
调试/开发版本会自动保留符号。
#### 回溯标志
根据你的工作流,有两种方法可以启用回溯支持:
- **`JOLT_BACKTRACE=1`** — 临时调试;在你的 shell 中设置它,客户端
在重新构建时会自动保留符号。调用堆栈总是会被捕获;这
只是启用了符号解析(函数名,文件:行号)。使用
`JOLT_BACKTRACE=full` 可获取寄存器快照 + 每一帧的周期计数。
JOLT_BACKTRACE=1 cargo run --release -p example
JOLT_BACKTRACE=full cargo run --release -p example
- **`#[jolt::provable]` 中的 `backtrace = "dwarf"`** — 将符号保留 +
`-Cforce-frame-pointers=yes` 烘焙到构建中。当你总是希望为客户端
提供完整的调试支持时(测试程序、专用的调试构建),或者当
你需要帧指针用于 ZeroOS 级别的堆栈展开 / 外部工具时,请使用此选项。
正常的调试不需要它——`JOLT_BACKTRACE=1` 足以应对大多数情况。
#[jolt::provable(backtrace = "dwarf")]
fn my_function(input: u64) -> u64 { ... }
有效值:`"off"`、`"dwarf"`、`"frame-pointers"`。
你还可以通过 `jolt build --backtrace enable` 直接控制符号保留。
#### 打印与追踪
为了进一步协助调试,Jolt 在客户端程序中支持 `print!` 和 `println!` 宏。对于 `no_std` 客户端,可通过 `use jolt::println;` 导入宏。当启用 std 时,将自动使用标准的 `println!`。
在调试客户端程序的问题时,建议为你的 `#[jolt::provable]` 函数使用相应的 `trace_analyze`。这会跳过实例化证明器,从而实现更快的迭代。
## AI 编程技能
Jolt 附带了一个 [agent 技能](https://vercel.com/docs/agent-resources/skills),可以教导 AI 编程代理(Claude Code、Cursor、Codex 等)如何将 Rust 函数包装在 Jolt 零知识证明中。
```
npx skills add a16z/jolt
```
备用方案 (Claude Code / Codex):
```
curl -sfL jolt.rs/skill | bash
```
## CI 基准测试
我们已经启用了 [CI 期间的基准测试](https://a16z.github.io/jolt/dev/bench/),以随时间追踪证明器运行时间和峰值内存使用方面的性能变化。
## 致谢
_本仓库最初是 的一个分支。原始 Spartan [代码](https://github.com/microsoft/Spartan) 由 Srinath Setty 编写。_
## 许可
Jolt 在以下两个许可证下供你自行选择进行双重许可:MIT 许可证(参见 [LICENSE-MIT](https://github.com/a16z/jolt/blob/main/LICENSE-MIT))和 Apache 许可证(参见 [LICENSE-APACHE](https://github.com/a16z/jolt/blob/main/LICENSE-APACHE))。
Jolt 版权所有 (c) a16z 2023。但是,Jolt 代码库的某些部分是第三方代码的修改或移植,如相关代码的代码头或我们在此类代码目录中包含的版权归属声明所示。
## 免责声明
_本代码按“原样”提供。不对代码的安全性或正确性作任何明示或暗示的保证、陈述或担保。该代码未经审计,因此无法保证它能按预期工作,用户可能会遇到延迟、失败、错误、遗漏或传输信息丢失的情况。本仓库中的任何内容均不应被解释为针对任何特定事实或情况的投资建议或法律建议,也不旨在替代称职的法律顾问。强烈建议您就相关问题和疑虑联系您所在司法管辖区内信誉良好的律师。a16z 对上述内容的任何使用不承担责任,用户应谨慎行事并自行承担风险。有关更多信息,请参阅 a16z.com/disclosures。_
标签:a16z crypto, DNS解析, Jolt, Lasso, RISC-V, RV64IMAC, SNARK, Web3, zkVM, 加密算法, 区块链基础设施, 区块链开发, 可视化界面, 可验证计算, 密码学, 开源项目, 形式化验证, 手动系统调用, 智能合约隐私, 查表算法, 虚拟机执行, 通知系统, 链下计算, 零知识技术栈, 零知识虚拟机, 零知识证明