zippel — what it is, what it gives zheng
eniac/zippel (UPenn, S&P 2027, MIT, nightly Rust, ~82 K lines, active) is a choreographic language for proof systems: one .zippel file describes prover and verifier together, the way a paper's pseudocode does. The compiler lowers it to a DAG (Graph IR), projects the DAG into a prover subgraph and a verifier subgraph by visibility (what the verifier can reach from instance values, challenges and prover messages), derives the Fiat–Shamir transcript from the projection (every <- message is absorbed, every challenge squeezed, instance bound into the domain separator — weak Fiat–Shamir is impossible by construction), and runs the two subgraphs on a work-stealing scheduler over arkworks. Independently it runs two static analyses on the unprojected graph: completeness and $(\ell_1,\dots,\ell_\mu)$-special soundness, by encoding node semantics as polynomial ideals and checking ideal membership with Gröbner bases, bounded to concrete sizes. 35 protocols ship as examples (Schnorr … KZG, Bulletproofs, Hyrax, Spartan, HyperPlonk, Groth16, Dory, sumcheck, zerocheck); two thirds were written by AI agents with the type system and the analyses as the oracle.
what it does not do
- no hash-based proof systems, no codes, no lattices, no GPU: the backends are curves and pairings (BLS12-381, BN254, curve25519, secp256k1). Brakedown, WHIR, Merkle paths and hemera are outside it.
- no Goldilocks field: arkworks can host a 64-bit prime (
MontBackend, one limb), and zippel'snothing/backend already serves the analysis path without a group — so an analysis-only Goldilocks configuration is a small addition, not a port. - the analyses prove completeness and special soundness only — no knowledge soundness beyond that, no zero-knowledge analysis; they can time out, which says nothing; sizes are bounded (the paper's 94 % pass in under a minute at small sizes).
- recursion is primitive recursion by size overloading (Spartan's sumcheck is written that way); no control flow.
- research prototype, unaudited, never a runtime dependency of anything of value.
what zheng takes from it
- The transcript is derived, not maintained. zheng's transcript page writes the absorb/squeeze order and the domain separators by hand, and the code follows it by hand. That is the exact class of bug zippel removes by construction. Lesson: the protocol description is the source, the absorb/squeeze order is generated from it, the spec page documents the generated order.
- An oracle for agent-written cryptography. Our protocols are written and rewritten by agents. zippel's completeness and special-soundness checks are the first fully automated ground truth for "does this IOP prove what it says" — the missing gate between a passing test and a sound protocol.
- Visibility types.
witness/instance/extra, checked at compile time, so a verifier cannot read a prover-only value. zheng's API separates prover and verifier by convention.
how it embeds — as a checker, never as a runtime
zheng/specs/proto/*.zippel: executable specs beside the markdown — today Spartan whole and with a fixed CCS, its outer and inner sumcheck alone (superspartan), and a deliberately broken variant; the accumulation step is a candidate for a later file. The PCS is an oracle in these files (aninstanceevaluation), which is how IOPs are analysed anyway; the lens's own soundness stays with the lens.- proposed, not built: a CI job on zippel's pinned nightly toolchain, separate from the stable workspace —
cargo zcheckon every file, then completeness and special soundness at small sizes — as a release-train gate for zheng. - proposed: a Goldilocks analysis backend contributed upstream, so sized-type checks (degree against field size) run in our field.
- diff the derived transcript against transcript: every disagreement is either a spec bug or a doc bug.
Not: replacing zheng's prover or verifier with zippel's runtime (arkworks, big fields, CPU only, no hash-based commitments), and not a dependency in any soft3 crate.
first experiment — done 2026-10-24
The IOP of rs/src/spartan + rs/src/sumcheck is in specs/proto/ as five zippel protocols; results in audit/zippel-2026-10-24. The whole IOP (CCS fixed, lens as oracle) is complete by the Gröbner analysis in 43 ms; the outer and inner sumchecks alone pass up to three and four variables; a deliberate bug (a degree-3 round polynomial sent as three points) type-checks and runs but fails completeness in 4.5 s; the derived transcript order matches transcript.rs. Special soundness does not apply in the oracle model (no witness, nothing to extract), so a soundness verdict needs the commitment inside the protocol, which the hash-based lens cannot give zippel today. The gate to keep: zippel-check + completeness at those sizes + the bug variant failing.