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