Ring Proofs & KZG Commitments
Understanding the cryptographic mechanisms behind Ring VRF's anonymous membership proofs.
What is a Ring Signature?
A ring signature proves that a message was signed by one member of a group (ring) without revealing which member:
Ring = {PK₁, PK₂, PK₃, ..., PKₙ}
Sign(sk_i, message, Ring) → signature
Verify(signature, message, Ring) → bool
The verifier learns:
- ✅ The signer is one of the ring members
- ❌ Which specific member signed (anonymous)
Ring VRF
Ring VRF combines:
- Pedersen VRF - Verifiable random output with blinded key
- Ring Signature - Proves membership in a set
This enables anonymous verifiable randomness within a group.
KZG Commitments
What is KZG?
KZG (Kate-Zaverucha-Goldberg) is a polynomial commitment scheme using elliptic curve pairings.
Given a polynomial , KZG produces:
- A commitment (single group element)
- An opening proof that for any point
How It Works
Setup (Trusted)
Generate powers of a secret :
The secret is destroyed after setup (trusted setup ceremony).
Commit
For polynomial :
Open
To prove :
- Compute quotient:
- Opening proof:
Verify
Using pairings :
Ring Membership as a Polynomial
Key Insight
The ring can be encoded as polynomial evaluations:
Using Lagrange interpolation, there exists a unique polynomial such that:
Where is an -th root of unity.
Proving Membership
The ring proof proves knowledge of secret index and blinding factor such that:
Where:
- is the blinded public key from the Pedersen proof ()
- is the prover's public key at index in the ring
- is the blinding factor
- is the blinding base point
The proof uses:
- Bits polynomial - Encodes the secret index and blinding in binary
- Conditional accumulator - Computes using elliptic curve additions
- Inner product - Ensures exactly one ring key is selected
Plonk Protocol
DotRing uses Plonk (Permutations over Lagrange-bases for Oecumenical Noninteractive arguments of Knowledge) for constraint verification.
Constraint System
The ring membership is expressed as arithmetic constraints:
pk_x = P_x(ω^k) // x-coordinate matches
pk_y = P_y(ω^k) // y-coordinate matches
pk = sk · G // Valid key pair
Prover
Generates:
- Column commitments (, , )
- Quotient polynomial commitment ()
- Evaluation proofs at challenge point
- Opening proofs (, )
Verifier
Checks:
- Commitment openings are correct
- Constraint equations hold at
- Pairing equations verify
Ring Root Structure
The Ring Root in DotRing consists of three KZG commitments (from the Ring Proof Specification):
class RingRoot:
px: Column # Commitment to x-coordinates of ring keys + blinding bases
py: Column # Commitment to y-coordinates of ring keys + blinding bases
s: Column # Commitment to selector polynomial (1 for ring keys, 0 elsewhere)
Total size: 144 bytes (3 × 48-byte BLS12-381 G1 points)
Proof Structure
A Ring VRF proof contains (based on the specifications):
| Component | Size | Purpose |
|---|---|---|
| Pedersen Proof | 192 bytes | VRF output with blinded key (O, Y_bar, R, O_k, s, s_b) |
| Witness Commitments | 192 bytes | C_b, C_acc_ip, C_acc_x, C_acc_y |
| Zeta Evaluations | 224 bytes | p_x_zeta, p_y_zeta, s_zeta, b_zeta, acc_ip_zeta, acc_x_zeta, acc_y_zeta |
| Quotient Commitment | 48 bytes | C_q |
| Linearization Eval | 32 bytes | l_zeta_omega |
| Opening Proofs | 96 bytes | Pi_zeta, Pi_zeta_omega |
| Total | ~784 bytes | Constant regardless of ring size |
Security
Soundness
An adversary cannot create a valid proof without:
- Knowing a secret key
- Having in the ring
Zero-Knowledge
The proof reveals nothing about:
- Which ring member signed
- The secret key value
- The index in the ring
Assumptions
- Discrete Log - Hard to find from
- q-SDH - Security of KZG commitments
- Random Oracle - Fiat-Shamir transform
BLS12-381 Pairing Curve
Ring VRF uses BLS12-381 for KZG because it supports efficient pairings:
Groups
- : 48-byte points (commitments)
- : 96-byte points (verification key)
- : Target group (pairing result)
Pairing
Properties:
- Bilinear:
- Non-degenerate:
Why Bandersnatch?
The Bandersnatch curve is embedded in BLS12-381's scalar field, enabling efficient:
- VRF operations on Bandersnatch
- Ring proofs using BLS12-381 pairings
Trusted Setup
KZG requires a trusted setup (powers of tau):
SRS = (G, τG, τ²G, ..., τⁿG, H, τH)
DotRing uses the Zcash Powers of Tau ceremony, which had thousands of participants. The setup is secure if at least one participant was honest.
Further Reading
- Kate, Zaverucha, Goldberg (2010) - "Constant-Size Commitments to Polynomials"
- Gabizon, Williamson, Ciobotaru (2019) - "PLONK: Permutations over Lagrange-bases"
- Ring Proof Specification
- BCGSV23 - Ring VRF paper