Zinc+ I: Universal Constraint Systems and Native Bitwise Arithmetization

May 27, 2026

What problem are we solving?

Zinc bought back native integer arithmetic for hash-based SNARKs. R1CS, but over Z\mathbb Z — multi-modulus, no hidden-order groups, plausibly post-quantum. Anything that’s arithmetic on bounded integers (RSA-style modular reduction, signed comparisons, multi-modulus statements, FHE-flavored sums) drops in.

What Zinc does not give you for free: bitwise operations. XOR, AND, rotation, shift, modular reduction mod 2w2^w. These aren’t polynomial relations over Z\mathbb Z — they’re properties of a number’s binary representation. To handle them in Zinc you still bit-decompose each ww-bit word into ww Boolean witnesses, prove the decomposition with a lookup, then re-express the bitwise op as a field-arithmetic identity over those bits. A SHA-256 compression round, with its chain of XOR / AND / rotate operations on 32-bit words, fans out into many tens of constraints per round. Witness inflation factor: roughly order ww per word.

That overhead matters because, in production systems, the dominant cost is witness-shaped. In Zinc Part 1 we noted the >80% trace + low-degree-extension + commit number from Stwo. The Zinc+ paper frames the bit-decomposition cost more conservatively as “one or more orders of magnitude” inflation; whichever multiplier you pick, the prover pays it for every bitwise operation.

Zinc+ (Abdugafarov, Garreta, Kumar, Osadnik, Vesely, Vlasov, Zheng — Nethermind Research et al., 2026) is the follow-up that closes this gap. It extends Zinc with two new pieces:

  • UCS (Universal Constraint System). A new arithmetization relation that types witnesses in polynomial rings — Q[X]\mathbb Q[X], Fq[X]\mathbb F_q[X], Z[X]\mathbb Z[X] — and supports a new kind of constraint: ideal membership, Q(b,x,w)IQ(b, x, w) \in I for an ideal II of the constraint ring. Ideal membership is what lets you write XOR, rotation, modular reduction as one-line constraints instead of decomposed lookups.
  • Zinc+ PIOP compiler. A three-step PIOR (polynomial interactive oracle reduction) that turns any finite-field PIOP into a PIOP for UCS. The steps: project the constraint ring down to a prime field, batch all the per-row ideal-membership checks into one polynomial-identity check, then project that polynomial down to a scalar equation. Whatever finite-field PIOP you already have (Spartan, HyperPlonk, anything sumcheck-shaped) runs unchanged on top.

End-to-end on a MacBook Air M4, the paper reports proving 7 SHA-256 compressions followed by the multi-scalar-multiplication portion of ECDSA verification in 40.6 ms prover time, 7.0 ms verifier time, 198 KB proof, at 100 bits of security.

This article is Part 1 of a two-part walkthrough. Here we cover UCS and the Zinc+ PIOR — the arithmetization story and the compiler that drives it. Part 2 will build Zip+, the polynomial commitment scheme that compiles the PIOR into a real argument, along with the new linear-code family it’s instantiated with — IPRS (Integer Pseudo-Reed–Solomon) codes.

ZincZinc+
Witness typingZ\mathbb Z / Q\mathbb QQ[X]\mathbb Q[X], Fqi[X]\mathbb F_{q_i}[X] (multiple rings)
Native arithmeticinteger, multi-modulusinteger, multi-modulus, bitwise, rotation, mod 2w2^w
Constraint formsalgebraic equalityalgebraic equality + ideal membership QIQ \in I
Inner PIOPSpartan-shaped over Fq\mathbb F_qany finite-field PIOP (Spartan, HyperPlonk, \ldots)
PCSZip (Brakedown over Q\mathbb Q)Zip+ (Brakedown over Q\mathbb Q with IPRS codes; Part 2)
Plug-in modeend-to-end SNARKend-to-end or lightweight “add-on” to existing Fq\mathbb F_q SNARK

Prerequisites. You should have read Zinc Part 1 and Part 2. The random-prime trick, the localization Z(q)\mathbb Z_{(q)}, the projection ϕq:Z(q)Fq\phi_q: \mathbb Z_{(q)} \to \mathbb F_q, the R1CSℓ relation, and the Spartan-shaped sumcheck appear here without re-derivation. You do not need prior commutative-algebra background — the next subsection unpacks polynomial rings and ideals from scratch with engineer-friendly definitions, and everything else load-bearing is built up as we go.

What we won’t cover. Zip+ internals, IPRS code construction, the bit-size and well-definedness enforcement that the PCS layer adds on top of the PIOR — all in Part 2.

A glossary before we touch the protocol

