Zero Knowledge: BlindFold

Jolt achieves zero-knowledge natively via the BlindFold protocol — a folding-based scheme that makes all sumcheck proofs ZK without SNARK composition. Unlike approaches that require per-round sigma protocols or expensive homomorphic operations on commitments, BlindFold defers all verification to a single small R1CS instance proved via Nova folding + Spartan, keeping most of the work in the field arithmetic layer.

The core idea: instead of the prover sending sumcheck round polynomial coefficients in the clear, it sends Pedersen commitments to them. The sumcheck verifier's algebraic consistency checks are encoded into a small verifier R1CS circuit, and a single Nova fold + Spartan proof over this R1CS proves all rounds were executed correctly without revealing the witness.

Background

In standard (non-ZK) Jolt, each sumcheck round reveals the round polynomial's coefficients — typically 4 field elements per round for degree-3 sumchecks. The verifier checks:

  1. Round consistency:
  2. Chaining:
  3. Final binding: the last round's evaluation matches a claimed polynomial opening

These checks are purely algebraic — linear and quadratic relations over field elements. This makes them amenable to R1CS encoding.

The ZK challenge is: how do we let the verifier perform these checks without seeing the coefficients?

Protocol overview

BlindFold proceeds in six phases, executed after all of Jolt's sumcheck stages (Spartan, instruction lookups, RAM/register checking, bytecode, claim reductions) complete.

Phase 1: ZK sumcheck rounds

During each of the 7 sumcheck stages, prove_zk replaces the standard sumcheck prover:

Per round, the prover:

  1. Computes the batched univariate polynomial as usual
  2. Commits to all coefficients via Pedersen:
  3. Appends (not the coefficients) to the Fiat-Shamir transcript
  4. Derives the challenge from the transcript
  5. Saves coefficients , blinding , and commitment for later R1CS witness construction

The verifier receives only commitments. It derives the same challenges (since it hashes the same commitments) but cannot check round consistency without knowing the coefficients. That verification is deferred to BlindFold.

Uni-skip first rounds (used in Spartan outer and product sumchecks) follow the same pattern: commit, derive challenge, cache.

Phase 2: Verifier R1CS construction

Both prover and verifier deterministically construct a sparse R1CS that encodes the sumcheck verifier's checks. The R1CS operates over a witness vector with a Hyrax grid layout:

where is the relaxation scalar (1 for non-relaxed instances) and is the witness arranged as an grid:

  • Rows : coefficient rows (one per sumcheck round, zero-padded to columns)
  • Rows : non-coefficient values (next claims, Horner intermediates, opening evaluations)

Constraints encoded per sumcheck round:

For standard sumcheck ( of degree ):

  • Sum constraint:
  • Chain constraint: , computed via Horner's method with auxiliary variables

For uni-skip rounds:

  • Power-sum constraint: , where over the symmetric evaluation domain

Additional constraints:

  • Final output binding: At chain end, relates the last sumcheck claim to batched polynomial evaluations
  • Input claim binding: At chain start, verifies the initial claim is correctly derived from prior stage openings via sum-of-products constraints
  • PCS evaluation binding: Relates Dory evaluation commitments to witness variables

Baked public inputs: Fiat-Shamir-derived values (challenges , initial claims, batching coefficients) are embedded directly into R1CS matrix coefficients rather than appearing as witness variables. Both prover and verifier derive these identically from the transcript, so the resulting matrices , , are identical. This keeps the witness vector minimal.

Phase 3: Nova folding

The prover holds a satisfying witness for the verifier R1CS. To hide it:

  1. Sample random instance: Generate a random satisfying pair for the same R1CS (with random coefficients and consistent constraints)
  2. Compute cross-term:
  3. Commit cross-term rows: Commit each row of (in grid) with Pedersen
  4. Derive folding challenge:
  5. Fold: , ,

The folded instance satisfies relaxed R1CS:

The random instance acts as a one-time pad: knowing alone reveals nothing about .

Row commitments fold homomorphically. The round commitments from Phase 1 serve as the real instance's coefficient-row commitments, so no additional group operations are needed for those rows.

Phase 4: Spartan outer sumcheck

Proves the folded relaxed R1CS is satisfied via the standard Spartan sumcheck:

where is a verifier challenge and the sum is over all constraints (padded to a power of two). The round polynomial has degree 3 ( is the cubic term).

