Jolt

仅一张查找表。
Jolt 是一款面向 RISC-V 的 zkVM(零知识虚拟机),旨在成为同类中最简单、最快且最具可扩展性的通用型产品。本仓库当前包含 Jolt 针对 RISC-V 64 位基础整数指令集 + M 标准扩展(整数乘除法)+ A 标准扩展(原子操作)+ C 标准扩展(压缩指令)(RV64IMAC)的实现。欢迎贡献者!
资源
文档
- 🚧 正在更新中 🚧
论文
Jolt: SNARKs for Virtual Machines via Lookups
Arasu Arun, Srinath Setty, Justin Thaler
Twist and Shout: Faster memory checking arguments via one-hot addressing and increments
Srinath Setty, Justin Thaler
Unlocking the lookup singularity with Lasso
Srinath Setty, Justin Thaler, Riad Wahby
博客文章
首次发布:
更新:
背景
快速入门
[!NOTE] Jolt 目前处于 alpha 阶段,尚不适合生产环境使用。
对于希望使用 Jolt 进行开发的开发者,请参阅 快速入门指南。
对于希望为 Jolt 做出贡献的开发者,请遵循以下说明。
安装
你需要在 rust-toolchain.toml 中固定 Rust 工具链。
如果你已安装 rustup,则无需执行任何操作,因为首次调用 cargo 时会自动安装正确的工具链及任何附加目标。
克隆此仓库:
git clone git@github.com:a16z/jolt.git
要检查 rustup 是否选择了正确的 Rust 版本,请在克隆的仓库中运行 rustup show
cd jolt; rustup show.
安装 Jolt CLI:
cargo install --path .
构建
本仓库使用工作区,每个工作区都可以单独构建,例如
cargo build -p jolt-prover-legacy
为了更快的增量构建,请使用 build-fast 配置文件:
cargo build --profile build-fast -p jolt-prover-legacy
测试
可以使用以下命令运行 jolt-prover-legacy 的单元测试和端到端测试:
cargo nextest run -p jolt-prover-legacy --features host
examples 目录中的示例可以使用例如
cargo run --release -p sha2-chain
性能分析
执行分析
Jolt 使用 tokio-rs/tracing 进行执行分析。
要生成跟踪,请运行例如
cargo run --release -p jolt-prover-legacy profile --name sha3 --format chrome
其中 --name 可以是 sha2、sha3、sha2-chain、sha3-chain、fibonacci 或 btreemap。相应的来宾程序可以在 examples 目录中找到。基准测试输入在 e2e_profiling.rs 中提供。
上述命令将在工作区根目录输出一个名为 trace-<timestamp>.json 的 JSON 文件,可以在 Perfetto 中查看。
为了轻松查看跟踪中的 CPU 和内存使用情况,您可以使用 --features monitor,它将把这些指标记录为跟踪事件:
cargo run --release --features monitor -p jolt-prover-legacy profile --name sha3 --format chrome
# Converts counter events into Perfetto counter tracks for easier visualization
python3 scripts/postprocess_trace.py benchmark-runs/perfetto_traces/*.json
您也可以启用 pprof 以进行详细的 CPU 性能分析:
cargo run --release --features pprof -p jolt-prover-legacy profile --name sha3 --format chrome
这将生成一个 .pb 配置文件,您可以在 pprof 中查看:
go tool pprof -http=:8080 target/release/jolt-prover-legacy benchmark-runs/pprof/sha3_prove.pb
内存剖析
Jolt 使用 allocative 进行内存剖析。
Allocative 允许你(递归地)测量实现了 Allocative trait 的数据结构所占用的总堆空间,并可选择生成火焰图。
在 Jolt 中,大多数 sumcheck 数据结构实现了 Allocative trait,我们在第 2-7 阶段的开始和结束时生成火焰图(参见 prover.rs)。
要生成 allocative 输出,请运行:
RUST_LOG=debug cargo run --release --features allocative -p jolt-prover-legacy profile --name sha3 --format chrome
其中,如上所述,--name 可以是 sha2、sha3、sha2-chain、fibonacci 或 btreemap。
上述命令会将内存使用信息记录到命令行,并输出多个 SVG 文件,例如 stage3_start_flamechart.svg,可以在您选择的 Web 浏览器中查看。
调试
Tracer,Jolt 的模拟器,目前不支持附加调试器。
然而,它支持针对来宾程序中发生的 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 -
backtrace = "dwarf"in#[jolt::provable]— 将符号保留 +-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 skill,用于教导 AI 编码代理(Claude Code、Cursor、Codex 等)如何将 Rust 函数封装在 Jolt 零知识证明中。
npx skills add a16z/jolt
Fallback (Claude Code / Codex):
curl -sfL jolt.rs/skill | bash
CI 基准测试
我们已启用 CI 期间的基准测试,以跟踪证明器运行时间和峰值内存使用量随时间的性能变化。
致谢
本仓库最初是 https://github.com/arkworks-rs/spartan 的分支。原始 Spartan 代码 由 Srinath Setty 编写。
许可
Jolt 根据以下两种许可证双重授权,供您自行选择:MIT 许可证(参见 LICENSE-MIT)和 Apache 许可证(参见 LICENSE-APACHE)。
Jolt 的版权 (c) 归 a16z 2023 所有。然而,Jolt 代码库的某些部分是第三方代码的修改或移植,如适用代码头中此类代码的指示或我们在此类代码目录中包含的版权归属声明所示。
免责声明
本代码按原样提供。对于代码的安全性或正确性,不作任何明示或暗示的保证、陈述或担保。该代码未经审计,因此无法确保其按预期运行,用户可能会遇到延迟、故障、错误、遗漏或传输信息丢失。本仓库中的任何内容均不应被解释为针对任何特定事实或情况的投资建议或法律建议,也不旨在替代专业法律顾问。强烈建议您就相关问题或疑虑联系您所在司法管辖区的信誉良好的律师。a16z 对上述内容的任何使用概不负责,用户应谨慎操作并自行承担风险。更多信息请参阅 a16z.com/disclosures。