A few symbols recur throughout. Worth getting into your head up front:

  • RR — a base commutative ring. Throughout, R{Q,Fq}R \in \{\mathbb Q, \mathbb F_q\} (we mostly avoid Z\mathbb Z for technical reasons; see §5).
  • R[X]R[X] — the polynomial ring over RR. Zinc+ witnesses are vectors of polynomials in R[X]R[X].
  • R<d,B[X]R^{<d,B}[X] — polynomials of degree <d< d with RR-coefficients of bit-size <B< B. The “small polynomial” subset that honest provers commit to.
  • {0,1}<w[X]\{0,1\}^{<w}[X] — bit-polynomials: polynomials of degree <w< w with coefficients in {0,1}\{0,1\}. Used to represent ww-bit strings. A natural bijection with [0,2w)[0,2^w) via evaluation at X=2X = 2.
  • I=(g)I = (g) — a principal ideal of R[X]R[X] generated by a monic polynomial gg. The new primitive: constraints have the form Q()(g)Q(\cdot) \in (g).
  • ϕq0\phi_{q_0} — the prime projection Z(q0)[X]Fq0[X]\mathbb Z_{(q_0)}[X] \to \mathbb F_{q_0}[X], reducing every coefficient mod q0q_0. Same map as Zinc’s ϕq\phi_q, lifted to polynomials in XX.
  • ιq~\iota_{\tilde q} — the canonical embedding Fq[X]Fq~[X]\mathbb F_q[X] \hookrightarrow \mathbb F_{\tilde q}[X] for an extension Fq~Fq\mathbb F_{\tilde q} \supseteq \mathbb F_q. Used when the base ring is already a finite field but too small to give negligible Schwartz–Zippel error.
  • ψa\psi_a — the evaluation map Fq~[X]Fq~\mathbb F_{\tilde q}[X] \to \mathbb F_{\tilde q}, ff(a)f \mapsto f(a). A ring homomorphism for any fixed aFq~a \in \mathbb F_{\tilde q}.
  • q~\tilde q — the “final” finite field the PIOR lands in. q~=q0\tilde q = q_0 when the base ring is Q\mathbb Q; q~=q\tilde q = q^\ell when the base ring is Fq\mathbb F_q with \ell chosen so Fq~=Ω(2λ)|\mathbb F_{\tilde q}| = \Omega(2^\lambda).
  • v^(X)\hat v(X) — the bit-polynomial representation of an integer v[0,2w)v \in [0, 2^w): v^(X)=i=0w1viXi\hat v(X) = \sum_{i=0}^{w-1} v_i X^i where viv_i is bit ii of vv. So v^(2)=v\hat v(2) = v.
  • [[]][[\,\cdot\,]] — oracle access. [[f~]][[\tilde f]] means the verifier holds an oracle for the multilinear extension of ff and can query evaluations at any point.
  • β,ν\beta, \nu — a query point βFq~ν\beta \in \mathbb F_{\tilde q}^\nu, where ν=log2m\nu = \log_2 m is the number of MLE variables for a witness vector of length mm.
  • PIOR vs PIOP. A PIOR is an interactive reduction — it transforms one claim into another and is then composed with a PIOP for the reduced claim. Zinc+‘s three-step compiler is a PIOR; the full protocol is “Zinc+ PIOR composed with any finite-field PIOP.”

Two definitions: polynomial rings and ideals

If you’re already at home with ring theory, skip to the next section. Otherwise — these two words show up on every page, so it’s worth two minutes to pin them down operationally.

Polynomial ring R[X]R[X]. Pick a base ring RR (think R=ZR = \mathbb Z, Q\mathbb Q, or Fq\mathbb F_q — the integers, the rationals, or a prime field). The polynomial ring R[X]R[X] is the set of all polynomials a0+a1X+a2X2++adXda_0 + a_1 X + a_2 X^2 + \cdots + a_d X^d whose coefficients aia_i are elements of RR. You add them coefficient-wise and multiply them the usual way (distribute, collect like terms). That’s it. Q[X]\mathbb Q[X] is “polynomials with rational coefficients.” F2[X]\mathbb F_2[X] is “polynomials with 0/1 coefficients, where 1+1=01 + 1 = 0.” Engineers can think of a polynomial v^(X)=v0+v1X++vw1Xw1\hat v(X) = v_0 + v_1 X + \cdots + v_{w-1} X^{w-1} as just a length-ww vector (v0,,vw1)(v_0, \ldots, v_{w-1}) with a few extra algebraic operations available — multiplication is convolution, reduction modulo some g(X)g(X) is “fold the high entries back into the low ones according to gg.”

Ideal (g)R[X](g) \subseteq R[X]. An ideal generated by a polynomial g(X)g(X) is the set of all multiples of gg inside R[X]R[X]:

(g)=g(X)h(X):h(X)R[X].(g) = {g(X) \cdot h(X) : h(X) \in R[X]\\}.

