Zinc I: A PIOP Over the Rationals That Bypasses Arithmetization

May 5, 2026

What problem are we solving?

Most modern SNARKs are wired to prove statements in a single fixed finite field F\mathbb F. Industry-leading systems pick a field whose arithmetic is fast on a CPU — Stwo uses the Mersenne-31 prime, others use BabyBear (p231p \approx 2^{31}) or Goldilocks (p264p \approx 2^{64}). That’s great when your statement naturally lives in F\mathbb F. 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 F\mathbb F. The Zinc paper calls that factor the arithmetization overhead, and it can easily reach 252^5 (32×\times) 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 Z\mathbb Z — 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 Q\mathbb Q instead of Z\mathbb Z, which lets it use a Brakedown-style hash-and-code PCS instead.

CHA24 (mod-AHP)Zinc
PIOP base ringZB\mathbb Z_BQB\mathbb Q_B
Random prime trickYesYes
PCS commits tointeger polynomialsbounded-rational polynomials
PCS constructionhidden-order groups (BHR+21)Brakedown-style (Zip)
Cryptographic assumptionRSA-style (groups of unknown order)collision-resistant hashing
Post-quantumNoPlausibly yes
Multi-modulus per stmtYesYes

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 Fq\mathbb F_q into a PIOP over Q\mathbb Q 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 Z(q)\mathbb Z_{(q)}, 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:

  • λ\lambda — the security parameter (bits of soundness). Typically 100100 or 128128.
  • BB — 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 BB. Throughout, B=poly(λ)B = \mathrm{poly}(\lambda).
  • qq — a random prime sampled by the verifier, Ω(λ)\Omega(\lambda) bits long. The whole protocol is “do something modulo qq.”
  • QB\mathbb Q_B — the set of rationals whose encoding fits in <B< B bits. The “bounded rationals.”
  • Z(q)\mathbb Z_{(q)} — the localization of Q\mathbb Q at the prime qq: rationals a/ba/b where qbq \nmid b. Operationally, “the rationals you can safely reduce mod qq.” A subring of Q\mathbb Q that admits a clean projection to Fq\mathbb F_q — most of the article is built around this fact.
  • ϕq\phi_q — the projection ϕq:Z(q)Fq\phi_q: \mathbb Z_{(q)} \to \mathbb F_q defined by a/bab1modqa/b \mapsto a \cdot b^{-1} \bmod q. A ring homomorphism. Extends component-wise to vectors and matrices.
  • m\mathbf m — a vector of moduli, one per constraint. This is what makes Zinc multi-modulus-friendly.

The Two Walls “Spartan over Z\mathbb Z” 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 Fq\mathbb F_q, that’s fine — every intermediate value is reduced mod qq and stays logq\log q bits wide. Over the integers, there’s nowhere to reduce. After μ\mu rounds with λ\lambda-bit challenges, intermediate integers can reach μλ\mu \cdot \lambda bits. Concretely, with B=256B = 256, n=220n = 2^{20} (so sum-check has 20\approx 20 rounds), and 128128-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 qq at round zero and run the sum-check modulo qq. Now the entire PIOP operates with λ\sim \lambda-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 ZB\mathbb Z_B, that means the prover must commit to polynomials with integer coefficients of bit-size <B< B.

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 Z\mathbb Z, work over Q\mathbb Q. Q\mathbb Q is a field, so PCS extraction is easy — any reasonable hash-and-code PCS over Q\mathbb Q extracts Q\mathbb Q-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 Q\mathbb Q raises a fresh problem. The random-prime trick wants a clean “reduce mod qq” operation, and Q\mathbb Q doesn’t have one — what would 1/qmodq1/q \bmod q even mean? The fix is the localization Z(q)\mathbb Z_{(q)}, 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 Fq\mathbb F_q asks for a witness z\mathbf z such that

(Az)(Bz)=Cz(modq)(A \cdot \mathbf z) \circ (B \cdot \mathbf z) = C \cdot \mathbf z \pmod{q}

where \circ is the Hadamard (component-wise) product and A,B,CA, B, C are public matrices. This is a statement modulo qq — the prime is hardwired into the relation.

Lifting it to Z\mathbb Z. Move to integer arithmetic and make the modulus a first-class term. The constraint (Az)(Bz)Cz0(modq)(A\mathbf z) \circ (B\mathbf z) - C\mathbf z \equiv 0 \pmod q over Fq\mathbb F_q is equivalent to

(Az)(Bz)Cz=qu(over Z)(A \cdot \mathbf z) \circ (B \cdot \mathbf z) - C \cdot \mathbf z = q \cdot \mathbf u \quad \text{(over } \mathbb Z\text{)}

