What problem are we solving?
Zinc bought back native integer arithmetic for hash-based SNARKs. R1CS, but over — 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 . These aren’t polynomial relations over — they’re properties of a number’s binary representation. To handle them in Zinc you still bit-decompose each -bit word into 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 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 — , , — and supports a new kind of constraint: ideal membership, for an ideal 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.
| Zinc | Zinc+ | |
|---|---|---|
| Witness typing | / | , (multiple rings) |
| Native arithmetic | integer, multi-modulus | integer, multi-modulus, bitwise, rotation, mod |
| Constraint forms | algebraic equality | algebraic equality + ideal membership |
| Inner PIOP | Spartan-shaped over | any finite-field PIOP (Spartan, HyperPlonk, ) |
| PCS | Zip (Brakedown over ) | Zip+ (Brakedown over with IPRS codes; Part 2) |
| Plug-in mode | end-to-end SNARK | end-to-end or lightweight “add-on” to existing SNARK |
Prerequisites. You should have read Zinc Part 1 and Part 2. The random-prime trick, the localization , the projection , 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:
- — a base commutative ring. Throughout, (we mostly avoid for technical reasons; see §5).
- — the polynomial ring over . Zinc+ witnesses are vectors of polynomials in .
- — polynomials of degree with -coefficients of bit-size . The “small polynomial” subset that honest provers commit to.
- — bit-polynomials: polynomials of degree with coefficients in . Used to represent -bit strings. A natural bijection with via evaluation at .
- — a principal ideal of generated by a monic polynomial . The new primitive: constraints have the form .
- — the prime projection , reducing every coefficient mod . Same map as Zinc’s , lifted to polynomials in .
- — the canonical embedding for an extension . Used when the base ring is already a finite field but too small to give negligible Schwartz–Zippel error.
- — the evaluation map , . A ring homomorphism for any fixed .
- — the “final” finite field the PIOR lands in. when the base ring is ; when the base ring is with chosen so .
- — the bit-polynomial representation of an integer : where is bit of . So .
- — oracle access. means the verifier holds an oracle for the multilinear extension of and can query evaluations at any point.
- — a query point , where is the number of MLE variables for a witness vector of length .
- 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 . Pick a base ring (think , , or — the integers, the rationals, or a prime field). The polynomial ring is the set of all polynomials whose coefficients are elements of . You add them coefficient-wise and multiply them the usual way (distribute, collect like terms). That’s it. is “polynomials with rational coefficients.” is “polynomials with 0/1 coefficients, where .” Engineers can think of a polynomial as just a length- vector with a few extra algebraic operations available — multiplication is convolution, reduction modulo some is “fold the high entries back into the low ones according to .”
Ideal . An ideal generated by a polynomial is the set of all multiples of inside :
Saying "" is the polynomial-ring analog of saying ” is divisible by ” in (which is the ideal ). Equivalently, iff — divide by , get remainder zero.
The one trick worth remembering. When for some constant , ideal membership has a clean operational reading:
That’s the “factor theorem” from high-school algebra. Why: for some iff plugging in kills . Half the UCS examples below are this trick — pick to talk about bitstring-to-integer conversion, pick the right to talk about rotation, etc. If is more complicated than (e.g., for rotation), the same intuition lifts: means ” is zero in the quotient ring ,” which is the ring you get by setting and reducing everything mod .
That’s all the algebra. Three sentences: is polynomials with coefficients in ; is multiples of ; means . The rest of the article builds on these.
The bitwise wall Zinc still hits
Zinc handles a 32-bit integer multiplication mod in one R1CSℓ row: write the constraint over , where is the integer-quotient witness. One row, two multiplications, done.
XOR doesn’t have that shape. There’s no polynomial over such that for all 32-bit — XOR is a property of the bits of and , and bits are not algebraically definable in . The standard workaround:
- Bit-decompose each 32-bit word into 32 Boolean witnesses .
- Add 32 lookup constraints enforcing (or a single bulk lookup against a 2-element table).
- Constrain consistency: .
- Express XOR as field-level identities .
- 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 rounds, each with several XOR/AND/rotate operations on -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 , 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 (addition in is XOR). Modular arithmetic mod has a natural home in (where you can express “differs from a multiple of ” as the slack term ). Rotation on a -bit word is multiplication by modulo the ideal . Bitstring-to-integer conversion is evaluation at , i.e. equality modulo the ideal . Each operation lands in the ring where it’s algebraically free, and a typed witness vector — entries in but projectable to , , , 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 — or some — and takes one of two forms:
- Algebraic equality: for all , evaluated over the constraint ring. This is the AIR / R1CS / CCS / Plonkish family, generalized to ring-typed witnesses.
- Ideal membership: for all , where is a monic polynomial generating the constraint ideal. This is the new primitive.
A single witness vector typed in can participate in multiple constraints, each over a different ring, via canonical projection homomorphisms. Reduce coefficients mod to get . Evaluate at to get . The same column shows up in a bit-rotation constraint over , a modular-arithmetic constraint over , and an integer-comparison lookup — all simultaneously. When restricted to a single finite field with (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 . Take a witness representing a -bit string, and an integer witness . The constraint
forces to be the integer represented by . The proof in one sentence: iff , so iff , and is exactly the integer the bitstring encodes. One constraint, no per-bit decomposition lookup on .
Example B: rotation via . Left-rotate a -bit word by one position. If and is supposed to be , the constraint
does it. Why: multiplication by shifts every coefficient one position left; reducing mod wraps the overflow bit (the one that would land at position ) back to position . That’s exactly the cyclic-rotation semantics. The general statement (right rotation by bits): encodes .
Example C: XOR via . For ,
Read: project each bit-polynomial coefficient-wise mod 2 (so the coefficients land in , where ); the resulting addition in is XOR on the original bits. This gives you XOR as a one-line algebraic equality in on the projected witness. An alternative, valid over any , is the integer identity with — both forms appear in the paper’s SHA-256 arithmetization, picked per slot for whatever fits the surrounding constraints best.
Example D: squaring mod in one ideal-membership constraint. Let represent input and output, an arbitrary (possibly non-prime, possibly non-power-of-two) modulus, and a slack witness. The constraint
enforces . The slack is the integer quotient that absorbs the multiple of , just like Zinc’s R1CSℓ slack absorbs the multiple of the row modulus. Evaluating at on both sides: , i.e. , i.e. . The integrality of is enforced by a lookup; everything else is one ideal-membership constraint.
Compare this to the Zinc baseline: bit-decompose , bit-decompose , square via field arithmetic on the bits, range-check the result, prove matches the modular reduction. Dozens of constraints, hundreds of bits of witness for non-power-of-two . Replaced by one ideal-membership predicate plus a small slack.
The witness-typing rule. Honest provers commit witnesses with entries in or . The PCS / IOPP enforces typing into — that’s a guarantee at the commitment layer. The narrower types — , , , — 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- slack 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
where is a monic polynomial of degree , is a polynomial expression on the row index , public input , and witness , and . The prover sends an oracle to the multilinear extension 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 . The verifier samples a random -bit prime and both parties apply coefficient-wise to everything — , , , . The constraint lands in :
Since is monic, has the same degree (the leading coefficient is , which is never killed by reduction mod ), so the projected ideal is non-trivial. Set .
If . Pick so that satisfies — if is already -bits, and this step is the identity. Apply the canonical embedding coefficient-wise. The constraint is now over , and the embedded ideal stays the same degree.
The soundness story for the branch is the polynomial version of Zinc’s random-prime trick from Part 1. If the unprojected is not in , Euclidean division in gives with and . Bounded-bit-size witnesses keep the coefficients of bounded; a Lemma-2.1-style argument bounds the set of primes that can kill all coefficients of at . With sampled from primes, the cheat is caught with overwhelming probability. The bad-denominator branch (some entry of not in ) 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 for over . Notation switch: we relabel the projected public input as and the projected witness as — 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 separate ideal-membership checks. Batching collapses them into one.
The verifier samples . The prover sends a polynomial , claimed to be the multilinear-extension evaluation of the per-row constraint values at :
Both sides live in — is a polynomial in for each fixed , and the sum is taken in with as scalar coefficients. The verifier (a) checks — one polynomial division, since is a principal ideal domain and is monic — and (b) replaces the original constraints with the single strict polynomial equality
The soundness primitive is a Schwartz–Zippel for ideal membership:
Lemma 2.10 (informal). Let be a field, a polynomial of degree , and with . If some entry , then for any finite .
The proof projects onto the quotient — which is a -dimensional -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 misses zero with overwhelming probability.
Operationally: one ideal-membership check on a single batched polynomial replaces separate ideal-membership checks. The standard sumcheck trick of “test instead of ” becomes “test instead of .”
Step 3 — Evaluation projection
We have a strict polynomial equality over . To hand it to a finite-field PIOP, drop the . The verifier samples and evaluates both sides at via , replacing with
If was a non-zero polynomial in of degree (where bounds the per-coefficient -degree and is ‘s total degree in its algebraic variables), evaluating at random catches it with probability . For , that’s negligible. Standard PIT.
What the inner PIOP sees
After three steps, the constraint is a plain equation in . A standard finite-field PIOP — Spartan, HyperPlonk, anything sumcheck-shaped that handles your constraint type — runs on top, with:
- Public input: .
- Witness oracles: the same prover oracle as before, but exposing projected evaluations — a query at returns .
The “projected oracle” interface is what makes the inner PIOP oblivious to UCS. From its perspective, is just an -multilinear-polynomial oracle. The PCS — Zip+ in Part 2 — is what actually delivers this interface from a commitment to .
One subtlety. When , is only defined on , so it may be undefined on entries of whose denominator goes bad mod . The oracle’s contract is: return the projected value when defined, return otherwise. The verifier rejects on . 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:
Top row: the ring the constraint lives in. Bottom row (implicit): the constraint shape — ideal membership, ideal membership (batched), strict equality, equation.
The Zinc+ add-on: -only and bolt-on
The compiler simplifies dramatically when there are no constraints — i.e., all UCS constraints are over for a single fixed . This is the regime the paper calls the Zinc+ add-on.
What drops out:
- Step 1 collapses to (if is small) or the identity (if is already bits). No prime sampling, no machinery, no well-definedness branch.
- Steps 2 and 3 stay exactly as above.
- The PCS layer doesn’t need Zip+ or any -IOPP — your existing PCS, wrapped with an interleaved commitment (commit to each coefficient-layer of as separate -multilinear polynomials), is enough. Part 2 covers the interleaving mechanics.
What you get: any existing hash-based SNARK gains the ability to prove ideal-membership constraints over — bitwise operations, rotations, modular arithmetic over — 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 a prime of bits, a SHA-256 compression can be arithmetized with a witness trace over using only linear constraints plus lookup constraints. The commitment cost amounts to committing to a vector of size over (e.g., for SHA-256-shaped traces); the rest of the PIOP operates on the much smaller trace.
The engineering takeaway: a UCS arithmetization for, say, SHA-256 → existing 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 and/or , with constraints of the form 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 .
- Zinc+ PIOR. Three reduction steps — ring projection ( or ), ideal batching (Lemma 2.10), evaluation projection (). Reduces UCS satisfiability to a standard equation.
- Inner PIOP. Any finite-field PIOP plugs in via projected oracles.
- Zinc+ add-on. -only case: drop ring projection, reuse your 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 .
Why we’re not done yet
The PIOR’s inner PIOP queries the prover’s witness through a projected oracle : given a commit to , a verifier-sampled prime , and a random , the oracle has to answer evaluation queries for arbitrary . 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 , your existing PCS handles all of this. For , 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, FFT-based encoding, and bounded norm growth on encoded codewords. None of those three properties were available simultaneously over before.
Part 2 will cover:
- Zip+‘s IOPP design for -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.