Technical Notes · Zero Knowledge

KZG Commitments

How a structured reference string turns "prove you know a polynomial" into a single group element, and how a pairing equation lets a verifier check an opening in constant time.

Srishti Rathi · Technical Notes · April 2026

The problem a commitment solves

Say I have a polynomial and want to convince you of two things later: that I fixed it in advance and haven't changed it since, and that it evaluates to some specific value at some specific point — all without ever sending you the whole polynomial. A polynomial commitment scheme is exactly this: a short, binding commitment now, and a small proof for each evaluation claim later.

polynomial commitment (one group element) evaluation claim opening proof pairing check

KZG — named for Kate, Zaverucha, and Goldberg — is one of the most widely used schemes for doing this. It's the commitment scheme behind Groth16, PLONK-style SNARKs, and Ethereum's proto-danksharding blob commitments.

The structured reference string

KZG needs a shared setup before anyone commits to anything: a structured reference string (SRS) — a sequence of powers of some secret value, each one multiplied into a group generator. Conceptually, that's g, g^s, g^s², g^s³, … up to whatever the maximum polynomial degree requires.

The secret value s — sometimes called toxic waste — must never be known to anyone once the setup finishes. If it leaks, someone can forge false commitments and openings. That's why KZG setups are usually run as multi-party ceremonies: many participants each contribute randomness, and the setup stays secure as long as even one of them destroyed their share honestly. No single party ever needs to be fully trusted on their own.

1 group element per commitment
1 group element per opening proof
O(1) pairing checks to verify

Committing and opening

Committing to a polynomial means evaluating it "in the exponent" using the SRS — combining the SRS elements with the polynomial's coefficients to produce a single group element. That one element is binding: given the SRS, it's computationally infeasible to find a different polynomial that produces the same commitment.

To later prove the polynomial evaluates to some value at some point, the prover leans on a basic fact about polynomials: if a polynomial takes a given value at a given point, subtracting that value leaves a polynomial with a root there — which means it divides evenly by a simple linear factor. The prover computes that quotient polynomial and commits to it. That commitment to the quotient is the opening proof — again, a single group element.

p(x) − y divisible by (x − z) quotient q(x) commit to q(x) opening proof

Why a pairing makes this checkable

The verifier can't just divide two group elements the way you'd divide numbers, so KZG relies on a bilinear pairing — a function that takes two group elements and maps them into a third group while respecting exponents, in a way that lets multiplicative relationships be checked "in the exponent."

Using a pairing, the verifier checks a single equation involving the commitment, the opening proof, the claimed evaluation point, and the claimed value. If that equation holds, the verifier is convinced the committed polynomial really does evaluate to the claimed value at the claimed point — without ever seeing the polynomial itself. This is what makes KZG openings succinct: constant-size proofs and constant-time verification, regardless of the polynomial's degree.

BLS12-381, briefly

KZG needs a pairing-friendly elliptic curve to work over, and BLS12-381 is the one most commonly paired with it in practice — used across Ethereum's consensus layer and blob commitments, and in most PLONK-style proving systems. Its main properties are an efficient pairing operation and roughly 128 bits of security, which together make constant-size, fast-to-verify proofs practical.

The trade-off, stated plainly

Property KZG
Commitment size One group element, regardless of polynomial degree
Opening proof size One group element per evaluation
Verification A constant number of pairing checks
Setup Requires a structured reference string from a trusted (or multi-party) setup
Security assumption Relies on elliptic-curve pairing hardness — not post-quantum
This is the same trade-off that shows up whenever KZG is set against a hash-based, transparent scheme like FRI: smaller, faster-to-verify proofs in exchange for a setup that has to be trusted, and a security assumption a quantum computer would eventually break.

Takeaway

KZG compresses "trust me, I know this polynomial and it evaluates to this" into a single group element and a single pairing check. The structured reference string is what makes that compression possible — and also what makes the setup ceremony the one part of the scheme that has to be trusted.

Everything downstream — small commitments, small proofs, fast verification — falls out of treating polynomial division as a fact a pairing equation can check without ever reconstructing the polynomial.