Documentation Index
Fetch the complete documentation index at: https://mintlify.com/a16z/jolt/llms.txt
Use this file to discover all available pages before exploring further.
Overview
Opening proofs verify that polynomial evaluations claimed during sumchecks are correct with respect to committed polynomials. Jolt uses batched opening proofs to aggregate hundreds of evaluation checks into a single proof, dramatically reducing proof size and verification time.Role in the Proving System
Opening proofs are the final stage of proving:- Stage 8: Batched opening proofs
- Input: Opening claims accumulated across Stages 1-7
- Method: Batch all claims via random linear combination, prove via Dory
- Output: Single batched proof covering all polynomial evaluations
- Benefit: ~10x smaller proof size vs. individual opening proofs
Opening Accumulator Pattern
Jolt uses accumulators to collect opening claims during proving:Prover Accumulator
Verifier Accumulator
Opening ID Structure
- Polynomial: Which committed/virtual polynomial (e.g.,
RamInc,InstructionRa[3]) - Sumcheck ID: Which sumcheck stage produced the opening (e.g.,
RamReadWriteChecking)
Committed vs. Virtual Polynomials
Committed Polynomials
Definition: Polynomials explicitly committed by prover. Examples:RdInc: Increment polynomial for register destinationRamInc: Increment polynomial for RAM addressesInstructionRa[d]: Read-after polynomial for instruction lookups (d dimensions)BytecodeRa[d]: Read-after polynomial for bytecode lookupsRamRa[d]: Read-after polynomial for RAM accessesTrustedAdvice: Prover-supplied trusted witness dataUntrustedAdvice: Prover-supplied untrusted witness data
Virtual Polynomials
Definition: Polynomials derived from committed polynomials (not directly committed). Examples:InstructionFlags: One-hot encoding of instruction type (derived from trace)RegisterValues: Register contents (derived from trace + register checking)RamAddress,RamValue: Memory access address/value (derived from trace + RAM checking)PC: Program counter (derived from bytecode checking)
Batching Strategy
Jolt batches all openings via random linear combination:Batching Protocol
- Prover commits to all polynomials (one-time, at start)
- Sumcheck stages produce opening claims:
- Verifier samples random batching challenge
α - Prover constructs batched polynomial:
- Prover proves opening:
where
r_batchis a combined challenge point.
Soundness
With overwhelming probability, if any individual opening is incorrect:α preventing cancellation of errors.
Opening Points
Binding Order
Big-endian (BIG_ENDIAN):
- Challenges consumed from MSB to LSB
- Used for cycle-indexed polynomials (outer sumcheck)
LITTLE_ENDIAN):
- Challenges consumed from LSB to MSB
- Used for address-indexed polynomials (RAM/register checking)
Dory Commitment Scheme
Jolt uses Dory polynomial commitment:Key Properties
- Transparent setup: No trusted setup required
- Logarithmic proof size: O(log n) group elements for n-coefficient polynomial
- Efficient batching: Supports batching via random linear combination
- KZG-like structure: Based on inner-product arguments over elliptic curves
Commitment Process
Batched Dory Opening
Dory’s batching is native (not via random linear combination):ZK Mode: Evaluation Commitments
In ZK mode, evaluations are committed (not revealed):Standard Mode
ZK Mode
y_com matches evaluation without learning eval.
Stage 8: Opening Proof Generation
Prover Side
Verifier Side
Opening IDs by Stage
Stage 1 (Spartan Outer)
VirtualPolynomial::*(Az, Bz, instruction flags)
Stage 2 (Product Virtual + RAM)
CommittedPolynomial::RamRa[d](d dimensions)CommittedPolynomial::RamInc
Stage 3 (Registers + Bytecode)
CommittedPolynomial::RdIncCommittedPolynomial::BytecodeRa[d]
Stage 5 (Instruction Lookups)
CommittedPolynomial::InstructionRa[d]
Stage 7 (Claim Reductions)
- All
CommittedPolynomial::*at final reduction points TrustedAdvice/UntrustedAdvice(if present)
Stage 8 (Opening Proofs)
- Batches all above into single proof
Performance Characteristics
Prover Time
Stage 8 (Opening proofs):- O(num_openings · poly_size · log(poly_size)) field operations
- ~10-15% of total proving time
- Parallelized across polynomial groups
- Individual proofs: ~100ms per opening × 500 openings = 50s
- Batched proof: ~5s total (10x speedup)
Proof Size
Per opening (unbatched):- ~1KB per Dory opening proof
- Total: ~500KB for 500 openings
- ~50KB for all 500 openings (10x reduction)
Verifier Time
Stage 8 verification:- O(num_openings · log(poly_size)) field operations
- ~5-10ms for typical proofs
- Batching reduces constant factors
Memory Usage
Accumulator storage:- ~1KB per opening (point + eval + metadata)
- ~500KB for 500 openings
- Cleared after Stage 8 (not included in final proof)
Key Files
jolt-core/src/poly/opening_proof.rs:ProverOpeningAccumulator,VerifierOpeningAccumulatorjolt-core/src/poly/commitment/dory/: Dory commitment scheme implementationjolt-core/src/zkvm/prover.rs: Stage 8 prover logicjolt-core/src/zkvm/verifier.rs: Stage 8 verifier logic
Next Steps
- Spartan: How sumchecks produce opening claims
- RAM Checking: Major source of opening claims
- Instruction Execution: Lookup table opening claims