ROOTVIELROOTVIEL
← Academy

Module 12 · Applied Zero-Knowledge: commitments, proving systems & on-chain privacy

Polynomial IOPs and modern proving systems

Modern proof systems are not monoliths; they are built from two separable layers. A polynomial IOP is the "algebra": it encodes a circuit's constraints as polynomials and defines what the prover sends and what the verifier queries. A polynomial commitment scheme is the "cryptography": it lets the verifier trust those polynomial evaluations without seeing the polynomials. The glue is the Schwartz–Zippel lemma — two different low-degree polynomials almost never agree at a random point, so checking an identity at one random challenge is as good as checking it everywhere. PLONK = PIOP + KZG, Halo2 = PIOP + IPA, STARKs = PIOP + FRI, and folding schemes (Nova) amortise a repeated computation before any PCS is applied. The layer you swap determines setup, proof size, verifier cost and post-quantum posture — but not the circuit.

Learning objective

Understand the architecture shared by almost every modern SNARK — a polynomial interactive oracle proof (PIOP) composed with a polynomial commitment scheme (PCS) — why the Schwartz–Zippel lemma lets a verifier check an entire computation at one random point, and how PLONK, Halo2, STARKs and folding schemes are different instantiations of the same template with different verification costs.

Track
Engineering
Module
12 · Applied Zero-Knowledge: commitments, proving systems & on-chain privacy
Prerequisites
Commitment schemes in depth: Pedersen, KZG and IPA · Arithmetic circuits and R1CS · Proving systems compared

Conceptual introduction

A SNARK has to do two conceptually separate things. First it must turn "this computation was done correctly" into a statement about polynomials — because polynomials have a magical rigidity that lets a tiny check stand in for an enormous one. Second it must let a verifier believe claims about those polynomials without receiving them, which is exactly the job of a commitment scheme. Modern designs keep these two jobs in separate layers: the polynomial IOP and the polynomial commitment scheme (PCS).

This separation is not academic tidiness; it is why the ecosystem can evolve. The same PIOP can be paired with KZG (small proofs, trusted setup), with IPA (transparent, logarithmic), or with FRI (transparent, plausibly post-quantum, larger). Swapping the PCS changes the trust and cost profile of the whole system without touching the circuit. If you understand the template, every named system becomes a point in a design space rather than a black box.

Note

The single most important idea in this lesson is the Schwartz–Zippel lemma. It is the reason a verifier can check a computation of a billion steps by evaluating a polynomial identity at one randomly chosen point. Everything else is machinery around that fact.

Why polynomials: the Schwartz–Zippel lemma

A non-zero polynomial of degree d over a field F has at most d roots. So if you pick a random point r from a large field, the chance that a non-zero degree-d polynomial happens to vanish there is at most d/|F|. For a 256-bit field and a circuit of a few million constraints, that probability is astronomically small — effectively zero.

synthetic — the lemma and its consequence (illustrative)
Schwartz-Zippel: for non-zero p of degree d over field F, Pr[ p(r) = 0 ] <= d / |F| (r chosen uniformly at random) With |F| ~ 2^256 and d ~ 10^6: Pr <= 10^6 / 2^256 ~ 0 # negligible Consequence used everywhere: to check "polynomials A(x) and B(x) are equal", it suffices to check A(r) == B(r) at ONE random r. If they differ, A - B is a non-zero low-degree polynomial, so it is almost certainly non-zero at a random r.

This is what collapses an enormous verification into a tiny one. Instead of re-checking every constraint, the prover encodes all n constraints into a polynomial T(x) that must vanish on a known set of points (one per constraint). If T really vanishes on all of them, then the "vanishing polynomial" Z_H(x) — the product of (x − ωⁱ) over those points — divides T, so there exists a quotient Q(x) with T(x) = Q(x)·Z_H(x). The verifier picks one random ζ and checks T(ζ) = Q(ζ)·Z_H(ζ). By Schwartz–Zippel, passing that single check means the divisibility holds with overwhelming probability, which means every constraint was satisfied.

Note