Saying "p(X)(g)p(X) \in (g)" is the polynomial-ring analog of saying ”nn is divisible by 77” in Z\mathbb Z (which is the ideal (7)Z(7) \subseteq \mathbb Z). Equivalently, p(X)(g)p(X) \in (g) iff p(X)modg(X)=0p(X) \bmod g(X) = 0 — divide pp by gg, get remainder zero.

The one trick worth remembering. When g(X)=Xcg(X) = X - c for some constant cRc \in R, ideal membership has a clean operational reading:

p(X)(Xc)    p(c)=0.p(X) \in (X - c) \quad \iff \quad p(c) = 0.

That’s the “factor theorem” from high-school algebra. Why: p(X)=(Xc)h(X)p(X) = (X - c) \cdot h(X) for some hh iff plugging in X=cX = c kills pp. Half the UCS examples below are this trick — pick c=2c = 2 to talk about bitstring-to-integer conversion, pick the right gg to talk about rotation, etc. If gg is more complicated than XcX - c (e.g., g=Xw1g = X^w - 1 for rotation), the same intuition lifts: p(g)p \in (g) means ”pp is zero in the quotient ring R[X]/(g)R[X] / (g),” which is the ring you get by setting g(X)=0g(X) = 0 and reducing everything mod gg.

That’s all the algebra. Three sentences: R[X]R[X] is polynomials with coefficients in RR; (g)(g) is multiples of gg; p(Xc)p \in (X - c) means p(c)=0p(c) = 0. The rest of the article builds on these.

The bitwise wall Zinc still hits

Zinc handles a 32-bit integer multiplication mod 2322^{32} in one R1CSℓ row: write the constraint z1z2=z3+232uz_1 \cdot z_2 = z_3 + 2^{32} \cdot u over Z\mathbb Z, where uu is the integer-quotient witness. One row, two multiplications, done.

XOR doesn’t have that shape. There’s no polynomial PP over Z\mathbb Z such that P(a,b)=abP(a, b) = a \oplus b for all 32-bit a,ba, b — XOR is a property of the bits of aa and bb, and bits are not algebraically definable in Z\mathbb Z. The standard workaround:

  1. Bit-decompose each 32-bit word aa into 32 Boolean witnesses a0,,a31a_0, \ldots, a_{31}.
  2. Add 32 lookup constraints enforcing ai{0,1}a_i \in \{0, 1\} (or a single bulk lookup against a 2-element table).
  3. Constrain consistency: a=iai2ia = \sum_i a_i \cdot 2^i.
  4. Express XOR as 3232 field-level identities (ab)i=ai+bi2aibi(a \oplus b)_i = a_i + b_i - 2 a_i b_i.
  5. Repeat for AND, rotation, shift — each with its own field-level identity over the bit-decomposed witness.

For a single XOR of two 32-bit words: 64 Boolean lookups + 2 sum constraints + 32 XOR identities. Multiply by SHA-256’s 6464 rounds, each with several XOR/AND/rotate operations on 3232-bit words, and the witness for one compression balloons. The actual arithmetic — squaring, modular reduction — is dwarfed by the bookkeeping needed to expose individual bits.

You can shrink the constant by switching to a binary field. Binius uses F2k\mathbb F_{2^k}, where XOR is addition for free; Stwo uses Mersenne-31 and accepts the bit-decomposition cost. Binary fields help for XOR but not for AND, not for rotation, and not for modular arithmetic mod a non-power-of-two — and most cryptographic primitives use all of these together.

The Zinc+ pivot. Don’t pick one ring. Let constraints live in several rings simultaneously, and use ideal membership as a bridge between them.

XOR has a natural home in F2[X]\mathbb F_2[X] (addition in F2\mathbb F_2 is XOR). Modular arithmetic mod nn has a natural home in Q[X]\mathbb Q[X] (where you can express “differs from a multiple of nn” as the slack term nμn \cdot \mu). Rotation on a ww-bit word is multiplication by XX modulo the ideal (Xw1)(X^w - 1). Bitstring-to-integer conversion is evaluation at X=2X = 2, i.e. equality modulo the ideal (X2)(X - 2). Each operation lands in the ring where it’s algebraically free, and a typed witness vector — entries in Q[X]\mathbb Q[X] but projectable to F2[X]\mathbb F_2[X], Fqi[X]\mathbb F_{q_i}[X], Q\mathbb Q, etc. via canonical homomorphisms — knits them together.

That’s UCS.

The UCS framework

A UCS instance is a list of constraints. Each constraint is typed by a ring — Q[X]\mathbb Q[X] or some Fqi[X]\mathbb F_{q_i}[X] — and takes one of two forms:

  • Algebraic equality: Q(b,x,w)=0Q(b, x, w) = 0 for all b{0,1}μb \in \{0, 1\}^\mu, evaluated over the constraint ring. This is the AIR / R1CS / CCS / Plonkish family, generalized to ring-typed witnesses.
  • Ideal membership: Q(b,x,w)(g)Q(b, x, w) \in (g) for all b{0,1}μb \in \{0, 1\}^\mu, where gg is a monic polynomial generating the constraint ideal. This is the new primitive.