After rounds, the verifier holds evaluation claims , , at the challenge point , plus .

Phase 5: Spartan inner sumcheck

Each of , , decomposes as a public contribution (from the column and baked constants) plus a witness contribution. The inner sumcheck reduces the witness contributions to a single evaluation :

where is a structured polynomial derived from the sparse R1CS matrices and outer challenges , and are verifier challenges. The round polynomial has degree 2.

After rounds, the verifier needs .

Phase 6: Hyrax-style openings

The witness and error are committed row-wise (as Pedersen commitments over the Hyrax grid). To prove evaluations at points and respectively:

For : Split where , .

  1. Compute the combined row: and combined blinding
  2. Send and to verifier
  3. Verifier checks:
  4. Verifier computes:

The opening follows the same pattern over the grid.

The coefficient-row commitments are exactly the Pedersen commitments from Phase 1 — no additional commitments needed.

Integration with Jolt

BlindFold sits at Stage 8 of the Jolt prover pipeline, after all sumcheck stages complete:

StageProtocolBlindFold role
1Spartan outer (uni-skip)Collect round commitments, stage configs
2RAM read-write, product virtual, instruction claim reduction, RAM RAF eval, output check (uni-skip)Collect round commitments, stage configs
3Spartan shift, instruction input, registers claim reductionCollect round commitments, stage configs
4Registers read-write, RAM val evaluation, RAM val finalCollect round commitments, stage configs
5Instruction read-RAF, RAM RA reduction, registers val evaluationCollect round commitments, stage configs
6Bytecode read-RAF, booleanity, Hamming booleanity, RA virtual, inc reduction, advice reductionCollect round commitments, stage configs
7Hamming weight claim reduction, advice reduction (address phase)Collect round commitments, stage configs
8Batched opening proof + BlindFoldBuild R1CS, fold, prove

Each stage contributes:

  • Round commitments: Pedersen commitments to sumcheck polynomial coefficients
  • Stage configs: Round count, polynomial degree, chain structure, uni-skip power sums, output/input constraints

The ProverOpeningAccumulator collects ZkStageData — coefficients, blindings, challenges — across all stages.

Dory ZK evaluation commitments

The Dory polynomial commitment scheme is extended with ZK evaluation commitments. Instead of revealing the polynomial evaluation in the clear, the prover sends a Pedersen commitment and proves consistency within the Dory opening proof.

BlindFold's extra constraints verify that matches the folded evaluation and blinding values, binding the PCS to the BlindFold witness.

Verification

The verifier:

  1. Derives challenges from round commitments (same Fiat-Shamir transcript)
  2. Constructs the verifier R1CS deterministically from stage configs and baked public inputs
  3. Reconstructs the real instance from round commitments (proof data) with ,
  4. Absorbs the random instance from the proof
  5. Folds the two instances using the cross-term commitments and derived challenge
  6. Verifies Spartan outer sumcheck ( rounds, degree-3 polynomials)
  7. Verifies Spartan inner sumcheck ( rounds, degree-2 polynomials)
  8. Checks Hyrax openings: verifies and against folded row commitments
  9. Checks evaluation commitments: verifies consistency for each PCS opening

The verifier never sees polynomial coefficients, intermediate claims, or evaluation values from any sumcheck stage.

Security

  • Hiding: Pedersen commitments are computationally hiding under the discrete logarithm assumption. The prover's sumcheck messages reveal no information about the witness polynomials.
  • Binding: Pedersen commitments are computationally binding. A malicious prover cannot open a commitment to different coefficients.
  • Folding soundness: The folded instance satisfies relaxed R1CS if and only if both constituent instances do (with overwhelming probability over the folding challenge).
  • Extraction: An extractor can recover the real witness from two accepting transcripts with different folding challenges (via rewinding).

References

  • Hyrax — Matrix-commitment-based polynomial evaluation proofs (Wahby et al., 2018)
  • Nova — Recursive SNARKs via folding (Kothapalli, Setty, Tzialla, 2022)
  • Spartan — Sumcheck-based R1CS proving (Setty, 2020)
  • Proofs, Arguments, and Zero-Knowledge, Section 13.2 — ZK sumcheck via Pedersen commitments (Thaler, 2022)
  • Vega — Low-latency zero-knowledge proofs over existing credentials (Kaviani, Setty, 2025)
  • BlindFold interactive explainer