This is also where the challenge must be unpredictable. In a non-interactive proof the random ζ is produced by hashing the transcript (Fiat–Shamir). If the prover can influence or predict ζ before committing, it can cook polynomials that agree at exactly that point while differing everywhere else — a soundness break. Correct Fiat–Shamir is therefore part of the security argument, not an implementation detail; a later lesson in this module returns to how it goes wrong.

The polynomial IOP layer

A polynomial IOP is an interactive protocol in which the prover sends oracles to polynomials (you can imagine handing over a sealed box that answers "what is p at point z?") and the verifier sends random challenges and makes a few evaluation queries. It defines the algebra and nothing about cryptography.

Arithmetization
Turning a circuit into polynomial constraints. R1CS (rows of a·b = c) feeds Groth16-style systems; PLONKish arithmetization uses selector polynomials and a permutation argument; AIR (algebraic intermediate representation) with execution-trace columns feeds STARKs.
Selector / gate polynomials
In PLONK, fixed polynomials (q_L, q_R, q_O, q_M, q_C) that switch each gate between addition and multiplication, so one uniform constraint equation covers the whole circuit.
Permutation / copy constraints
How PLONK enforces that the same wire value appears in different gates — the "wiring" of the circuit — via a permutation argument over the trace.
Lookup argument
A way to prove a value lies in a precomputed table (e.g. a range or an S-box) far more cheaply than constraining it arithmetically; Plookup and its successors made range checks and bit operations practical.

The PIOP is where soundness is designed: which polynomials the prover must send, which identities they must satisfy, and which random points the verifier queries. It is completely independent of how those polynomials are committed. That independence is the whole point of the architecture.

Composing PIOP with a commitment scheme

A PIOP on its own is interactive and assumes the verifier can magically query polynomial oracles. Two steps make it a real SNARK. First, realise each oracle with a polynomial commitment scheme: the prover commits to the polynomial, and answers evaluation queries with the PCS's evaluation proofs. Second, remove interaction with Fiat–Shamir, deriving the verifier's challenges by hashing the transcript so far. The result is a non-interactive, publicly verifiable proof.

synthetic — the named systems as (PIOP + PCS) pairs (illustrative)
Polynomial IOP (the algebra: constraints, challenges, queries) | | realise oracles with a commitment scheme v Polynomial Commitment Scheme (the cryptography) KZG (trusted setup) ....... PLONK, Marlin -> small proofs, pairings IPA (transparent) ......... Halo2, Bulletproofs -> no setup, log-size, recursion FRI (transparent, hash) ... STARKs, Plonky2 -> no setup, plausibly post-quantum, larger, hashing-heavy Folding (Nova/SuperNova): amortise MANY identical steps into one instance BEFORE a final PCS/SNARK proves it once.

Because the two layers are separable, the same circuit and PIOP can target different deployment constraints by changing only the PCS. A team can prototype with KZG for small on-chain proofs and plan a migration to IPA (to drop the trusted setup) or to FRI (for post-quantum posture) without rewriting the circuit — exactly the modular roadmap real systems describe.

Folding: a different kind of amortisation

Folding schemes (Nova, and SuperNova for heterogeneous steps) attack a different problem: proving a computation that repeats the same step many times, such as a virtual-machine loop or a long rollup batch. Instead of producing one proof per step, folding combines ("folds") two instances of the step relation into a single instance of the same size, using a random challenge, so that N steps collapse into one accumulated instance that a final SNARK proves once.

The honest framing matters here. Folding is not itself a full zero-knowledge proof; it is an accumulation technique that happens before a PCS-backed SNARK closes it out. Its security rests on the folding step being binding (the random challenge makes a cheating prover unable to fold invalid instances into a valid-looking one), and a folded instance attests that a chain of steps was consistent — not that the step relation itself was the right one. As an earlier case study noted, a folding-based adapter may prove only a fragment of a check (the arithmetic structure) while leaving, for example, in-circuit signature verification outside its representation.

Note

Do not describe folding as "a smaller SNARK". It changes the prover's cost profile by amortising repeated work, but you still need a final argument (with its own PCS and setup profile) to verify the accumulated instance. The folding step and the final proof have distinct, separately-stated assumptions.

What verification does and does not establish

The verifier in every system above checks a polynomial identity at random challenge points via commitment openings. When it accepts, it has established — with overwhelming probability, under the PCS assumption and correct Fiat–Shamir — that the committed polynomials satisfy the circuit's constraints. That is a precise and powerful statement. It is also a narrow one.