A single witness vector u^\hat u typed in Q[X]\mathbb Q[X] can participate in multiple constraints, each over a different ring, via canonical projection homomorphisms. Reduce coefficients mod qiq_i to get ϕqi(u^)Fqi[X]\phi_{q_i}(\hat u) \in \mathbb F_{q_i}[X]. Evaluate at X=2X = 2 to get ψ2(u^)Q\psi_2(\hat u) \in \mathbb Q. The same column shows up in a bit-rotation constraint over F2[X]\mathbb F_2[X], a modular-arithmetic constraint over Q[X]\mathbb Q[X], and an integer-comparison lookup — all simultaneously. When restricted to a single finite field with I=(0)I = (0) (the zero ideal), UCS specializes back to R1CS / CCS / AIR / Plonkish; nothing is lost.

The four examples below are the workhorses. Each one is an ideal-membership constraint that replaces a chain of bit-decomposed lookups.

Example A: bitstring ↔ integer via (X2)(X - 2). Take a witness v^{0,1}<w[X]\hat v \in \{0,1\}^{<w}[X] representing a ww-bit string, and an integer witness uu. The constraint

v^u(X2)over R[X]\hat v - u \in (X - 2) \quad \text{over } R[X]

forces uu to be the integer represented by v^\hat v. The proof in one sentence: p(X)(X2)p(X) \in (X - 2) iff p(2)=0p(2) = 0, so v^u(X2)\hat v - u \in (X - 2) iff v^(2)=u\hat v(2) = u, and v^(2)=ivi2i\hat v(2) = \sum_i v_i \cdot 2^i is exactly the integer the bitstring encodes. One constraint, no per-bit decomposition lookup on uu.

Example B: rotation via (Xw1)(X^w - 1). Left-rotate a ww-bit word by one position. If u^{0,1}<w[X]\hat u \in \{0,1\}^{<w}[X] and b^\hat b is supposed to be ROTL1(u^)\text{ROTL}_1(\hat u), the constraint

b^Xu^(Xw1)over R[X]\hat b - X \cdot \hat u \in (X^w - 1) \quad \text{over } R[X]

does it. Why: multiplication by XX shifts every coefficient one position left; reducing mod Xw1X^w - 1 wraps the overflow bit (the one that would land at position ww) back to position 00. That’s exactly the cyclic-rotation semantics. The general statement (right rotation by rr bits): b^Xwru^(Xw1)\hat b - X^{w-r} \cdot \hat u \in (X^w - 1) encodes b^=ROTRr(u^)\hat b = \text{ROTR}_r(\hat u).

Example C: XOR via ϕ2\phi_2. For u^,v^,z^{0,1}<w[X]\hat u, \hat v, \hat z \in \{0,1\}^{<w}[X],

z^=u^ XOR v^    ϕ2(z^)=ϕ2(u^)+ϕ2(v^) in F2[X].\hat z = \hat u \text{ XOR } \hat v \quad \iff \quad \phi_2(\hat z) = \phi_2(\hat u) + \phi_2(\hat v) \text{ in } \mathbb F_2[X].

Read: project each bit-polynomial coefficient-wise mod 2 (so the coefficients land in F2\mathbb F_2, where 1+1=01 + 1 = 0); the resulting addition in F2[X]\mathbb F_2[X] is XOR on the original bits. This gives you XOR as a one-line algebraic equality in F2[X]\mathbb F_2[X] on the projected witness. An alternative, valid over any R[X]R[X], is the integer identity u^+v^=z^+2w^\hat u + \hat v = \hat z + 2 \cdot \hat w with w^=u^ AND v^\hat w = \hat u \text{ AND } \hat v — both forms appear in the paper’s SHA-256 arithmetization, picked per slot for whatever fits the surrounding constraints best.

Example D: squaring mod nn in one ideal-membership constraint. Let u^,v^{0,1}<w[X]\hat u, \hat v \in \{0,1\}^{<w}[X] represent input and output, nZn \in \mathbb Z an arbitrary (possibly non-prime, possibly non-power-of-two) modulus, and μZ\mu \in \mathbb Z a slack witness. The constraint

v^u^2+nμ(X2)over Q[X]\hat v - \hat u^2 + n \cdot \mu \in (X - 2) \quad \text{over } \mathbb Q[X]

