What problem are we solving?
Most modern SNARKs are wired to prove statements in a single fixed finite field . Industry-leading systems pick a field whose arithmetic is fast on a CPU — Stwo uses the Mersenne-31 prime, others use BabyBear () or Goldilocks (). That’s great when your statement naturally lives in . It’s not great when it doesn’t.
A “wrong-shape” relation has to be arithmetized: rewritten so it can be checked using only the field’s native operations. Modular arithmetic with a non-prime modulus, multi-modulus statements, integer comparisons, RSA-group operations, FHE-related computations — all of these blow up by a noticeable factor when you force them through a fixed-prime . The Zinc paper calls that factor the arithmetization overhead, and it can easily reach (32) or more for realistic relations.
That overhead matters because, in production systems, it’s the dominant cost. For Stwo, more than 80% of the proving time goes into computing the trace, the low-degree extension of the trace, and the Merkle commit to it — all of which scale with statement size. The actual SNARK-after-the-witness costs less than 20%. Cutting arithmetization is the single biggest lever for making proving cheaper.
Zinc (Garreta, Waldner, Hristova, Dall’Ava — Nethermind Research, 2025) is a hash-based succinct argument that bypasses arithmetization for a wide class of integer-arithmetic relations. Its claim sheet:
- Native integer arithmetic. Prove statements expressed over — including modular arithmetic with arbitrary, possibly non-prime, possibly multiple moduli per statement.
- Hash-only, post-quantum-friendly. No hidden-order groups, no RSA assumptions, no pairings. Just collision-resistant hashes and error-correcting codes.
- Spartan-shaped inner protocol. Once you sample a random prime, the prover and verifier do almost exactly what they’d do in a regular hash-based SNARK over a small field.
The closest prior work is CHA24 (Campanelli–Hall-Andersen, the mod-AHP framework), which also handles integer arithmetic via random-prime sampling. The catch with CHA24 is that compiling its PIOP requires a polynomial commitment scheme that extracts integer polynomials, and the only known constructions for that rely on hidden-order groups. Zinc keeps the random-prime idea but works over instead of , which lets it use a Brakedown-style hash-and-code PCS instead.
| CHA24 (mod-AHP) | Zinc | |
|---|---|---|
| PIOP base ring | ||
| Random prime trick | Yes | Yes |
| PCS commits to | integer polynomials | bounded-rational polynomials |
| PCS construction | hidden-order groups (BHR+21) | Brakedown-style (Zip) |
| Cryptographic assumption | RSA-style (groups of unknown order) | collision-resistant hashing |
| Post-quantum | No | Plausibly yes |
| Multi-modulus per stmt | Yes | Yes |
This article is Part 1 of a two-part walkthrough. In Part 1 we build Zinc-PIOP: the framework that turns any Spartan-style PIOP over into a PIOP over for integer-arithmetic relations. We treat the polynomial commitment scheme as an oracle. Part 2 will build the real PCS — Zip, a Brakedown variant constructed from a new primitive called an IOP of Proximity to the Integers.
Prerequisites. R1CS, multilinear extensions, the sum-check protocol, and basic finite-field linear algebra. Some comfort with elementary ring theory helps — what a subring is, what a ring homomorphism is — but everything load-bearing is built from scratch. The lifted R1CS relation, the localization , and the projection trick all get full treatment below.
A glossary before we touch the protocol
A handful of symbols recur throughout. Worth getting them into your head up front:
- — the security parameter (bits of soundness). Typically or .
- — a bit-size bound on entries. Witnesses and instance entries are constrained to integers (or rationals, encoded as bit-strings) of bit-size less than . Throughout, .
- — a random prime sampled by the verifier, bits long. The whole protocol is “do something modulo .”
- — the set of rationals whose encoding fits in bits. The “bounded rationals.”
- — the localization of at the prime : rationals where . Operationally, “the rationals you can safely reduce mod .” A subring of that admits a clean projection to — most of the article is built around this fact.
- — the projection defined by . A ring homomorphism. Extends component-wise to vectors and matrices.
- — a vector of moduli, one per constraint. This is what makes Zinc multi-modulus-friendly.
The Two Walls “Spartan over ” Hits
Before we get to Zinc proper, it helps to see why the obvious approach — “just run Spartan over the integers” — falls apart. The two walls are what motivate every design choice that follows.
Wall 1: coefficients explode during sum-check
Sum-check is the workhorse of every modern SNARK. Each round, the prover sends a univariate polynomial summarizing one variable; the verifier replies with a random challenge from the field. Each multiplication mixes a challenge into the data and accumulates.
Over , that’s fine — every intermediate value is reduced mod and stays bits wide. Over the integers, there’s nowhere to reduce. After rounds with -bit challenges, intermediate integers can reach bits. Concretely, with , (so sum-check has rounds), and -bit verifier challenges, intermediate integers in the PIOP can grow to thousands of bits. Multiplying multi-thousand-bit integers is expensive, and that overhead blows past whatever you saved on arithmetization.
CHA24’s fix is the random-prime trick: have the verifier sample a random prime at round zero and run the sum-check modulo . Now the entire PIOP operates with -bit integers throughout. We’ll do the same.
Wall 2: the PIOP needs an integer-polynomial PCS
Every PIOP becomes a real argument by compiling it with a polynomial commitment scheme. The PIOP’s soundness only holds if the prover is restricted to oracles in some prescribed set — for a PIOP over , that means the prover must commit to polynomials with integer coefficients of bit-size .
That’s a strong requirement, and it’s the wall. The only known PCS that extracts integer polynomials is the one by Block et al. (BHR+21), based on hidden-order groups — RSA groups, class groups, and similar structures. Hidden-order groups are heavy (every operation is many big-integer modular exponentiations), they require RSA-style hardness assumptions, and they aren’t plausibly post-quantum secure. CHA24 inherits this dependency.
Zinc’s pivot. Instead of restricting to , work over . is a field, so PCS extraction is easy — any reasonable hash-and-code PCS over extracts -coefficient polynomials by construction. The PCS can be a Brakedown variant: just hashes and linear codes, no hidden-order groups, no RSA. The cost: you separately need a way to force the witness to actually be integers, which we’ll handle with a lookup argument at the end.
The catch. Working over raises a fresh problem. The random-prime trick wants a clean “reduce mod ” operation, and doesn’t have one — what would even mean? The fix is the localization , and that’s the next section.
R1CSℓ: Lifting R1CS to the Integers
Before we project anything, we need to write down the relation we want to prove. Vanilla R1CS over a finite field asks for a witness such that
where is the Hadamard (component-wise) product and are public matrices. This is a statement modulo — the prime is hardwired into the relation.
Lifting it to . Move to integer arithmetic and make the modulus a first-class term. The constraint over is equivalent to
for some integer vector . The witness is now : the original solution plus the multiple of that compensates. The modulus has gone from a property of the field to a coefficient in the constraint.
Multi-modulus generalization. Once is a coefficient, nothing stops it from being different in every row. Replace the scalar with a vector of moduli, one per constraint:
Each row enforces , with absorbing the multiple. Different rows can have different . A single statement can mix for CPU-style word arithmetic, for FHE-style operations, and a large prime for elliptic-curve operations — all in one R1CS instance, with the SNARK doing the same work it would for any other R1CS row.
This is the R1CSℓ relation (R1CS with lifted moduli). Formally, fix a bit-size bound . The relation consists of all pairs where:
- Public input .
- Witness , with and .
- Full vector .
- Constraint over .
are public integer matrices with entries, and is the moduli vector.
A sanity check on bit-size. The paper shows that whenever , , and have entries of -bit size, any satisfying integer witness has entries of bit-size at least — the multiplications inside the constraint force this lower bound. So is the smallest sensible choice, and covers what we actually want to prove. (The full paper handles the more general CCS relation; R1CSℓ is the simpler exposition, and everything below carries over.)
A tiny worked example. Take , (no public input), and a witness with two rows:
- Row 1: with . Compute: , so .
- Row 2: with . Compute: . Modulo , , so this row only satisfies the equation in , not over — meaning row 2 is not satisfiable as an integer relation with for this .
So one R1CSℓ instance can mix a row that’s satisfied over (modulus ) with a row that fails over but might pass mod its prime — and the relation tracks both honestly. The verifier’s random-prime check will pick this discrepancy up.
Projecting Through the Localization
We have the relation. The trick now is to prove it efficiently using a Spartan-style PIOP. The plan: work over during the protocol, but check the constraint after projecting to for a verifier-sampled prime . The localization is the algebraic object that makes this work.
Reformulating . Embed R1CSℓ in by allowing , , with the same constraint over . Honest provers will still use integer witnesses of bit-size at most — the move to is for security analysis and PCS compatibility, not for the prover. We’ll come back to forcing integrality.
Why , not ? is a field. Brakedown-style PCSs extract -coefficient polynomials with no special machinery. PCS extraction over , by contrast, forces hidden-order groups (Wall 2). Working over is what lets the Zip PCS in Part 2 be hash-only.
The localization. For a prime , define
These are the rationals whose denominator (in lowest form) isn’t divisible by . is a subring of — it’s closed under addition and multiplication, contains , and contains as a sub-subring. Critically, admits a ring homomorphism to :
The inverse exists modulo exactly because . So is well-defined, additive, and multiplicative — a ring homomorphism in the standard sense. It extends component-wise to vectors and matrices: .
Worked example. Take . The rational is in since , and . The rational is not in (its denominator is divisible by ), so doesn’t apply. Every ordinary integer is trivially in regardless of , and projects in the obvious way.
The projected relation. A small abuse of notation: when we write for a relation, we mean the same relation but with the constraint required to hold under (in ) rather than over the original ring. So is R1CSℓ with all entries drawn from and the constraint checked after projection. That is, the prover sends , but the equality
is checked over . Because is a ring homomorphism, it commutes with multiplication and addition, so this is exactly an R1CSℓ-shaped check after projecting every entry to .
For , this projected relation looks like ordinary R1CS over with one extra term (). And here’s the payoff: an existing Spartan PIOP over , lightly modified to handle the extra term, lifts cleanly into a PIOP over for . No new sum-check machinery — it’s the same sum-check, with prover and verifier operating on values that get projected at the end.
(A side note for readers comparing to CHA24: the projected relation is structurally the same as their associated fingerprinting relation. Zinc is following CHA24’s playbook with localizations chosen specifically to dodge the hidden-order-group dependency.)
Protocol 1: Zinc-PIOP
We have the lifted relation, the localization, and the projection. The protocol falls out.
Setup. and get and respectively. The witness with .
The protocol.
- uniformly samples a prime of bits.
- Bad-denominator branch. If — i.e. some entry’s denominator is divisible by — tells which entry. verifies via an oracle query and accepts.
- Otherwise. and run a PIOP over for the projected relation , with prover input and verifier input .
Step 3 is where all the actual work happens. Inside it, the protocol is essentially Spartan over — sum-check on the R1CS constraint, polynomial-evaluation queries to the witness oracles, the works — with the small wrinkle that the extra term has to be incorporated into the sum-check polynomial. Prover and verifier compute on values throughout, but the check at the end is over . Since both honest prover witnesses and verifier challenges are -bit integers, no coefficient blow-up.
The bad-denominator branch looks suspicious. It’s not — and the reason is the next section. For now: a prover who genuinely has a witness in can only get unlucky on for a few primes (we’ll bound how many), and a cheating prover trying to hide a bad witness behind that branch is constrained by the same bound. Step 2 is a mathematical convenience that makes the soundness analysis clean, not a back door.
The takeaway for an engineer: from here forward, Zinc-PIOP looks like one ordinary -Spartan run, plus a random-prime sample at the top. No exotic IOP plumbing inside.
Why It’s Knowledge-Sound
Knowledge soundness is the statement that whenever a prover convinces , an extractor can pull a valid witness out of them. The whole construction stands or falls on one lemma.
The setup. Suppose a malicious convinces with non-negligible probability. Inside Step 3, the inner PIOP for has its own knowledge soundness, so an extractor pulls satisfying the projected constraint. Two cases:
- Lucky case. . The constraint already holds over . Done.
- Bad case. It only holds modulo . There’s some non-zero with
Call the left-hand side . It’s zero modulo but nonzero over . We want: how many primes can a fixed make this happen for? If only many, then the random-prime sampling catches the cheat with overwhelming probability.
Integer warm-up. Suppose for a moment that and the bad-case vectors are integral. Let be the set of primes that satisfy the bad-case equation. Then is divisible by every prime in simultaneously, so
for some nonzero integer vector . Some entry has bit-size at least . But is a polynomial expression in the entries of , all of which are bounded by bits. Polynomial expressions of bounded-bit-size inputs have bounded-bit-size outputs, so , which means (dividing a polynomial in by stays polynomial). With sampling from primes, the probability of landing in is at most — negligible.
Lemma 2.1 (informal). The general statement, lifted to :
Let be a polynomial with coefficients in . Let be a set of primes of bit-size at least , and let be such that for all . Assume for every . Then some entry of has bit-size at least
where is the sum of ‘s partial degrees (the per-variable degree summed across all variables).
Read it contrapositively: if every entry of has bit-size at most , then is at most . Many simultaneous “bad” primes force at least one entry of the witness to be huge. A bounded-bit-size witness can only fool -many primes.
Why this is the load-bearing lemma. Without it, an adversary could construct fractional witnesses that satisfy the projected constraint modulo many primes — in the worst case, every prime — and the random-prime check would catch nothing. Lemma 2.1 says: the bad-prime set has size as long as the witness entries are bit-size-bounded. Combined with sampling from primes, soundness follows.
The same logic handles Step 2. If many primes divided the denominator of some , that entry would have to be a fraction with a denominator of bit-size at least . But entries are -bounded, so this can happen for at most primes — Step 2 is reachable for at most negligibly many random . The branch is not exploitable.
The catch. Lemma 2.1’s bound depends on the witness having bounded bit-size in the first place. If a malicious prover sends arbitrarily-large fractions, the lemma gives no useful bound. So Zinc-PIOP only proves — soundness assumes the prover is using bounded entries. To prove the integer relation, we need to actively force the witness to be a bounded integer.
Forcing Integer Witnesses with a Lookup
Lemma 2.1 only bites when the witness is bit-size-bounded. The Zip PCS in Part 2 will guarantee this for committed polynomials, and a lookup argument bridges from “bounded rational” to “bounded integer.”
Lookup, lifted. A lookup relation asserts that every entry of a witness vector appears somewhere in a public table . Formally,
The same lifting trick works: define a projected version , build a PIOP over for it (any of the standard lookup arguments — Lasso, LogUp), and wrap it in the same Protocol-1-shaped construction.
The key choice. Set — the table contains every integer of bit-size less than . Set to be the R1CSℓ witness . Then any that satisfies the lookup is forced to be an integer in the bounded range.
Combining the two PIOPs gives a PIOP over for :
Protocol 2 (informal):
1. P, V execute Zinc-PIOP for the R1CSℓ-over-Q relation.
2. P, V execute the lifted lookup-PIOP, with table = [-2^B+1, 2^B-1]
and a = w (the R1CSℓ witness).
3. Accept iff both pass.
The cost wrinkle. The table has size , which is astronomical for . No prover writes that table down. In practice, this is instantiated using structured-table lookup arguments (Lasso’s SOS decomposition is the paper’s reference), which exploit the regular structure of to keep the prover work proportional to the witness size, not the table size. The structured-table machinery is a separate concern — we’ll defer the details to Part 2 when we put the full system together.
Where We Stand
Here’s the stack we’ve built, end to end:
- R1CSℓ relation. Lifts modular R1CS to integer arithmetic with arbitrary, possibly per-row moduli. A single statement can mix , , and prime moduli.
- Localization + projection . A subring of that admits a clean ring homomorphism to . Lets us run “modulo ” sum-check inside a relation that lives over .
- Zinc-PIOP (Protocol 1). Sample a random prime , then run a Spartan-shaped PIOP for the projected relation over . Inside: ordinary sum-check on -bit integers.
- Lemma 2.1. The pigeonhole-flavored bound that makes random-prime soundness work: a bit-size-bounded witness can fool at most primes. Without it, the construction falls apart.
- Lookup over . Forces the witness to be a bounded integer — the precondition Lemma 2.1 needs.
Cost-wise, all the prover work happens inside the inner PIOP over . Prover and verifier handle integers of bits throughout. From a system-builder’s perspective, Zinc-PIOP is “Spartan plus a random-prime header” — and it now handles statements over , with multi-modulus support, at zero arithmetization overhead.
Why We’re Not Done Yet
The catch: Zinc-PIOP is a PIOP, not a real argument. Compiling it requires a polynomial commitment scheme that:
- Works over , not .
- Extracts to bounded-bit-size rational coefficients — Lemma 2.1’s precondition. A generic -PCS gives unbounded extraction; we need the boundedness as a soundness property.
- Doesn’t use hidden-order groups.
That PCS is Zip, the second main component of the Zinc paper. Zip is built around a new primitive called an IOP of Proximity to the Integers (IOPP-to-), analogous to the IOPs of proximity to a code that underpin FRI and Brakedown. Where a code-IOPP guarantees the prover knows a word close to a codeword, an integer-IOPP guarantees the prover knows a word close to an integer vector.
Part 2 will cover:
- Zip’s commit and test phase, a Brakedown variant adapted to .
- The IOP of Proximity to the Integers, the new primitive and how it slots into Zip.
- Two combinatorial lemmas about random rational linear combinations — the engine of Zip’s soundness, generalizing the Brakedown random-linear-combination check to .
- JEA codes (Juxtaposed Expand-Accumulate), the linear code over that Zip uses, descended from the EA codes of Block et al. (BFK+24).
- The extractor, including the technical wrinkle that committed words can be arbitrary bit-strings, so the extractor is expected polynomial time, not strict.
- Compilation via COS, putting the full Zinc-PIOP + Zip + iCOS/iBCS pipeline together to produce the final hash-only succinct argument.
Continue to Part 2.
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.
- CHA24 (mod-AHP): Campanelli, M., Hall-Andersen, M. (2024). “Fully-succinct arguments over the integers from first principles.” https://eprint.iacr.org/2024/1548
- Spartan: Setty, S. (2020). “Spartan: Efficient and general-purpose zkSNARKs without trusted setup.” CRYPTO 2020. https://eprint.iacr.org/2019/550
- Brakedown: Golovnev, A., Lee, J., Setty, S., Thaler, J., Wahby, R. S. (2023). “Brakedown: Linear-time and field-agnostic SNARKs for R1CS.” CRYPTO 2023.
- 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.
- BFS20 (DARK): Bünz, B., Fisch, B., Szepieniec, A. (2020). “Transparent SNARKs from DARK compilers.” EUROCRYPT 2020.
- BFK+24 (EA codes): Block, A. R., Fang, Z., Katz, J., Thaler, J., Waldner, H., Zhang, Y. (2024). “Field-agnostic SNARKs from expand-accumulate codes.” CRYPTO 2024.
- Stwo (HLP24): Haböck, U., Levit, D., Papini, S. (2024). “Stwo: a STARK prover.”
- SuperSpartan / CCS: Setty, S., Thaler, J., Wahby, R. (2023). “Customizable Constraint Systems for Succinct Arguments.”
- Lasso: Setty, S., Thaler, J., Wahby, R. (2023). “Unlocking the lookup singularity with Lasso.”
- LogUp: Papini, S., Haböck, U. (2023). “Improving logarithmic derivative lookups using GKR.”