It does not establish that the circuit encodes the intended computation (that is circuit correctness, audited separately), that the challenge was generated soundly (that is the Fiat–Shamir transcript), or that the setup was honest (for KZG-backed systems). For RootRaven, the discipline is to report the exact tuple: which PIOP, which PCS, which setup, which arithmetization — because "it produced a valid proof" is only as strong as that tuple, and a valid proof of a satisfied circuit is never a proof that the decision built on it was correct or safe.

Exercise

Note

A rollup team says: "Our prover folds 10,000 identical execution steps with Nova and then wraps the result in a Groth16 proof, so our on-chain verifier is tiny. Because it is all zero-knowledge, the trusted setup does not matter." Identify the separable layers in their design, state which assumptions each layer introduces, and correct the claim about the trusted setup.

Expected direction: The design has three layers. (1) Folding (Nova): amortises the 10,000 identical steps into one accumulated instance; its assumption is that the folding step is binding so invalid step instances cannot be folded into a valid-looking one, and it attests that a chain of steps was consistent — not that the step relation is the correct computation. Folding is not itself a full ZK proof. (2) The final SNARK (Groth16 = an R1CS PIOP + pairing-based commitment): proves the accumulated instance; this is where the on-chain verifier's small, constant-time check comes from. (3) The commitment/setup layer: Groth16 uses a pairing-based scheme with a circuit-specific trusted setup. The claim is wrong — the trusted setup very much matters: if its toxic waste survives, an attacker can forge a valid final proof for a false accumulated instance, breaking soundness regardless of zero-knowledge. Zero-knowledge is about hiding the witness; it says nothing about setup soundness. The honest statement names each layer's assumption separately.

Check your understanding

What does the Schwartz–Zippel lemma let a verifier do, and why is it sound?
It lets the verifier check a polynomial identity (and hence all the circuit's constraints) by evaluating it at a single random point instead of everywhere. It is sound because two distinct low-degree polynomials can agree at only a few points, so the probability a non-zero difference vanishes at a random point of a large field (≤ d/|F|) is negligible.
What are the two separable layers of a modern SNARK, and what does each decide?
The polynomial IOP (the algebra: arithmetization, which polynomials are sent, the constraint identities and the verifier's challenges/queries — where soundness is designed) and the polynomial commitment scheme (the cryptography: how polynomials are committed and evaluations proven — which decides setup, proof size, verifier cost and post-quantum posture). The PCS can be swapped without changing the circuit.
Express PLONK, Halo2 and STARKs as (PIOP + PCS) and give each one's headline setup/posture.
PLONK = PIOP + KZG (trusted setup, small proofs, pairing verification, not post-quantum); Halo2 = PIOP + IPA (transparent/no setup, logarithmic, supports recursion without pairings); STARKs = PIOP + FRI (transparent/no setup, hash-based, plausibly post-quantum, larger and hashing-heavy).
Why should folding (Nova) not be described as "just a smaller SNARK", and what does a folded instance attest?
Folding is an accumulation technique that amortises many identical steps into one instance before a final PCS-backed SNARK proves it; you still need that final argument with its own setup/assumptions. A folded instance attests that a chain of steps was mutually consistent under the step relation — not that the step relation was the correct computation, and a folding-based adapter may prove only the arithmetic fragment of a larger check.

References

  1. [1]Banco ZK — Vol. II (2025), Chapter 1 (polynomial IOPs, lookup arguments, accumulation, folding) — external educational reference
  2. [2]Gabizon, Williamson & Ciobotaru — PLONK (ePrint 2019/953)
  3. [3]Ben-Sasson, Bentov, Horesh & Riabzev — Scalable, Transparent, and Post-Quantum Secure Computational Integrity (STARKs, ePrint 2018/046)
  4. [4]Gabizon & Williamson — plookup: a simplified polynomial protocol for lookup tables (ePrint 2020/315)
  5. [5]Kothapalli, Setty & Tzialla — Nova: Recursive Zero-Knowledge Arguments from Folding Schemes (CRYPTO 2022)

References point to public, well-known technical sources for further study.

Related articles