enforces ψ2(v^)=ψ2(u^)2modn\psi_2(\hat v) = \psi_2(\hat u)^2 \bmod n. The slack μ\mu is the integer quotient that absorbs the multiple of nn, just like Zinc’s R1CSℓ slack u\mathbf u absorbs the multiple of the row modulus. Evaluating at X=2X = 2 on both sides: v^(2)u^(2)2+nμ=0\hat v(2) - \hat u(2)^2 + n \cdot \mu = 0, i.e. v=u2nμv = u^2 - n \cdot \mu, i.e. vu2(modn)v \equiv u^2 \pmod n. The integrality of μ\mu is enforced by a lookup; everything else is one ideal-membership constraint.

Compare this to the Zinc baseline: bit-decompose uu, bit-decompose vv, square via field arithmetic on the bits, range-check the result, prove vv matches the modular reduction. Dozens of constraints, hundreds of bits of witness for non-power-of-two nn. Replaced by one ideal-membership predicate plus a small slack.

The witness-typing rule. Honest provers commit witnesses with entries in Q<d,B[X]\mathbb Q^{<d,B}[X] or Fq<d[X]\mathbb F_q^{<d}[X]. The PCS / IOPP enforces typing into F,F[X],Q,Q[X]\mathbb F, \mathbb F[X], \mathbb Q, \mathbb Q[X] — that’s a guarantee at the commitment layer. The narrower types — Z\mathbb Z, Z[X]\mathbb Z[X], {0,1}<w[X]\{0,1\}^{<w}[X], [0,2w)[0, 2^w) — are enforced by lookup constraints at the PIOP layer. In practice, most “is this an integer?” checks are subsumed by upstream constraints (e.g., the squaring-mod-nn slack μ\mu has its integrality enforced once and used everywhere downstream). Part 2 covers how the PCS guarantees the wider type; here we treat lookups as a primitive.

The Zinc+ PIOP compiler: a three-step PIOR

Now the protocol. We have a UCS constraint of the form

Q(b,x,w)(g)for all b{0,1}μ, over R[X],Q(b, x, w) \in (g) \quad \text{for all } b \in \{0, 1\}^\mu, \text{ over } R[X],

where gR[X]g \in R[X] is a monic polynomial of degree 1\geq 1, QQ is a polynomial expression on the row index bb, public input xx, and witness ww, and R{Q,Fq}R \in \{\mathbb Q, \mathbb F_q\}. The prover sends an oracle to the multilinear extension w~\tilde w of the witness. We want to reduce this to a check a standard finite-field PIOP can run.

Three reduction steps do it.

Step 1 — Ring projection

If R=QR = \mathbb Q. The verifier samples a random Ω(λ)\Omega(\lambda)-bit prime q0q_0 and both parties apply ϕq0\phi_{q_0} coefficient-wise to everything — QQ, xx, ww, gg. The constraint lands in Fq0[X]\mathbb F_{q_0}[X]:

ϕq0(Q)(b,ϕq0(x),ϕq0(w))(ϕq0(g))over Fq0[X].\phi_{q_0}(Q)(b, \phi_{q_0}(x), \phi_{q_0}(w)) \in (\phi_{q_0}(g)) \quad \text{over } \mathbb F_{q_0}[X].

Since gg is monic, ϕq0(g)\phi_{q_0}(g) has the same degree (the leading coefficient is 11, which is never killed by reduction mod q0q_0), so the projected ideal is non-trivial. Set q~=q0\tilde q = q_0.

If R=FqR = \mathbb F_q. Pick \ell so that q~=q\tilde q = q^\ell satisfies Fq~=Ω(2λ)|\mathbb F_{\tilde q}| = \Omega(2^\lambda) — if qq is already Ω(2λ)\Omega(2^\lambda)-bits, =1\ell = 1 and this step is the identity. Apply the canonical embedding ιq~:FqFq~\iota_{\tilde q}: \mathbb F_q \hookrightarrow \mathbb F_{\tilde q} coefficient-wise. The constraint is now over Fq~[X]\mathbb F_{\tilde q}[X], and the embedded ideal stays the same degree.

The soundness story for the R=QR = \mathbb Q branch is the polynomial version of Zinc’s random-prime trick from Part 1. If the unprojected Q(b,x,w)Q(b, x, w) is not in (g)(g), Euclidean division in Q[X]\mathbb Q[X] gives Q(b,x,w)=gh+rQ(b, x, w) = g \cdot h + r with r0r \neq 0 and degr<degg\deg r < \deg g. Bounded-bit-size witnesses keep the coefficients of rr bounded; a Lemma-2.1-style argument bounds the set of primes that can kill all coefficients of rr at poly(λ)\text{poly}(\lambda). With q0q_0 sampled from Ω(2λ)\Omega(2^\lambda) primes, the cheat is caught with overwhelming probability. The bad-denominator branch (some entry of ww not in Z(q0)[X]\mathbb Z_{(q_0)}[X]) is handled exactly as in Zinc — bit-size bounds give it negligible probability for an honest prover.

