What problem are we solving?
Part 1 built Zinc-PIOP: a polynomial interactive oracle proof over for integer-arithmetic relations. Sample a random prime , project the witness through , run a Spartan-shaped sum-check inside . Lemma 2.1 from Part 1 carried the whole soundness story — a bounded-bit-size witness can fool at most primes, so random-prime sampling catches cheats.
A PIOP isn’t a real argument though. To compile, we need a polynomial commitment scheme that:
- Works over , not . The PIOP’s witness oracle is multilinear with rational coefficients.
- Extracts to bit-size-bounded rationals. Lemma 2.1 only bites when the extracted witness has bounded entries. A generic -PCS gives unbounded extraction, which kills soundness.
- Doesn’t use hidden-order groups. The whole point of Zinc was to dodge the RSA-style assumptions CHA24 inherits.
That PCS is Zip. It’s a Brakedown variant — Merkle-commit encoded rows of the coefficient matrix — built around a new primitive: the IOP of Proximity to the Integers (IOPP-to-). Plus a new linear code, JEA (Juxtaposed Expand-Accumulate), that survives the move from to without bit-size blowup.
This part: Zip’s contract, the commit/test/eval phases, the two combinatorial lemmas that drive its soundness, JEA codes, the extractor wrinkle, and how the pipeline compiles to a hash-only succinct argument via iCOS.
Prerequisites. Multilinear polynomials, the equality polynomial , and the sum-check protocol (the Spartan article covers all three). Comfort with the projection and the localization from Part 1. We build up Brakedown from scratch next, no prior exposure needed.
Brakedown in a Nutshell
Zip is a Brakedown variant, so spend a minute on Brakedown first. Original setting: . Goal: commit to a multilinear with coefficients in , later prove for a query point and value .
The tensor identity
This is the engine the whole scheme rides on, so let’s derive it from scratch. A multilinear polynomial in variables is determined by its values on the boolean hypercube , via
where is the multilinear extension of the equality indicator (the “selector” that’s 1 when on the cube and 0 elsewhere — see Spartan for the underlying MLE machinery).
Now assume is even and split it as . Write and , each half of length . Because is a product over coordinates, it factors:
Substituting:
Set and define the coefficient matrix by , plus the equality vectors
The double sum collapses to a quadratic form:
That’s the tensor identity — evaluating a multilinear at becomes “row-combine the matrix with , then column-combine with .” Brakedown’s commit phase commits to the matrix; the eval phase rides this identity.
(This is the form Brakedown uses verbatim, modulo notation. The Brakedown paper writes it as — same equation with the matrix flattened into a vector.)
Worked example, carried through the section. Let’s pin down a concrete instance and reuse it across every phase. Take , , so and has 4 coefficients on the hypercube . Pick
The coefficient matrix is
Pick the query point . The equality vectors are
The tensor identity says . Step-by-step:
Sanity check by direct expansion: . ✓ The identity holds.
Hold on to . We’ll keep using them.
Commit phase
Pick a linear code over — a -subspace of of dimension with good minimum distance. Encode each row separately via . Merkle-commit each encoded row. Output Merkle roots — that’s the commitment.
Worked example, continued. For our running case (), pick the simplest rate- Reed–Solomon-style code with length that sends . Generator matrix:
Encode each row of :
The committed encoded matrix:
Merkle-commit each row. Output: two Merkle roots — one per row. That’s the whole commitment. (Real Brakedown uses and far longer codewords, but the shape is identical.)
Testing phase — “are these rows really codewords?”
The Merkle commitment binds the prover to some word in per row, but nothing forces those words to be codewords. Testing checks that.
- samples random coefficients .
- sends (the random linear combination of the underlying message rows).
- samples with . For each , opens column of every committed row (getting ) and checks
Worked example, continued. Say samples . The prover sends
To check consistency, encodes and compares against an open column. Encoding:
Suppose samples column (the third position, 0-indexed). The prover opens that column: and . checks
One column-open per draw of ; repeat times for soundness. In our toy case the codeword length is only 4, so a few opens already cover most positions — over a real Brakedown setup, is millions but only opens are sampled.
Why this works (correlated agreement). The Brakedown soundness lemma — proximity gaps for linear codes — says: if any committed word is far from every codeword, then the random combination is also far from every codeword w.h.p. over . Far-from-codeword means disagrees with the linear combination on many columns, so random columns catch the disagreement. Pass the test e.w.n.p. → every is the encoding of a unique nearby .
The intuition stripped down. A malicious prover wants to commit to something other than an honest encoding. Two failure modes the verifier wants to catch:
- The committed row isn’t a codeword at all (just a bag of values that happen to hash). Testing’s column opens catch this — a non-codeword disagrees with every codeword on many positions, and any column-equation acts as a spot check that the prover’s “encoding” matches what the code structure demands.
- The committed row is a codeword but the prover lies later about what it encodes. The randomized linear combination ties everything to one cross-check: if the prover is honest about all , the random linear combination and the encoded linear combination agree everywhere; if not, they disagree on a -fraction of positions (where is the code distance), so column opens catch it.
Eval phase — “and does it give the claimed value?”
Once trusts the rows are codewords, prove via the tensor identity.
- sends the partial sum . Honestly, — the row-combine half of the tensor identity.
- Code-consistency check. Same shape as testing: samples , opens column for each , checks . This pins to be the genuine linear combination of the committed rows.
- Final eval check. checks . By the tensor identity, this equals .
Worked example, finishing. Replay with in place of the random .
Prover sends — the same partial sum we computed during the tensor-identity warm-up.
Code-consistency: encodes and spot-checks against a random column.
Open column : , . Check:
Final eval check: . So the verifier accepts . Matches the direct computation. ✓
The eval phase is essentially the testing phase with in place of the random , plus one final inner-product check against .
What survives, what changes for
Brakedown’s whole soundness story rests on (a) the linear code having good distance and (b) the correlated-agreement lemma. Over both are clean — fields have nice distance theory and the lemma is well-established.
Moving to breaks both:
- Distance. Random-matrix codes don’t exist over the way they do over . Building a code with good distance and cheap encoding over is the JEA problem (§JEA).
- Correlated agreement. Brakedown’s lemma uses field structure. Over we need different combinatorial tools — that’s Lemmas 2.4 and 2.5 (§Why a Single Integrality Check…).
- Bounded extraction. A finite field bounds entry bit-size by for free. Over nothing bounds it — the extra integrality + size check in Zip’s testing phase is what supplies the bound.
Zip is the result of stitching these three patches into Brakedown’s template.
The Contract: Two Bit-Size Bands
Zip is a multilinear PCS for with one notable asymmetry between completeness and soundness:
| Bit-size band | Meaning | |
|---|---|---|
| Completeness | (integers, bits) | Honest provers commit with this much room |
| Soundness | (rationals, bits) | Extractor pulls back any cheat inside here |
with related by
where is the side-length of the coefficient matrix (we’ll see this shape in a moment).
The IOPP-to- analogy. This shape mirrors any IOP of proximity to a code. There, the honest prover sends a real codeword, but the scheme only guarantees that a passing prover sent something close to a codeword — close enough that decoding pins down a unique nearby codeword. Zip plays the same game with integers: the honest prover sends an integral polynomial in , but the scheme only guarantees the passing prover sent something close to integral — where “close” means “rational with bounded bit-size .”
The slack from to is the analog of the proximity radius in a codeword IOPP. The lemmas below set its size.
Zip is both an IOPP-to-a-code (over , via its underlying linear code) and an IOPP-to- (via a single bit-size check in the testing phase). The two checks slot together cleanly.
What the verifier actually sees
Before any protocol walk, anchor on what’s on the wire. Across the full commit + test + eval interaction, the verifier sees:
- At commit time. Merkle roots — one per encoded row of the coefficient matrix.
- During testing. A single random-linear-combination vector from the prover, plus column openings (one Merkle path per opened column, each revealing entries from the committed rows).
- During eval. A single projected vector from the prover, plus another column openings.
That’s it. No big-integer polynomial is ever sent in the clear. The verifier’s whole job is to run two consistency checks against the random-linear-combinations the prover supplies, against -sized samples of the underlying committed words.
The Commit Phase
Same shape as Brakedown’s commit phase (§Brakedown in a Nutshell). The one structural twist: encode and commit happen over , not .
Setup. Multilinear with even and coefficients in . Set .
Step 1. Arrange ‘s coefficients on the hypercube into a matrix , each row a length- vector of entries. (The tensor split derived in §Brakedown in a Nutshell.)
Step 2. Encode each row with the underlying linear code over :
We’ll cover which code in §JEA — for now, treat it as a black box mapping a -vector to an -vector with good distance.
Step 3. Merkle-commit each encoded row independently:
separate Merkle roots. Prover work is dominated by the encodings; each is a -by- generator-matrix multiplication.
The only structural twist vs. Brakedown. is a code over , not . Everything else looks identical.
The Testing Phase
Testing is where Zip earns the “IOP of Proximity to the Integers” name. The phase is Brakedown’s standard random-linear-combination check plus one new step: an integrality + bit-size check on the prover’s response.
Protocol walkthrough.
-
samples uniformly from — small -bit integer challenges. (The formal protocol uses for a fixed public prime — a technicality that streamlines a few lemmas. For intuition, treat it as the -bit interval shown.)
-
sends .
-
(The new step.) rejects if any entry is not an integer or has .
-
samples a random subset with . For each :
- Open the Merkle commitments at column , yielding . Reject if any is not an integer of expected bit-size.
- Check .
Steps 1, 2, 4 are Brakedown verbatim. Step 3 is the only new ingredient. A single line of code: “are all entries integers, and is each at most ?”
What each step buys. Steps 1, 2, 4 are Brakedown’s correlated-agreement check — except with negligible probability (e.w.n.p.), they guarantee every is close to a unique codeword . That’s just “prover committed to some codeword in each row.”
Step 3 does the new work. It guarantees, e.w.n.p., that those underlying vectors aren’t just rationals but bounded rationals: . That’s the IOPP-to- part of Zip.
By the time testing passes, knows the prover is committed to bit-size-bounded rational rows. That’s exactly Lemma 2.1’s precondition — and Lemma 2.1 is what the eval phase rides on top of.
Why a Single Integrality Check Pins Bit-Size
The Step 3 check is one integer comparison. Why does it pin bit-size so cleanly? Two combinatorial lemmas about random rational linear combinations.
Lemma 2.4 — “random linear combination of large rationals stays large”. Let , not all zero. Let . Sample for each . Then for any ,
Read: if some has very large magnitude, a random small-integer combination almost certainly produces a large magnitude. The “size barrier” scales with how large is.
Lemma 2.5 — “random linear combination of fractions rarely lands on an integer”. Let , not all zero, with in lowest form. Let , and suppose some index has both and — one entry with a denominator exceeding . Then
Read: a random small-integer combination of rationals where one has a large denominator almost never lands on an integer.
A tiny worked example
Take , (so ). Consider three candidate vectors:
-
Vector A: . Both small integers. Every random combination is a small integer. Step 3 passes — and it should, this is the honest case.
-
Vector B: . One entry has denominator . By Lemma 2.5, . Concretely, is an integer iff , and contains only satisfying this — so the probability is exactly . The cheating prover gets caught of the time.
-
Vector C: . Both integers, but the second exceeds the magnitude band. By Lemma 2.4 with , sampling interval size (so ), magnitude bound : . The bound is tight here — only produces a small magnitude (probability , contributing ); any already pushes . The cheating prover slips through of the time and gets caught the rest.
Scaling intuition: as grows past , the lemma’s ratio shrinks proportionally — but the unavoidable slot keeps a floor near . Zip pushes this floor to negligible by sampling from a -bit interval ().
The two lemmas are the -analogs of Brakedown’s correlated-agreement / proximity-gap lemmas. Brakedown needs random linear combinations of “close-to-codeword” words to stay close. Zip needs random linear combinations of large rationals to stay large, and random linear combinations of fractions to rarely be integers. Same kind of combinatorial statement; different ring.
How they combine
Step 3 demands the linear combination be both an integer and small (magnitude ). With drawn from :
- Lemma 2.5 with says: if any has an entry with denominator , the linear combination is hardly ever an integer. So passing the integrality check forces all denominators bounded by e.w.n.p.
- Lemma 2.4 with says: if any has an entry with magnitude , the linear combination’s magnitude likely exceeds . So passing the magnitude check forces all numerators bounded too.
Combine: passing Step 3 e.w.n.p. forces for each . The slack constant in the formula absorbs the multiplicative factors hidden in the lemma-chain.
| Brakedown (over ) | Zip (over ) | |
|---|---|---|
| Main soundness lever | Random linear combination of close-to-codeword stays close | Random linear combination of large rationals stays large (2.4) |
| Extra lever | (none — distance handles everything) | Random linear combination of fractions rarely integer (2.5) |
| Probability dominator | Field size | Sampling interval |
The Evaluation Phase
The eval phase proves a claim for a query point and value . The protocol is “Brakedown’s eval, but every check happens modulo a verifier-sampled random prime.”
Protocol walkthrough.
-
samples a random -bit prime .
-
Bad-denominator branch. If any has an entry whose denominator is divisible by — i.e., — aborts. (Same shape as Zinc-PIOP’s Step 2 from Part 1. Bounded by the same Lemma-2.1 logic: a bit-size-bounded witness can have at most primes dividing any denominator, so this branch fires negligibly often.)
-
Otherwise, uses with and sends the projected partial sum
- samples with . For each :
- Open the Merkle commitments at column , yielding .
- Code-consistency check. , where is the projected code.
- Final eval check. .
The two soundness pieces.
The code-consistency check, by Brakedown’s argument applied to the projected code , gives e.w.n.p. that . This is why the projected code needs good distance — JEA codes are designed for exactly this (next section).
The final eval check then gives — equality modulo . We want full -equality. To get there, we invoke Lemma 2.1 from Part 1. That lemma needs bit-size-bounded . The testing phase delivers them. The two phases interlock: testing pins entry bit-sizes; eval rides Lemma 2.1 on top of that bound.
JEA Codes: A Linear Code That Survives Over
Every Brakedown-style PCS rests on a code with good distance and cheap encoding. Over that’s solved — Brakedown’s recursive code, Basefold’s, Reed–Solomon. Over , the standard tricks fail.
Why standard codes break. Brakedown’s and Basefold’s codes are built recursively via iterative matrix multiplications, with random field elements at each level. Over , those are bits. Naively translating to — replacing field elements with integers — produces matrices whose entries blow up to thousands of bits after a few recursion levels. Encoding then needs huge-integer multiplications, defeating the whole purpose.
Reed–Solomon works over any ring, but encoding is via FFT — fine for runtime, but it kills the linear-time-prover benefit Brakedown buys you.
JEA’s answer: keep the matrix sparse with small entries. Adapted from [BFK+24]‘s expand-accumulate codes, drawing randomness from instead of .
Picture two stacked sparse integer matrices: each row has only nonzero entries, all bits. Encoding is a sparse-matrix-vector multiply with bounded-bit numbers — no recursion, no field elements, no bit-size blowup.
Construction (Definition 6.1)
Let . Let be the upper-triangular all-ones accumulator matrix. Let for some integer .
- : each row is a uniformly random weight- vector with nonzero entries drawn from , where . (“BP” — bounded-positions.)
- : each entry is independently nonzero with probability (drawn from when nonzero), zero otherwise. (“Ber” — Bernoulli.)
Form and . Two linear codes over : . The JEA code is their concatenation:
Length , dimension .
Why this works over
and are sparse (because are), and nonzero entries have bits. Encoding a -bit-entry integer vector costs -bit-by--bit multiplications and -bit additions. No bit-size blowup. Specifically, and are the operative numbers for Zinc — all operations stay bits.
Projection requirement
The eval phase calls — the code projected mod a random . Brakedown’s column-consistency soundness relies on the projected code having good distance.
Theorem 6.5 (paraphrased). As long as is large enough, the entries of projected mod look uniform in (e.w.n.p. over the choice of ).
So the projected code is essentially a JEA code over , which is exactly what [BFK+24] analyzed. The size threshold: per Remark 6.7, suffices. The factor of comes from a Markov-bound chain in the projection-error analysis; Remark 6.8 conjectures it can drop to via better concentration. Operationally, controls generator-matrix bit-width — bits is fine, would be tighter.
| Brakedown’s recursive | Basefold’s | Reed–Solomon | JEA (Zip) | |
|---|---|---|---|---|
| Encoding speed | Linear-time | Linear-time | Linear-time, sparse | |
| Matrix entries | Random | Random | Polynomial evals | bits |
| Survives ? | No — entries blow up | No — entries blow up | Yes, but slow | Yes |
The Extractor And the Expected-Polytime Wrinkle
Every PCS soundness story needs an extractor. Zip’s has one quirk that doesn’t show up in finite-field schemes.
The wrinkle. In any code-based PCS, a malicious prover can replace some entries of the committed word with arbitrary bit-strings — the Merkle tree commits to whatever bits the prover hashes in. Over a finite field , those bit-strings are at most bits, so the extractor reads the entire entry at unit cost. Over , the prover can write an arbitrarily long bit-string into a single entry. Reading it naively is not polynomial-time.
The fix. The extractor reads at most a fixed number of bits per entry — concretely
where is the largest absolute value in the JEA generator matrix. If the entry’s encoding exceeds that budget, it records the position as a ” disagreement” and moves on, instead of trying to read the rest.
Consequence. The extractor runs in expected polynomial time, not strict polynomial time. By Lindell’s witness-extended emulation (Lin01), expected-polytime extraction is equivalent to standard knowledge soundness for our purposes — the formal soundness statement still goes through.
The rest of the extractor is a standard rewinding-style PCS extractor: sample challenges , run the prover, retry on failure, build up linearly independent successful challenges, invert to recover the witness. Just over , with the bit-budget cap as the one new ingredient.
Compilation: The Pipeline
Two pieces left: turning the PIOP-plus-PCS into an IOP, then turning that IOP into a succinct argument.
PIOP → IOP. Replace each polynomial oracle in Zinc-PIOP with a Zip commitment — a tuple of Merkle roots over encoded coefficient-matrix rows. Replace each polynomial-oracle query in sum-check with a Zip evaluation IOP execution certifying the queried value. Result: a regular hash-based IOP, no polynomial-oracle abstraction left.
IOP → succinct interactive argument via iCOS. The COS transformation [COS20] compiles an IOP into a SNARK by Merkle-committing every oracle and applying Fiat–Shamir. It requires the underlying IOP to satisfy state-restoration knowledge soundness. Zip provides only standard knowledge soundness (the stronger property is flagged as future work in §2.4 of the paper), so we use iCOS — the interactive variant of COS, which skips the Fiat–Shamir step. The result is succinct interactive, not non-interactive.
Beneath iCOS sits iBCS [CDGS23], the vector-commitment-based BCS variant. Both transformations are “Merkle-commit every oracle, answer queries via Merkle openings” — succinctness comes from Merkle path length being rather than .
The takeaway. From the engineer’s seat: “Zinc-PIOP → IOP via Zip → succinct interactive argument via iCOS → (eventually) SNARK via Fiat–Shamir.” The final non-interactive step is open work — the paper flags state-restoration soundness as the missing piece.
What This Buys You
The full system, end-to-end:
- Hash-only. Every cryptographic primitive is collision-resistant hashing. No hidden-order groups, no RSA assumptions, no pairings. The random oracle for Fiat–Shamir is the only model dependency, standard for any hash-based SNARK.
- Plausibly post-quantum. Nothing in the security argument relies on group cryptography. Subject to the random oracle being instantiable, the construction has a path to PQ security.
- Multi-modulus over . From Part 1’s R1CSℓ structure. Zip plays no direct role here, but Zip is what unlocks it by removing the hidden-order-group dependency.
Concrete cost shape. No benchmarks are published yet (Section 2.4 of the paper flags implementation as ongoing), so this is the asymptotic profile:
- Commit: encodings of -length integer vectors with a sparse JEA generator matrix. Roughly small-integer ops, where .
- Test: Merkle openings per row, plus the random-linear-combination + bit-size check.
- Eval: Merkle openings, plus a -by- matrix-vector product modulo a random -bit prime.
- Bit-widths everywhere: all operations bounded to -bit or -bit integers. No thousand-bit arithmetic anywhere — that was the whole point.
Extending Part 1’s headline table:
| CHA24 (mod-AHP + BHR+21 PCS) | Zinc + Zip | |
|---|---|---|
| PCS family | Hidden-order group | Brakedown (hash + linear code) |
| Cryptographic assumption | RSA-style (groups of unknown order) | Collision-resistant hashing + ROM |
| Post-quantum | No | Plausibly yes |
| Multi-modulus per stmt | Yes | Yes |
| Arithmetization overhead | None | None |
| Underlying linear code | n/a | JEA (sparse, small-entry) |
What We Didn’t Cover
A short list of what’s in the paper but not in this walkthrough:
- Full state-restoration soundness analysis for Fiat–Shamir compilation — flagged as further work in §2.4. Without it, the final scheme is interactive.
- Formal proofs of Lemmas 2.4 and 2.5 — §5.4.1.
- The general algebraic-relations machinery (§4) — Zinc-PIOP works for any algebraic indexed relation, not just R1CSℓ. We focused on R1CSℓ throughout.
- The full extractor analysis — Protocols 10 and 11 in §5.4.3, plus Lemma 5.24 on expected running time.
- JEA distance bounds — §6, Theorem 6.5 and the chain of lemmas underneath. We stated the result; the analysis is several pages of Markov-bound chasing.
- Implementation and benchmarking — flagged as ongoing in the paper.
Conclusion
Five core ideas drive Zinc + Zip:
- A Brakedown-style PCS over is possible if you’re careful about what the prover commits to, what the testing phase proves, and what code you use.
- The IOPP-to- abstraction — “prover knows a word close to integral” — slots into Brakedown’s existing IOPP-to-code abstraction. Zip is both at once.
- Two combinatorial lemmas (2.4, 2.5) replace Brakedown’s correlated-agreement bounds in the setting. Easier to state than Brakedown’s, in fact.
- JEA codes — sparse generator matrix, small entries — are a linear code that survives translation from to without bit-size blowup. Most other linear codes don’t.
- iCOS is the standard Merkle compilation step. Fiat–Shamir for non-interactivity is open work.
What makes Zinc + Zip significant: it’s the first hash-only succinct argument for native integer-arithmetic statements, with multi-modulus support at zero arithmetization overhead, and a plausibly post-quantum path. The construction recipe — “hash + linear code over ” — is clean, and unlocks a class of relations that previously required RSA-style assumptions to handle efficiently.
Open theoretical question: sharpen the JEA projection-error analysis to drop from to (Remark 6.8) and shave constants. Open practical question: implementation — benchmarks against Brakedown over will show whether the bit-bookkeeping overhead is small enough in practice for the integer-arithmetic flexibility to pay off.
References
- Zinc (this paper): Garreta, A., Waldner, H., Hristova, K., Dall’Ava, L. (2025). “Zinc: Succinct Arguments with Small Arithmetization Overheads from IOPs of Proximity to the Integers.” Nethermind Research.
- Part 1 of this walkthrough: Zinc I: A PIOP Over the Rationals That Bypasses Arithmetization.
- CHA24 (mod-AHP): Campanelli, M., Hall-Andersen, M. (2024). “Fully-succinct arguments over the integers from first principles.” https://eprint.iacr.org/2024/1548
- Brakedown: Golovnev, A., Lee, J., Setty, S., Thaler, J., Wahby, R. S. (2023). “Brakedown: Linear-time and field-agnostic SNARKs for R1CS.” CRYPTO 2023.
- BFK+24 (EA codes over fields): Block, A. R., Fang, Z., Katz, J., Thaler, J., Waldner, H., Zhang, Y. (2024). “Field-agnostic SNARKs from expand-accumulate codes.” CRYPTO 2024.
- BHR+21 (integer PCS): Block, A. R., Holmgren, J., Rosen, A., Rothblum, R. D., Soni, P. (2021). “Time- and space-efficient arguments from groups of unknown order.” CRYPTO 2021.
- COS20 (COS transformation): Chiesa, A., Ojha, D., Spooner, N. (2020). “Fractal: Post-quantum and transparent recursive proofs from holography.” EUROCRYPT 2020.
- CDGS23 (iBCS): Chiesa, A., Dall’Agnol, M., Guan, Z., Spooner, N. (2023). “On the security of succinct interactive arguments from vector commitments.” https://eprint.iacr.org/2023/1737
- CY24: Chiesa, A., Yogev, E. “Building Cryptographic Proofs from Hash Functions.”
- Lin01 (witness-extended emulation): Lindell, Y. (2001). “Parallel Coin-Tossing and Constant-Round Secure Two-Party Computation.”
- BSBHR18 (IOPP): Ben-Sasson, E., Bentov, I., Horesh, Y., Riabzev, M. (2018). “Fast Reed-Solomon Interactive Oracle Proofs of Proximity.”