for some integer vector u\mathbf u. The witness is now (z,u)(\mathbf z, \mathbf u): the original solution plus the multiple of qq that compensates. The modulus has gone from a property of the field to a coefficient in the constraint.

Multi-modulus generalization. Once qq is a coefficient, nothing stops it from being different in every row. Replace the scalar qq with a vector m\mathbf m of moduli, one per constraint:

(Az)(Bz)Cz=mu(over Z).(A \cdot \mathbf z) \circ (B \cdot \mathbf z) - C \cdot \mathbf z = \mathbf m \circ \mathbf u \quad \text{(over } \mathbb Z\text{)}.

Each row yy enforces Q(y)0(modmy)Q(y) \equiv 0 \pmod{m_y}, with uyu_y absorbing the multiple. Different rows can have different mym_y. A single statement can mix my=232m_y = 2^{32} for CPU-style word arithmetic, my=264m_y = 2^{64} for FHE-style operations, and mym_y 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 BB. The relation RELR1CS,Z\mathsf{REL}_{\mathsf{R1CS}\ell, \mathbb Z} consists of all pairs (x;w)(\mathbf x; \mathbf w) where:

  • Public input x=(x)ZBk\mathbf x = (\mathbf x') \in \mathbb Z_B^k.
  • Witness w=(w,u)\mathbf w = (\mathbf w', \mathbf u), with wZBnk1\mathbf w' \in \mathbb Z_B^{n-k-1} and uZBn\mathbf u \in \mathbb Z_B^n.
  • Full vector z=(w,x,1)ZBn\mathbf z = (\mathbf w', \mathbf x', 1) \in \mathbb Z_B^n.
  • Constraint (AzT)(BzT)=(CzT)+mTuT(A \mathbf z^T) \circ (B \mathbf z^T) = (C \mathbf z^T) + \mathbf m^T \circ \mathbf u^T over Z\mathbb Z.

A,B,CA, B, C are public n×nn \times n integer matrices with ZB\mathbb Z_B entries, and mZBn\mathbf m \in \mathbb Z_B^n is the moduli vector.

A sanity check on bit-size. The paper shows that whenever x\mathbf x, m\mathbf m, and A,B,CA, B, C have entries of λ\sim \lambda-bit size, any satisfying integer witness has entries of bit-size at least 2λ\sim 2\lambda — the multiplications inside the constraint force this lower bound. So B2λB \approx 2\lambda is the smallest sensible choice, and B=poly(λ)B = \mathrm{poly}(\lambda) 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 n=2n = 2, k=0k = 0 (no public input), and a witness z=(z1,z2)=(3,5)\mathbf z = (z_1, z_2) = (3, 5) with two rows:

  • Row 1: z1z2z1=m1u1z_1 \cdot z_2 - z_1 = m_1 \cdot u_1 with m1=4m_1 = 4. Compute: 353=12=433 \cdot 5 - 3 = 12 = 4 \cdot 3, so u1=3u_1 = 3.
  • Row 2: z1z2z2=m2u2z_1 \cdot z_2 - z_2 = m_2 \cdot u_2 with m2=7m_2 = 7. Compute: 355=103 \cdot 5 - 5 = 10. Modulo 77, 10310 \equiv 3, so this row only satisfies the equation in F7\mathbb F_7, not over Z\mathbb Z — meaning row 2 is not satisfiable as an integer relation with u2Zu_2 \in \mathbb Z for this z\mathbf z.

So one R1CSℓ instance can mix a row that’s satisfied over Z\mathbb Z (modulus 44) with a row that fails over Z\mathbb Z 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 Q\mathbb Q during the protocol, but check the constraint after projecting to Fq\mathbb F_q for a verifier-sampled prime qq. The localization Z(q)\mathbb Z_{(q)} is the algebraic object that makes this work.

Reformulating Q\mathbb Q. Embed R1CSℓ in Q\mathbb Q by allowing wQBnk1\mathbf w' \in \mathbb Q_B^{n-k-1}, uQBn\mathbf u \in \mathbb Q_B^n, with the same constraint over Q\mathbb Q. Honest provers will still use integer witnesses of bit-size at most B<BB' < B — the move to Q\mathbb Q is for security analysis and PCS compatibility, not for the prover. We’ll come back to forcing integrality.

Why Q\mathbb Q, not Z\mathbb Z ? Q\mathbb Q is a field. Brakedown-style PCSs extract Q\mathbb Q-coefficient polynomials with no special machinery. PCS extraction over Z\mathbb Z, by contrast, forces hidden-order groups (Wall 2). Working over Q\mathbb Q is what lets the Zip PCS in Part 2 be hash-only.

The localization. For a prime qq, define

Z(q)=a/bQ:qb.\mathbb Z_{(q)} = {a/b \in \mathbb Q : q \nmid b\\}.

These are the rationals whose denominator (in lowest form) isn’t divisible by qq. Z(q)\mathbb Z_{(q)} is a subring of Q\mathbb Q — it’s closed under addition and multiplication, contains 11, and contains Z\mathbb Z as a sub-subring. Critically, Z(q)\mathbb Z_{(q)} admits a ring homomorphism to Fq\mathbb F_q:

ϕq:Z(q)Fq,a/bab1modq.\phi_q: \mathbb Z_{(q)} \to \mathbb F_q, \qquad a/b \mapsto a \cdot b^{-1} \bmod q.

The inverse b1b^{-1} exists modulo qq exactly because qbq \nmid b. So ϕq\phi_q is well-defined, additive, and multiplicative — a ring homomorphism in the standard sense. It extends component-wise to vectors and matrices: ϕq(v)=(ϕq(v1),,ϕq(vn))\phi_q(\mathbf v) = (\phi_q(v_1), \ldots, \phi_q(v_n)).

Worked example. Take q=7q = 7. The rational 3/23/2 is in Z(7)\mathbb Z_{(7)} since 727 \nmid 2, and ϕ7(3/2)=321mod7=34=125(mod7)\phi_7(3/2) = 3 \cdot 2^{-1} \bmod 7 = 3 \cdot 4 = 12 \equiv 5 \pmod 7. The rational 5/145/14 is not in Z(7)\mathbb Z_{(7)} (its denominator is divisible by 77), so ϕ7\phi_7 doesn’t apply. Every ordinary integer is trivially in Z(q)\mathbb Z_{(q)} regardless of qq, and projects in the obvious way.

The projected relation. A small abuse of notation: when we write ϕq(REL)\phi_q(\mathsf{REL}) for a relation, we mean the same relation but with the constraint required to hold under ϕq\phi_q (in Fq\mathbb F_q) rather than over the original ring. So ϕq(RELR1CS,Z(q))\phi_q(\mathsf{REL}_{\mathsf{R1CS}\ell, \mathbb Z_{(q)}}) is R1CSℓ with all entries drawn from Z(q)\mathbb Z_{(q)} and the constraint checked after projection. That is, the prover sends (w,u)Z(q)2nk1(\mathbf w', \mathbf u) \in \mathbb Z_{(q)}^{2n-k-1}, but the equality

ϕq(AzT)ϕq(BzT)=ϕq(CzT)+ϕq(mT)ϕq(uT)\phi_q(A \cdot \mathbf z^T) \circ \phi_q(B \cdot \mathbf z^T) = \phi_q(C \cdot \mathbf z^T) + \phi_q(\mathbf m^T) \circ \phi_q(\mathbf u^T)

is checked over Fq\mathbb F_q. Because ϕq\phi_q is a ring homomorphism, it commutes with multiplication and addition, so this is exactly an R1CSℓ-shaped check after projecting every entry to Fq\mathbb F_q.

For B>logqB > \log q, this projected relation looks like ordinary R1CS over Fq\mathbb F_q with one extra term (ϕq(m)ϕq(u)\phi_q(\mathbf m) \circ \phi_q(\mathbf u)). And here’s the payoff: an existing Spartan PIOP over Fq\mathbb F_q, lightly modified to handle the extra term, lifts cleanly into a PIOP over (Z(q))B(\mathbb Z_{(q)})_B for ϕq(RELR1CS,Z(q))\phi_q(\mathsf{REL}_{\mathsf{R1CS}\ell, \mathbb Z_{(q)}}). No new sum-check machinery — it’s the same sum-check, with prover and verifier operating on Z(q)\mathbb Z_{(q)} 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. P\mathsf P and V\mathsf V get (x;w)RELR1CS,Q(\mathbf x; \mathbf w) \in \mathsf{REL}_{\mathsf{R1CS}\ell, \mathbb Q} and x\mathbf x respectively. The witness w=(w~,u~)\mathbf w = (\tilde{\mathbf w}, \tilde{\mathbf u}) with (w,u)QB2nk1(\mathbf w, \mathbf u) \in \mathbb Q_B^{2n-k-1}.

The protocol.

  1. V\mathsf V uniformly samples a prime qq of Ω(λ)\Omega(\lambda) bits.
  2. Bad-denominator branch. If (w,u)Z(q)2nk1(\mathbf w, \mathbf u) \notin \mathbb Z_{(q)}^{2n-k-1} — i.e. some entry’s denominator is divisible by qqP\mathsf P tells V\mathsf V which entry. V\mathsf V verifies via an oracle query and accepts.
  3. Otherwise. P\mathsf P and V\mathsf V run a PIOP over (Z(q))B(\mathbb Z_{(q)})_B for the projected relation ϕq(RELR1CS,Z(q))\phi_q(\mathsf{REL}_{\mathsf{R1CS}\ell, \mathbb Z_{(q)}}), with prover input (x;w)(\mathbf x; \mathbf w) and verifier input x\mathbf x.

Step 3 is where all the actual work happens. Inside it, the protocol is essentially Spartan over Fq\mathbb F_q — sum-check on the R1CS constraint, polynomial-evaluation queries to the witness oracles, the works — with the small wrinkle that the extra ϕq(m)ϕq(u)\phi_q(\mathbf m) \circ \phi_q(\mathbf u) term has to be incorporated into the sum-check polynomial. Prover and verifier compute on Z(q)\mathbb Z_{(q)} values throughout, but the check at the end is over Fq\mathbb F_q. Since both honest prover witnesses and verifier challenges are λ\sim \lambda-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 QB\mathbb Q_B can only get unlucky on qq 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 Fq\mathbb F_q-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 V\mathsf V, an extractor can pull a valid witness out of them. The whole construction stands or falls on one lemma.

The setup. Suppose a malicious P\mathsf P^* convinces V\mathsf V with non-negligible probability. Inside Step 3, the inner PIOP for ϕq(RELR1CS,Z(q))\phi_q(\mathsf{REL}_{\mathsf{R1CS}\ell, \mathbb Z_{(q)}}) has its own knowledge soundness, so an extractor pulls (w,u)Z(q)2nk1(\mathbf w^*, \mathbf u^*) \in \mathbb Z_{(q)}^{2n-k-1} satisfying the projected constraint. Two cases:

  • Lucky case. (x;w)RELR1CS,Q(\mathbf x; \mathbf w^*) \in \mathsf{REL}_{\mathsf{R1CS}\ell, \mathbb Q}. The constraint already holds over Q\mathbb Q. Done.
  • Bad case. It only holds modulo qq. There’s some non-zero vqZ(q)n\mathbf v_q \in \mathbb Z_{(q)}^n with

AzTBzTCzTmTuT  =  qvq.A \mathbf z^T \circ B \mathbf z^T - C \mathbf z^T - \mathbf m^T \circ \mathbf u^T \;=\; q \cdot \mathbf v_q.

Call the left-hand side Q(z)Q(\mathbf z). It’s zero modulo qq but nonzero over Q\mathbb Q. We want: how many primes qq can a fixed z\mathbf z make this happen for? If only poly(λ)\mathrm{poly}(\lambda) many, then the random-prime sampling catches the cheat with overwhelming probability.

Integer warm-up. Suppose for a moment that z,u\mathbf z, \mathbf u and the bad-case vectors are integral. Let II be the set of primes that satisfy the bad-case equation. Then Q(z)Q(\mathbf z) is divisible by every prime in II simultaneously, so

Q(z)=(qIq)vIQ(\mathbf z) = \left(\prod_{q \in I} q\right) \cdot \mathbf v_I

for some nonzero integer vector vI\mathbf v_I. Some entry Q(z)iQ(\mathbf z)_i has bit-size at least qIlogqλI\sum_{q \in I} \log q \approx \lambda \cdot |I|. But Q(z)iQ(\mathbf z)_i is a polynomial expression in the entries of z,u,A,B,C\mathbf z, \mathbf u, A, B, C, all of which are bounded by B=poly(λ)B = \mathrm{poly}(\lambda) bits. Polynomial expressions of bounded-bit-size inputs have bounded-bit-size outputs, so λIpoly(λ)\lambda \cdot |I| \leq \mathrm{poly}(\lambda), which means Ipoly(λ)|I| \leq \mathrm{poly}(\lambda) (dividing a polynomial in λ\lambda by λ\lambda stays polynomial). With V\mathsf V sampling from P=O(2λ)|\mathcal P| = O(2^\lambda) primes, the probability of landing in II is at most poly(λ)/2λ\mathrm{poly}(\lambda)/2^\lambda — negligible.

Lemma 2.1 (informal). The general statement, lifted to Q\mathbb Q:

Let P(Y)=P(Y1,,Yμ)P(\mathbf Y) = P(Y_1, \ldots, Y_\mu) be a polynomial with coefficients in ZB\mathbb Z_B. Let II be a set of primes of bit-size at least λ\lambda, and let yQBμ\mathbf y \in \mathbb Q_B^\mu be such that yZ(q)μ\mathbf y \in \mathbb Z_{(q)}^\mu for all qIq \in I. Assume ϕq(P(y))=0\phi_q(P(\mathbf y)) = 0 for every qIq \in I. Then some entry of y\mathbf y has bit-size at least

λI(B+2degp(P))degp(P),\frac{\lambda \cdot |I| - (B + 2^{\deg_p(P)})}{\deg_p(P)},

where degp(P)=idegYi(P)\deg_p(P) = \sum_i \deg_{Y_i}(P) is the sum of PP‘s partial degrees (the per-variable degree summed across all μ\mu variables).

Read it contrapositively: if every entry of y\mathbf y has bit-size at most BB, then I|I| is at most poly(λ)\mathrm{poly}(\lambda). Many simultaneous “bad” primes force at least one entry of the witness to be huge. A bounded-bit-size witness can only fool poly(λ)\mathrm{poly}(\lambda)-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 II has poly(λ)\mathrm{poly}(\lambda) size as long as the witness entries are bit-size-bounded. Combined with V\mathsf V sampling from 2λ2^\lambda primes, soundness follows.

The same logic handles Step 2. If many primes qq divided the denominator of some (wi,ui)(w_i, u_i), that entry would have to be a fraction with a denominator of bit-size at least qlogq\sum_q \log q. But entries are BB-bounded, so this can happen for at most poly(λ)\mathrm{poly}(\lambda) primes — Step 2 is reachable for at most negligibly many random qq. 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 RELR1CS,Q\mathsf{REL}_{\mathsf{R1CS}\ell, \mathbb Q} — 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 a\mathbf a appears somewhere in a public table t\mathbf t. Formally,

RELLook,Q=(x;w):aQBna,tQBnt,aitj.\mathsf{REL}_{\mathsf{Look}, \mathbb Q} = {(\mathbf x; \mathbf w) : \mathbf a \in \mathbb Q_B^{n_a}, \mathbf t \in \mathbb Q_B^{n_t}, \\{a_i\\} \subseteq \\{t_j\\}\\}.

The same lifting trick works: define a projected version ϕq(RELLook,Z(q))\phi_q(\mathsf{REL}_{\mathsf{Look}, \mathbb Z_{(q)}}), build a PIOP over Fq\mathbb F_q for it (any of the standard lookup arguments — Lasso, LogUp), and wrap it in the same Protocol-1-shaped construction.

The key choice. Set t=[2B+1,2B1]\mathbf t = [-2^B + 1, 2^B - 1] — the table contains every integer of bit-size less than BB. Set a\mathbf a to be the R1CSℓ witness w\mathbf w. Then any w\mathbf w that satisfies the lookup is forced to be an integer in the bounded range.

Combining the two PIOPs gives a PIOP over QB\mathbb Q_B for RELR1CS,Z\mathsf{REL}_{\mathsf{R1CS}\ell, \mathbb Z}:

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 2B+1\sim 2^{B+1}, which is astronomical for B2λ256B \approx 2\lambda \approx 256. 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 [2B+1,2B1][-2^B+1, 2^B - 1] 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 2322^{32}, 2642^{64}, and prime moduli.
  • Localization Z(q)\mathbb Z_{(q)} + projection ϕq\phi_q. A subring of Q\mathbb Q that admits a clean ring homomorphism to Fq\mathbb F_q. Lets us run “modulo qq” sum-check inside a relation that lives over Q\mathbb Q.
  • Zinc-PIOP (Protocol 1). Sample a random prime qq, then run a Spartan-shaped PIOP for the projected relation over Z(q)\mathbb Z_{(q)}. Inside: ordinary sum-check on λ\sim \lambda-bit integers.
  • Lemma 2.1. The pigeonhole-flavored bound that makes random-prime soundness work: a bit-size-bounded witness can fool at most poly(λ)\mathrm{poly}(\lambda) primes. Without it, the construction falls apart.
  • Lookup over [2B+1,2B1][-2^B+1, 2^B-1]. 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 Fq\mathbb F_q. Prover and verifier handle integers of λ\sim \lambda bits throughout. From a system-builder’s perspective, Zinc-PIOP is “Spartan plus a random-prime header” — and it now handles statements over Z\mathbb Z, 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 QB\mathbb Q_B, not Fq\mathbb F_q.
  • Extracts to bounded-bit-size rational coefficients — Lemma 2.1’s precondition. A generic Q\mathbb Q-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-Z\mathbb Z), 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 Q\mathbb Q.
  • 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 Q\mathbb Q.
  • JEA codes (Juxtaposed Expand-Accumulate), the linear code over Q\mathbb Q 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.”