The point of Step 1 isn’t to do new work; it’s to land the constraint in a polynomial ring over a finite field, which is where the remaining two steps can run with cheap arithmetic and Schwartz–Zippel-flavored soundness.

Step 2 — Ideal batching

After Step 1, every constraint is of the form Q(b,y,f)(g)Q(b, y, f) \in (g) for b{0,1}μb \in \{0,1\}^\mu over Fq~[X]\mathbb F_{\tilde q}[X]. Notation switch: we relabel the projected public input as yy and the projected witness as ff — matching the Zinc+ paper from this point on, and reminding the reader these are post-Step-1 objects, not the originals. The constraint count is n=2μn = 2^\mu separate ideal-membership checks. Batching collapses them into one.

The verifier samples rFq~μr \leftarrow \mathbb F_{\tilde q}^\mu. The prover sends a polynomial eFq~[X]e \in \mathbb F_{\tilde q}[X], claimed to be the multilinear-extension evaluation of the per-row constraint values at rr:

e  =  b{0,1}μQ(b,y,f)eq~(b;r).e \;=\; \sum_{b \in \{0,1\}^\mu} Q(b, y, f) \cdot \widetilde{\mathrm{eq}}(b; r).

Both sides live in Fq~[X]\mathbb F_{\tilde q}[X]Q(b,y,f)Q(b, y, f) is a polynomial in XX for each fixed bb, and the sum is taken in Fq~[X]\mathbb F_{\tilde q}[X] with eq~(b;r)Fq~\widetilde{\mathrm{eq}}(b; r) \in \mathbb F_{\tilde q} as scalar coefficients. The verifier (a) checks e(g)e \in (g) — one polynomial division, since Fq~[X]\mathbb F_{\tilde q}[X] is a principal ideal domain and gg is monic — and (b) replaces the 2μ2^\mu original constraints with the single strict polynomial equality

b{0,1}μQ(b,y,f)eq~(b;r)    e  =  0in Fq~[X].()\sum_{b \in \{0,1\}^\mu} Q(b, y, f) \cdot \widetilde{\mathrm{eq}}(b; r) \;-\; e \;=\; 0 \quad \text{in } \mathbb F_{\tilde q}[X]. \qquad (\star)

The soundness primitive is a Schwartz–Zippel for ideal membership:

Lemma 2.10 (informal). Let KK be a field, gK[X]g \in K[X] a polynomial of degree 1\geq 1, and vK[X]nv \in K[X]^n with n=2μn = 2^\mu. If some entry vb(g)v_b \notin (g), then PrrSμ[v~(r)(g)]μ/S\Pr_{r \leftarrow S^\mu}\left[\tilde v(r) \in (g)\right] \leq \mu / |S| for any finite SKS \subseteq K.

The proof projects onto the quotient K[X]/(g)K[X] / (g) — which is a degg\deg g-dimensional KK-vector space — and applies vanilla Schwartz–Zippel to each coordinate. If even one coordinate is non-zero in the quotient, the MLE evaluation at random rr misses zero with overwhelming probability.

Operationally: one ideal-membership check on a single batched polynomial ee replaces 2μ2^\mu separate ideal-membership checks. The standard sumcheck trick of “test v~(r)=0{\tilde v(r) = 0} instead of v=0{v = \mathbf 0}” becomes “test v~(r)(g)\tilde v(r) \in (g) instead of v(g)nv \in (g)^n.”

Step 3 — Evaluation projection

We have a strict polynomial equality ()(\star) over Fq~[X]\mathbb F_{\tilde q}[X]. To hand it to a finite-field PIOP, drop the XX. The verifier samples aFq~a \leftarrow \mathbb F_{\tilde q} and evaluates both sides at X=aX = a via ψa\psi_a, replacing ()(\star) with

b{0,1}μψa(Q)(b,ψa(y),ψa(f))eq~(b;r)    ψa(e)  =  0in Fq~.()\sum_{b \in \{0,1\}^\mu} \psi_a(Q)(b, \psi_a(y), \psi_a(f)) \cdot \widetilde{\mathrm{eq}}(b; r) \;-\; \psi_a(e) \;=\; 0 \quad \text{in } \mathbb F_{\tilde q}. \qquad (\star\star)

If ()(\star) was a non-zero polynomial in Fq~[X]\mathbb F_{\tilde q}[X] of degree ddQ\leq d \cdot d_Q (where dd bounds the per-coefficient XX-degree and dQd_Q is QQ‘s total degree in its algebraic variables), evaluating at random aa catches it with probability 1ddQ/Fq~\geq 1 - d \cdot d_Q / |\mathbb F_{\tilde q}|. For Fq~=Ω(2λ)|\mathbb F_{\tilde q}| = \Omega(2^\lambda), that’s negligible. Standard PIT.

What the inner PIOP sees

