Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
19 commits
Select commit Hold shift + click to select a range
0f7d096
feat: split Stage 6 into 6a (address) and 6b (cycle) phases
quangvdao Jan 19, 2026
dcd9481
refactor: separate Address/Cycle provers into independent structs
quangvdao Jan 19, 2026
0f40a19
refactor(stage6): remove state handoff for booleanity/read-raf
quangvdao Jan 19, 2026
2df3d33
feat(zkvm): add bytecode claim reduction sumcheck
quangvdao Jan 20, 2026
e0228ac
feat(zkvm): add bytecode commitment mode config
quangvdao Jan 20, 2026
7246c0d
refactor(zkvm): rename BytecodeCommitmentMode → BytecodeMode (Full/Co…
quangvdao Jan 20, 2026
4b5f396
refactor(bytecode): separate bytecode preprocessing for Full/Committe…
quangvdao Jan 20, 2026
71ee2e1
refactor(zkvm): move e2e tests to dedicated tests.rs module
quangvdao Jan 20, 2026
f9e5fed
refactor(sdk): simplify preprocessing API
quangvdao Jan 20, 2026
0e30fa7
feat(zkvm): committed bytecode mode (AddressMajor)
quangvdao Jan 20, 2026
a491a8f
fix: add missing update_flamegraph method to BytecodeClaimReductionPr…
quangvdao Jan 20, 2026
5e4668c
chore: untrack bytecode-commitment-progress.md planning doc
quangvdao Jan 20, 2026
e596a43
ci: clear stale Dory URS cache before tests
quangvdao Jan 20, 2026
ed0c285
merge advice fix
quangvdao Jan 22, 2026
2e3ce40
Add standalone bytecode VMP computation function
quangvdao Jan 22, 2026
71006c6
Refactor vmp_bytecode_contribution to use standalone function
quangvdao Jan 22, 2026
0e54d88
Merge branch 'main' into quang/bytecode-commitment
quangvdao Jan 22, 2026
2139c53
Merge branch 'main' into quang/bytecode-commitment
quangvdao Jan 22, 2026
8d306d9
feat(bytecode): align bytecode context with main sigma for Stage 8 fo…
quangvdao Jan 22, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .github/workflows/rust.yml
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,8 @@ jobs:
path: ~/.jolt
- name: Install Jolt RISC-V Rust toolchain
run: cargo run install-toolchain
- name: Clear Dory URS cache
run: rm -rf ~/.cache/dory
- name: Install nextest
uses: taiki-e/install-action@nextest
- name: Run jolt-core tests
Expand Down
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -65,3 +65,4 @@ jolt-sdk/tests/fib_io_device_bytes.rs
jolt-sdk/tests/fib_proof_bytes.rs
jolt-sdk/tests/jolt_verifier_preprocessing_bytes.rs

bytecode-commitment-progress.md
4 changes: 2 additions & 2 deletions book/src/usage/guests_hosts/hosts.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ Hosts are where we can invoke the Jolt prover to prove functions defined within
The host imports the guest package, and will have automatically generated functions to build each of the Jolt functions. For the SHA3 example we looked at in the [guest](./guests.md) section, the `jolt::provable` procedural macro generates several functions that can be invoked from the host (shown below):

- `compile_sha3(target_dir)` to compile the SHA3 guest to RISC-V
- `preprocess_prover_sha3` and `verifier_preprocessing_from_prover_sha3` to generate the prover and verifier preprocessing. Note that the preprocessing only needs to be generated once for a given guest program, and can subsequently be reused to prove multiple invocations of the guest.
- `preprocess_sha3` and `verifier_preprocessing_from_prover_sha3` to generate the prover and verifier preprocessing. Note that the preprocessing only needs to be generated once for a given guest program, and can subsequently be reused to prove multiple invocations of the guest.
- `build_prover_sha3` returns a closure for the prover, which takes in the same input types as the original function and modifies the output to additionally include a proof.
- `build_verifier_sha3` returns a closure for the verifier, which verifies the proof. The verifier closure's parameters comprise of the program input, the claimed output, a `bool` value claiming whether the guest panicked, and the proof.

Expand All @@ -14,7 +14,7 @@ pub fn main() {
let target_dir = "/tmp/jolt-guest-targets";
let mut program = guest::compile_sha3(target_dir);

let prover_preprocessing = guest::preprocess_prover_sha3(&mut program);
let prover_preprocessing = guest::preprocess_sha3(&mut program);
let verifier_preprocessing =
guest::verifier_preprocessing_from_prover_sha3(&prover_preprocessing);

Expand Down
9 changes: 3 additions & 6 deletions examples/alloc/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,9 @@ pub fn main() {
let target_dir = "/tmp/jolt-guest-targets";
let mut program = guest::compile_alloc(target_dir);

let shared_preprocessing = guest::preprocess_shared_alloc(&mut program);
let prover_preprocessing = guest::preprocess_prover_alloc(shared_preprocessing.clone());
let verifier_preprocessing = guest::preprocess_verifier_alloc(
shared_preprocessing,
prover_preprocessing.generators.to_verifier_setup(),
);
let prover_preprocessing = guest::preprocess_alloc(&mut program);
let verifier_preprocessing =
guest::verifier_preprocessing_from_prover_alloc(&prover_preprocessing);

let prove_alloc = guest::build_prover_alloc(program, prover_preprocessing);
let verify_alloc = guest::build_verifier_alloc(verifier_preprocessing);
Expand Down
11 changes: 2 additions & 9 deletions examples/btreemap/host/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -17,19 +17,12 @@ pub fn btreemap() {
guest::compile_btreemap(target_dir)
});

let shared_preprocessing = step!("Preprocessing shared", {
guest::preprocess_shared_btreemap(&mut program)
});

let prover_preprocessing = step!("Preprocessing prover", {
guest::preprocess_prover_btreemap(shared_preprocessing.clone())
guest::preprocess_btreemap(&mut program)
});

let verifier_preprocessing = step!("Preprocessing verifier", {
guest::preprocess_verifier_btreemap(
shared_preprocessing,
prover_preprocessing.generators.to_verifier_setup(),
)
guest::verifier_preprocessing_from_prover_btreemap(&prover_preprocessing)
});

let prove = step!("Building prover", {
Expand Down
14 changes: 4 additions & 10 deletions examples/collatz/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,9 @@ pub fn main() {
let target_dir = "/tmp/jolt-guest-targets";
let mut program = guest::compile_collatz_convergence(target_dir);

let shared_preprocessing = guest::preprocess_shared_collatz_convergence(&mut program);
let prover_preprocessing =
guest::preprocess_prover_collatz_convergence(shared_preprocessing.clone());
let verifier_setup = prover_preprocessing.generators.to_verifier_setup();
let prover_preprocessing = guest::preprocess_collatz_convergence(&mut program);
let verifier_preprocessing =
guest::preprocess_verifier_collatz_convergence(shared_preprocessing, verifier_setup);
guest::verifier_preprocessing_from_prover_collatz_convergence(&prover_preprocessing);

let prove_collatz_single =
guest::build_prover_collatz_convergence(program, prover_preprocessing);
Expand All @@ -31,12 +28,9 @@ pub fn main() {
// Prove/verify convergence for a range of numbers:
let mut program = guest::compile_collatz_convergence_range(target_dir);

let shared_preprocessing = guest::preprocess_shared_collatz_convergence_range(&mut program);
let prover_preprocessing =
guest::preprocess_prover_collatz_convergence_range(shared_preprocessing.clone());
let verifier_setup = prover_preprocessing.generators.to_verifier_setup();
let prover_preprocessing = guest::preprocess_collatz_convergence_range(&mut program);
let verifier_preprocessing =
guest::preprocess_verifier_collatz_convergence_range(shared_preprocessing, verifier_setup);
guest::verifier_preprocessing_from_prover_collatz_convergence_range(&prover_preprocessing);

let prove_collatz_convergence =
guest::build_prover_collatz_convergence_range(program, prover_preprocessing);
Expand Down
29 changes: 22 additions & 7 deletions examples/fibonacci/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,16 +6,18 @@ pub fn main() {
tracing_subscriber::fmt::init();

let save_to_disk = std::env::args().any(|arg| arg == "--save");
let committed_bytecode = std::env::args().any(|arg| arg == "--committed-bytecode");

let target_dir = "/tmp/jolt-guest-targets";
let mut program = guest::compile_fib(target_dir);

let shared_preprocessing = guest::preprocess_shared_fib(&mut program);

let prover_preprocessing = guest::preprocess_prover_fib(shared_preprocessing.clone());
let verifier_setup = prover_preprocessing.generators.to_verifier_setup();
let prover_preprocessing = if committed_bytecode {
guest::preprocess_committed_fib(&mut program)
} else {
guest::preprocess_fib(&mut program)
};
let verifier_preprocessing =
guest::preprocess_verifier_fib(shared_preprocessing, verifier_setup);
guest::verifier_preprocessing_from_prover_fib(&prover_preprocessing);

if save_to_disk {
serialize_and_print_size(
Expand All @@ -26,7 +28,6 @@ pub fn main() {
.expect("Could not serialize preprocessing.");
}

let prove_fib = guest::build_prover_fib(program, prover_preprocessing);
let verify_fib = guest::build_verifier_fib(verifier_preprocessing);

let program_summary = guest::analyze_fib(10);
Expand All @@ -39,8 +40,22 @@ pub fn main() {
info!("Trace file written to: {trace_file}.");

let now = Instant::now();
let (output, proof, io_device) = prove_fib(50);
let (output, proof, io_device) = if committed_bytecode {
let prove_fib = guest::build_prover_committed_fib(program, prover_preprocessing);
prove_fib(50)
} else {
let prove_fib = guest::build_prover_fib(program, prover_preprocessing);
prove_fib(50)
};
info!("Prover runtime: {} s", now.elapsed().as_secs_f64());
info!(
"bytecode mode: {}",
if committed_bytecode {
"Committed"
} else {
"Full"
}
);

if save_to_disk {
serialize_and_print_size("Proof", "/tmp/fib_proof.bin", &proof)
Expand Down
6 changes: 2 additions & 4 deletions examples/hash-bench/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,9 @@ pub fn main() {
let target_dir = "/tmp/jolt-guest-targets";
let mut program = guest::compile_hashbench(target_dir);

let shared_preprocessing = guest::preprocess_shared_hashbench(&mut program);
let prover_preprocessing = guest::preprocess_prover_hashbench(shared_preprocessing.clone());
let verifier_setup = prover_preprocessing.generators.to_verifier_setup();
let prover_preprocessing = guest::preprocess_hashbench(&mut program);
let verifier_preprocessing =
guest::preprocess_verifier_hashbench(shared_preprocessing, verifier_setup);
guest::verifier_preprocessing_from_prover_hashbench(&prover_preprocessing);

let prove_hashbench = guest::build_prover_hashbench(program, prover_preprocessing);
let verify_hashbench = guest::build_verifier_hashbench(verifier_preprocessing);
Expand Down
9 changes: 3 additions & 6 deletions examples/malloc/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,9 @@ pub fn main() {
let target_dir = "/tmp/jolt-guest-targets";
let mut program = guest::compile_alloc(target_dir);

let shared_preprocessing = guest::preprocess_shared_alloc(&mut program);
let prover_preprocessing = guest::preprocess_prover_alloc(shared_preprocessing.clone());
let verifier_preprocessing = guest::preprocess_verifier_alloc(
shared_preprocessing,
prover_preprocessing.generators.to_verifier_setup(),
);
let prover_preprocessing = guest::preprocess_alloc(&mut program);
let verifier_preprocessing =
guest::verifier_preprocessing_from_prover_alloc(&prover_preprocessing);

let prove = guest::build_prover_alloc(program, prover_preprocessing);
let verify = guest::build_verifier_alloc(verifier_preprocessing);
Expand Down
9 changes: 3 additions & 6 deletions examples/memory-ops/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,9 @@ pub fn main() {
let target_dir = "/tmp/jolt-guest-targets";
let mut program = guest::compile_memory_ops(target_dir);

let shared_preprocessing = guest::preprocess_shared_memory_ops(&mut program);
let prover_preprocessing = guest::preprocess_prover_memory_ops(shared_preprocessing.clone());
let verifier_preprocessing = guest::preprocess_verifier_memory_ops(
shared_preprocessing,
prover_preprocessing.generators.to_verifier_setup(),
);
let prover_preprocessing = guest::preprocess_memory_ops(&mut program);
let verifier_preprocessing =
guest::verifier_preprocessing_from_prover_memory_ops(&prover_preprocessing);

let prove = guest::build_prover_memory_ops(program, prover_preprocessing);
let verify = guest::build_verifier_memory_ops(verifier_preprocessing);
Expand Down
9 changes: 3 additions & 6 deletions examples/merkle-tree/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,9 @@ pub fn main() {
let target_dir = "/tmp/jolt-guest-targets";
let mut program = guest::compile_merkle_tree(target_dir);

let shared_preprocessing = guest::preprocess_shared_merkle_tree(&mut program);
let prover_preprocessing = guest::preprocess_prover_merkle_tree(shared_preprocessing.clone());
let verifier_preprocessing = guest::preprocess_verifier_merkle_tree(
shared_preprocessing,
prover_preprocessing.generators.to_verifier_setup(),
);
let prover_preprocessing = guest::preprocess_merkle_tree(&mut program);
let verifier_preprocessing =
guest::verifier_preprocessing_from_prover_merkle_tree(&prover_preprocessing);

let leaf1: &[u8] = &[5u8; 32];
let leaf2 = [6u8; 32];
Expand Down
9 changes: 3 additions & 6 deletions examples/muldiv/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,9 @@ pub fn main() {
let target_dir = "/tmp/jolt-guest-targets";
let mut program = guest::compile_muldiv(target_dir);

let shared_preprocessing = guest::preprocess_shared_muldiv(&mut program);
let prover_preprocessing = guest::preprocess_prover_muldiv(shared_preprocessing.clone());
let verifier_preprocessing = guest::preprocess_verifier_muldiv(
shared_preprocessing,
prover_preprocessing.generators.to_verifier_setup(),
);
let prover_preprocessing = guest::preprocess_muldiv(&mut program);
let verifier_preprocessing =
guest::verifier_preprocessing_from_prover_muldiv(&prover_preprocessing);

let prove = guest::build_prover_muldiv(program, prover_preprocessing);
let verify = guest::build_verifier_muldiv(verifier_preprocessing);
Expand Down
15 changes: 5 additions & 10 deletions examples/multi-function/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,9 @@ pub fn main() {
let target_dir = "/tmp/jolt-guest-targets";
let mut program = guest::compile_add(target_dir);

let shared_preprocessing = guest::preprocess_shared_add(&mut program);
let prover_preprocessing = guest::preprocess_prover_add(shared_preprocessing.clone());
let verifier_setup = prover_preprocessing.generators.to_verifier_setup();
let prover_preprocessing = guest::preprocess_add(&mut program);
let verifier_preprocessing =
guest::preprocess_verifier_add(shared_preprocessing, verifier_setup);
guest::verifier_preprocessing_from_prover_add(&prover_preprocessing);

let prove_add = guest::build_prover_add(program, prover_preprocessing);
let verify_add = guest::build_verifier_add(verifier_preprocessing);
Expand All @@ -21,12 +19,9 @@ pub fn main() {
let target_dir = "/tmp/jolt-guest-targets";
let mut program = guest::compile_mul(target_dir);

let shared_preprocessing = guest::preprocess_shared_mul(&mut program);
let prover_preprocessing = guest::preprocess_prover_mul(shared_preprocessing.clone());
let verifier_preprocessing = guest::preprocess_verifier_mul(
shared_preprocessing,
prover_preprocessing.generators.to_verifier_setup(),
);
let prover_preprocessing = guest::preprocess_mul(&mut program);
let verifier_preprocessing =
guest::verifier_preprocessing_from_prover_mul(&prover_preprocessing);

let prove_mul = guest::build_prover_mul(program, prover_preprocessing);
let verify_mul = guest::build_verifier_mul(verifier_preprocessing);
Expand Down
21 changes: 7 additions & 14 deletions examples/overflow/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,7 @@ pub fn main() {
// An overflowing stack should fail to prove.
let target_dir = "/tmp/jolt-guest-targets";
let mut program = guest::compile_overflow_stack(target_dir);
let shared_preprocessing = guest::preprocess_shared_overflow_stack(&mut program);
let prover_preprocessing =
guest::preprocess_prover_overflow_stack(shared_preprocessing.clone());
let prover_preprocessing = guest::preprocess_overflow_stack(&mut program);
let prove_overflow_stack = guest::build_prover_overflow_stack(program, prover_preprocessing);

let res = panic::catch_unwind(|| {
Expand All @@ -23,8 +21,7 @@ pub fn main() {

// now lets try to overflow the heap, should also panic
let mut program = guest::compile_overflow_heap(target_dir);
let shared_preprocessing = guest::preprocess_shared_overflow_heap(&mut program);
let prover_preprocessing = guest::preprocess_prover_overflow_heap(shared_preprocessing.clone());
let prover_preprocessing = guest::preprocess_overflow_heap(&mut program);
let prove_overflow_heap = guest::build_prover_overflow_heap(program, prover_preprocessing);

let res = panic::catch_unwind(|| {
Expand All @@ -35,15 +32,11 @@ pub fn main() {
// valid case for stack allocation, calls overflow_stack() under the hood
// but with stack_size=8192
let mut program = guest::compile_allocate_stack_with_increased_size(target_dir);

let shared_preprocessing =
guest::preprocess_shared_allocate_stack_with_increased_size(&mut program);
let prover_preprocessing =
guest::preprocess_prover_allocate_stack_with_increased_size(shared_preprocessing.clone());
let verifier_preprocessing = guest::preprocess_verifier_allocate_stack_with_increased_size(
shared_preprocessing,
prover_preprocessing.generators.to_verifier_setup(),
);
let prover_preprocessing = guest::preprocess_allocate_stack_with_increased_size(&mut program);
let verifier_preprocessing =
guest::verifier_preprocessing_from_prover_allocate_stack_with_increased_size(
&prover_preprocessing,
);

let prove_allocate_stack_with_increased_size =
guest::build_prover_allocate_stack_with_increased_size(program, prover_preprocessing);
Expand Down
9 changes: 3 additions & 6 deletions examples/random/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,9 @@ pub fn main() {
let target_dir = "/tmp/jolt-guest-targets";
let mut program = guest::compile_rand(target_dir);

let shared_preprocessing = guest::preprocess_shared_rand(&mut program);
let prover_preprocessing = guest::preprocess_prover_rand(shared_preprocessing.clone());
let verifier_preprocessing = guest::preprocess_verifier_rand(
shared_preprocessing,
prover_preprocessing.generators.to_verifier_setup(),
);
let prover_preprocessing = guest::preprocess_rand(&mut program);
let verifier_preprocessing =
guest::verifier_preprocessing_from_prover_rand(&prover_preprocessing);

let prove = guest::build_prover_rand(program, prover_preprocessing);
let verify = guest::build_verifier_rand(verifier_preprocessing);
Expand Down
9 changes: 3 additions & 6 deletions examples/recover-ecdsa/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -31,12 +31,9 @@ pub fn main() {
let target_dir = "/tmp/jolt-guest-targets";
let mut program = guest::compile_recover(target_dir);

let shared_preprocessing = guest::preprocess_shared_recover(&mut program);
let prover_preprocessing = guest::preprocess_prover_recover(shared_preprocessing.clone());
let verifier_preprocessing = guest::preprocess_verifier_recover(
shared_preprocessing,
prover_preprocessing.generators.to_verifier_setup(),
);
let prover_preprocessing = guest::preprocess_recover(&mut program);
let verifier_preprocessing =
guest::verifier_preprocessing_from_prover_recover(&prover_preprocessing);

if save_to_disk {
serialize_and_print_size(
Expand Down
7 changes: 2 additions & 5 deletions examples/secp256k1-ecdsa-verify/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,9 @@ pub fn main() {
let target_dir = "/tmp/jolt-guest-targets";
let mut program = guest::compile_secp256k1_ecdsa_verify(target_dir);

let shared_preprocessing = guest::preprocess_shared_secp256k1_ecdsa_verify(&mut program);
let prover_preprocessing =
guest::preprocess_prover_secp256k1_ecdsa_verify(shared_preprocessing.clone());
let verifier_setup = prover_preprocessing.generators.to_verifier_setup();
let prover_preprocessing = guest::preprocess_secp256k1_ecdsa_verify(&mut program);
let verifier_preprocessing =
guest::preprocess_verifier_secp256k1_ecdsa_verify(shared_preprocessing, verifier_setup);
guest::verifier_preprocessing_from_prover_secp256k1_ecdsa_verify(&prover_preprocessing);

let prove_secp256k1_ecdsa_verify =
guest::build_prover_secp256k1_ecdsa_verify(program, prover_preprocessing);
Expand Down
9 changes: 3 additions & 6 deletions examples/sha2-chain/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,9 @@ pub fn main() {
let target_dir = "/tmp/jolt-guest-targets";
let mut program = guest::compile_sha2_chain(target_dir);

let shared_preprocessing = guest::preprocess_shared_sha2_chain(&mut program);
let prover_preprocessing = guest::preprocess_prover_sha2_chain(shared_preprocessing.clone());
let verifier_preprocessing = guest::preprocess_verifier_sha2_chain(
shared_preprocessing,
prover_preprocessing.generators.to_verifier_setup(),
);
let prover_preprocessing = guest::preprocess_sha2_chain(&mut program);
let verifier_preprocessing =
guest::verifier_preprocessing_from_prover_sha2_chain(&prover_preprocessing);

let prove_sha2_chain = guest::build_prover_sha2_chain(program, prover_preprocessing);
let verify_sha2_chain = guest::build_verifier_sha2_chain(verifier_preprocessing);
Expand Down
9 changes: 3 additions & 6 deletions examples/sha2-ex/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,9 @@ pub fn main() {
let target_dir = "/tmp/jolt-guest-targets";
let mut program = guest::compile_sha2(target_dir);

let shared_preprocessing = guest::preprocess_shared_sha2(&mut program);
let prover_preprocessing = guest::preprocess_prover_sha2(shared_preprocessing.clone());
let verifier_preprocessing = guest::preprocess_verifier_sha2(
shared_preprocessing,
prover_preprocessing.generators.to_verifier_setup(),
);
let prover_preprocessing = guest::preprocess_sha2(&mut program);
let verifier_preprocessing =
guest::verifier_preprocessing_from_prover_sha2(&prover_preprocessing);

let prove_sha2 = guest::build_prover_sha2(program, prover_preprocessing);
let verify_sha2 = guest::build_verifier_sha2(verifier_preprocessing);
Expand Down
Loading
Loading