Skip to main content
Batched polynomial openings allow the prover to create a single proof that demonstrates the correct evaluation of multiple committed polynomials at potentially different points. This optimization is critical for Jolt’s efficiency, as each proof stage requires opening dozens of polynomials.

Overview

Instead of creating N separate opening proofs for N polynomials:
  1. Prover commits to all polynomial evaluations
  2. Verifier samples a random batching challenge
  3. Prover creates a single opening proof for the random linear combination
  4. Verifier checks one combined opening instead of N individual proofs

Opening Accumulator Pattern

Jolt uses an accumulator pattern to collect opening claims throughout the proof:

Usage Pattern

During sumcheck stages:
After all sumchecks:

Batching Strategies

Same-Point Batching

When multiple polynomials are opened at the same point r:
Benefit: Single KZG/Dory opening proof instead of N proofs.

Different-Point Batching

When polynomials are opened at different points r₁, ..., rₙ:
Jolt’s implementation handles this transparently in the Dory opening proof.

Dory Batched Openings

Dory (Jolt’s default commitment scheme) supports efficient batching:

Tier-Based Structure

Batching Flow

  1. Accumulation Phase (during sumcheck stages):
  2. Batching Phase (after all sumchecks):
  3. Opening Proof Generation:

Zero-Knowledge Mode

In ZK mode, opening proofs must not reveal polynomial evaluations:

Standard Mode

ZK Mode

BlindFold later proves that these committed evaluations are correct.

Performance Impact

Cost Comparison

Where:
  • N = number of polynomials
  • M = polynomial size (commitment time)
  • V = opening verification cost

Concrete Example: Jolt Stage 8

Stage 8 performs a single batched Dory opening for all polynomials accumulated across stages 1-7:
  • Polynomials opened: 50-100+ (depends on program)
  • Batched into: 1 Dory opening proof
  • Prover speedup: ~10-20x vs. individual openings
  • Proof size reduction: ~30-50x

Transcript Optimization

Critical change in Jolt’s BlindFold branch:
On this branch, ProverOpeningAccumulator::append_* and VerifierOpeningAccumulator::append_* do NOT append claims to the Fiat-Shamir transcript (the transcript parameter was removed). Both sides are consistent. On main, these methods DO append opening_claim scalars.
This eliminates redundant transcript operations during accumulation.

Implementation Details

Opening Claim Structure

Accumulator Methods

Usage in Jolt Proof Stages

Each sumcheck stage accumulates openings:

References