After three steps, the constraint is a plain Fq~\mathbb F_{\tilde q} equation in ψa(y),ψa(f)\psi_a(y), \psi_a(f). A standard finite-field PIOP ΠFq~\Pi_{\mathbb F_{\tilde q}} — Spartan, HyperPlonk, anything sumcheck-shaped that handles your constraint type — runs on top, with:

  • Public input: ψa(y)\psi_a(y).
  • Witness oracles: the same prover oracle [[f~]][[\tilde f]] as before, but exposing projected evaluations — a query at βFq~ν\beta \in \mathbb F_{\tilde q}^\nu returns ψa(f)~(β)Fq~\widetilde{\psi_a(f)}(\beta) \in \mathbb F_{\tilde q}.

The “projected oracle” interface is what makes the inner PIOP oblivious to UCS. From its perspective, [[f~]][[\tilde f]] is just an Fq~\mathbb F_{\tilde q}-multilinear-polynomial oracle. The PCS — Zip+ in Part 2 — is what actually delivers this interface from a commitment to fQ<d,B[X]f \in \mathbb Q^{<d,B}[X].

One subtlety. When R=QR = \mathbb Q, ψa=ψq0,a\psi_a = \psi_{q_0, a} is only defined on Z(q0)[X]\mathbb Z_{(q_0)}[X], so it may be undefined on entries of ff whose denominator goes bad mod q0q_0. The oracle’s contract is: return the projected value when defined, return \bot otherwise. The verifier rejects on \bot. For uniformly random query points, well-definedness violations are caught with overwhelming probability — the same kind of bit-size-driven counting argument as Zinc Part 1.

What’s load-bearing vs cosmetic

  • Step 1 is the random-prime trick from Zinc, lifted to polynomials. Same lemma, same intuition, no new machinery.
  • Step 2 is the genuinely new piece. Lemma 2.10 — MLE-evaluation implies ideal membership — is the soundness primitive that didn’t exist in Zinc. Everything that distinguishes Zinc+ from Zinc lives here.
  • Step 3 is vanilla Schwartz–Zippel-style polynomial identity testing.

The diagram of the whole compiler:

R[X]  ϕq0 or ιq~  Fq~[X]  MLE at r  Fq~[X]  ψa  Fq~  ΠFq~  accept/rejectR[X] \xrightarrow{\;\phi_{q_0} \text{ or } \iota_{\tilde q}\;} \mathbb F_{\tilde q}[X] \xrightarrow{\;\text{MLE at } r\;} \mathbb F_{\tilde q}[X] \xrightarrow{\;\psi_a\;} \mathbb F_{\tilde q} \xrightarrow{\;\Pi_{\mathbb F_{\tilde q}}\;} \text{accept/reject}

Top row: the ring the constraint lives in. Bottom row (implicit): the constraint shape — ideal membership, ideal membership (batched), strict equality, Fq~\mathbb F_{\tilde q} equation.

The Zinc+ add-on: Fq\mathbb F_q-only and bolt-on

The compiler simplifies dramatically when there are no Q[X]\mathbb Q[X] constraints — i.e., all UCS constraints are over Fq[X]\mathbb F_q[X] for a single fixed qq. This is the regime the paper calls the Zinc+ add-on.

What drops out:

  • Step 1 collapses to ιq~\iota_{\tilde q} (if qq is small) or the identity (if qq is already Ω(2λ)\Omega(2^\lambda) bits). No prime sampling, no Z(q0)\mathbb Z_{(q_0)} machinery, no well-definedness branch.
  • Steps 2 and 3 stay exactly as above.
  • The PCS layer doesn’t need Zip+ or any Q[X]\mathbb Q[X]-IOPP — your existing Fq\mathbb F_q PCS, wrapped with an interleaved commitment (commit to each coefficient-layer f0,,fd1f_0, \ldots, f_{d-1} of fFq<d[X]f \in \mathbb F_q^{<d}[X] as separate Fq\mathbb F_q-multilinear polynomials), is enough. Part 2 covers the interleaving mechanics.

What you get: any existing hash-based Fq\mathbb F_q SNARK gains the ability to prove ideal-membership constraints over Fq<d[X]\mathbb F_q^{<d}[X] — bitwise operations, rotations, modular arithmetic over Fq<w[X]\mathbb F_q^{<w}[X] — with no modifications to existing components. You bolt Steps 2 and 3 onto the front of the PIOP, wrap the PCS with the interleaved commitment, and you’re done.

Concretely, the paper notes that with qq a prime of 40\geq 40 bits, a SHA-256 compression can be arithmetized with a 64×1364 \times 13 witness trace over Fq<32[X]\mathbb F_q^{<32}[X] using only linear constraints plus lookup constraints. The commitment cost amounts to committing to a vector of size ndn \cdot d over Fq\mathbb F_q (e.g., n32n \cdot 32 for SHA-256-shaped traces); the rest of the PIOP operates on the much smaller 64×1364 \times 13 trace.

The engineering takeaway: a UCS arithmetization for, say, SHA-256 → existing Fq\mathbb F_q PCS + a thin compatibility layer → a working SNARK. No exotic PCS, no integer machinery, no hidden-order groups.

Where we stand

The stack so far:

  • UCS relation. Witnesses typed in Q[X]\mathbb Q[X] and/or Fqi[X]\mathbb F_{q_i}[X], with constraints of the form Q(b,x,w)(g)Q(b, x, w) \in (g) over any of these rings. Generalizes R1CS / CCS / AIR / Plonkish; adds ideal-membership as a first-class primitive. Native arithmetization for XOR, AND, rotation, bitstring-integer conversion, and modular arithmetic mod arbitrary nn.
  • Zinc+ PIOR. Three reduction steps — ring projection (ϕq0\phi_{q_0} or ιq~\iota_{\tilde q}), ideal batching (Lemma 2.10), evaluation projection (ψa\psi_a). Reduces UCS satisfiability to a standard Fq~\mathbb F_{\tilde q} equation.
  • Inner PIOP. Any finite-field PIOP plugs in via projected oracles.
  • Zinc+ add-on. Fq\mathbb F_q-only case: drop ring projection, reuse your Fq\mathbb F_q PCS via interleaved commits. Lightweight bolt-on for existing hash-based SNARKs.

What we have is a PIOR. What we don’t yet have is the polynomial commitment infrastructure that lets a verifier query the projected oracles cheaply when R=QR = \mathbb Q.

Why we’re not done yet

The PIOR’s inner PIOP queries the prover’s witness through a projected oracle [[f~]][[\tilde f]]: given a commit to fQ<d,B[X]f \in \mathbb Q^{<d,B}[X], a verifier-sampled prime q0q_0, and a random aFq0a \in \mathbb F_{q_0}, the oracle has to answer evaluation queries ψq0,a(f)~(β)\widetilde{\psi_{q_0, a}(f)}(\beta) for arbitrary βFq0ν\beta \in \mathbb F_{q_0}^\nu. The oracle also has to enforce bit-size and well-definedness as commitment-level properties, so that Lemma-2.1-style soundness arguments survive into the PCS regime.

For R=FqR = \mathbb F_q, your existing Fq\mathbb F_q PCS handles all of this. For R=QR = \mathbb Q, you need a fresh commitment scheme. That scheme is Zip+ — a successor to Zinc Part 2’s Zip, with three key changes: it works in the list-decoding regime up to the Mutual Correlated Agreement bound (instead of unique decoding), merges the test and evaluation phases into one, and is instantiated with a new linear code family — IPRS (Integer Pseudo-Reed–Solomon) — that gives MDS-optimal distance, O(nlogn)O(n \log n) FFT-based encoding, and bounded norm growth on encoded codewords. None of those three properties were available simultaneously over Q\mathbb Q before.

Part 2 will cover:

  • Zip+‘s IOPP design for Q<d,B[X]\mathbb Q^{<d,B}[X]-multilinear polynomials, including the projected-oracle interface and the merged test-eval phase.
  • IPRS codes — construction (the “lift the FFT, not the polynomial” trick), distance properties, encoding cost, and the norm-growth analysis.
  • Bit-size and well-definedness enforcement at the commitment layer.
  • The BCS-style compilation that turns the PIOR + PCS stack into a hash-only succinct argument for UCS.

Continue to Part 2 (forthcoming).

References

  • Zinc+: SNARKs for Polynomial Rings. Alexander Abdugafarov, Albert Garreta, Amit Kumar, Michał Osadnik, Psi Vesely, Ilia Vlasov, Kai Zhe Zheng. Nethermind Research et al., May 2026. PDF
  • Zinc Part 1: A PIOP Over the Rationals That Bypasses Arithmetization. Walkthrough on this blog.
  • Zinc Part 2: Compiling the PIOP with Zip. Walkthrough on this blog.
  • Spartan: Efficient and General-Purpose zkSNARKs Without Trusted Setup. Srinath Setty. CRYPTO 2020.
  • Brakedown: Linear-time and field-agnostic SNARKs for R1CS. Golovnev, Lee, Setty, Thaler, Wahby. CRYPTO 2023.
  • Mod-AHP / Zartan. Matteo Campanelli, Mathias Hall-Andersen. 2024. The prior random-prime construction Zinc and Zinc+ build on.
  • HyperPlonk. Chen, Bünz, Boneh, Zhang. EUROCRYPT 2023.
  • Binius. Diamond, Posen. 2024–2025. Binary-field SNARKs; the closest comparison point for native bitwise arithmetization.
  • Stwo. Haböck, Levit, Papini. 2024. Mersenne-31 hash-based SNARK referenced for the witness-cost breakdown.