All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
RingContext::new_without_blinding(ring_size): runtime replacement for the removedtest-vectorsfeature. Provers built from such a context generate deterministic (non zero-knowledge) proofs, still valid for verifiers using a regular context for the same ring size.
- arkworks dependencies bumped to 0.6.
- Bump
w3f-ring-proofdependency to 0.0.9.
test-vectorsfeature. Cargo features are additive: any crate in the dependency graph could enable it, silently disabling ring proof blinding for every other user of the same build.
-
The group identity is now rejected as a public key: its secret scalar is zero and publicly known, so anyone can forge proofs verifying against it.
Public::from_affine, checked deserialization, and the thin and tiny verifiers (including batch verification) returnError::InvalidDatafor identity keys. -
The group identity is now rejected as a VRF input or output point. The pair
(0, 0)satisfiesO = x * Ifor every secret key, so it binds its VRF output to no signer.Input::from_affine,Output::from_affine, checked deserialization of both, and all four verifiers (including batch verification) returnError::InvalidDatafor such a pair. -
The group identity is now rejected as a Pedersen key commitment. Its opening is the public
(0, 0), so anyone can build a proof that satisfies the commitment equation without a secret.The identity remains accepted for the nonce commitments
RandOk, which commit to nothing and are not part of the extraction argument.Okis necessarily the identity when no I/O pair is supplied. This matches the Bandersnatch VRF specification, section 3.2, 3.3, 4.2 and 4.4 step 1.
PcsVerifierParamstype alias for the PCS parameters required by the verifier: a few points, independent of ring size, extractable viaRingSetup::pcs_verifier_params()orVerifierKeyBuilder::pcs_verifier_params().ring::verifier_key_from_commitment(commitment, pcs_params)free function to reconstruct aRingVerifierKeyfrom a ring commitment without access to the full SRS.
0.5.0 - 2026-04-27
RingContextstruct for lightweight ring proof parameter caching. Contains only the PIOP parameters needed for prover/verifier instance construction, without the KZG SRS required for key construction.- Multi-ring batch verification: a single
ring::BatchVerifiercan now aggregate proofs from multiple rings sharing the same KZG SRS into one batched pairing check. ring::BatchItem::new(verifier, ios, ad, proof)andpedersen::BatchItem::new(ios, ad, proof)constructors for preparing batch items independently of any verifier instance.
- Bump
w3f-ring-proofdependency to 0.0.8. RingProofParamsrenamed toRingSetup.Suite::SUITE_IDis now a self-describing byte string (e.g.b"Bandersnatch-SHA512-ELL2-v1") used directly as the transcript seed and hash-to-curve DST prefix, replacing the structured 4-byteSuiteId { version, curve, hash, h2c }.Transcript::newnow takes&[u8]. Breaking change for customSuiteimplementations.- Hash-to-curve DST unified to
SUITE_ID || DomSep::HashToCurvefor both Try-And-Increment and Elligator2 paths, replacing the prior"ECVRF_" || h2c_suite_id || suite_bytesform.hash_to_curve_ell2_xmdandhash_to_curve_ell2_xofno longer take a separateh2c_suite_idargument.DomSep::HashToCurveTaiis renamed toHashToCurveand shared across both paths;ThinBatch/PedersenBatchcollapse into a singleBatchVerify. DigestXofcounter widened fromu32tou64.- Per-suite
BLINDING_BASE,ACCUMULATOR_BASE,PADDINGpoints and all test vectors regenerated under the new DSTs; previous values do not verify.
RingProofParams::verifier_no_contextmethod, superseded byRingContext::new.ring::BatchVerifier::prepareandpedersen::BatchVerifier::prepare, superseded byBatchItem::newconstructors.SuiteIdstruct and thecurve/hash/h2cconstant modules undersuites, superseded by the byte-stringSUITE_ID.
0.4.0 - 2026-04-02
This release follows draft-33 of the Bandersnatch VRF specification.
- Renamed IETF VRF to Tiny VRF. The scheme now uses a single nonce commitment
R = k * I_mon the delinearized merged input rather than separate commitments for the generator and each VRF input. - Thin VRF is now described as a variant of Tiny VRF that stores the nonce
commitment
Rinstead of the challengec, enabling batch verification at the cost of a slightly larger proof. - Updated all test vectors to reflect the new Tiny VRF proof structure.
Blake3Transcriptand theblake3feature/dependency.bandersnatch_blake3suite (including its test vectors).
0.3.0 - 2026-03-28
This release follows draft-32 of the Bandersnatch VRF specification.
- Pluggable
Transcripttrait for Fiat-Shamir transform, replacing the previous hard-coded hash constructions. Provided implementations:HashTranscript(SHA-512, SHA-256 via counter-mode XOF),Blake3Transcript,Shake128Transcript. Suite::Transcriptassociated type. Nonce generation, challenge derivation, and other hash-based operations now go through the transcript abstraction.- Thin VRF scheme. Merges the Schnorr public-key and VRF I/O DLEQ into a single delinearized relation with a Schnorr-like proof (R, s). Supports batch verification via randomized multi-scalar multiplication.
- Multi-input IETF VRF using delinearized DLEQ. Proves multiple input-output
pairs with a single proof via
delinearizefolding. N=1 is byte-identical to single-pair proving. N=0 reduces to a Schnorr signature over additional data. - Straus multi-scalar multiplication (
utils::straus::short_msm) for small point counts (n=2..5), with configurable window size. Used in IETF, Pedersen, and Thin VRF verification to replace independent scalar multiplications.
- Challenge serialization now validates that the value fits in
CHALLENGE_LEN, rejecting proofs with oversized challenge values.
Suitetrait now requires aTranscriptassociated type andnonce/challengemethods use the transcript rather than raw hash functions. This is a breaking change for customSuiteimplementations.- Removed
CHALLENGE_LENfrom theSuitetrait; it is now a module-level constant (utils::common::CHALLENGE_LEN) fixed at 16 bytes (128-bit security). - Challenge and blinding factor decoding now use suite codec (
scalar_decode) instead offrom_be_bytes_mod_order, so endianness follows the suite configuration.
0.2.2 - 2026-03-17
- Nonce derivation now binds additional data (
ad), preventing secret key recovery from two proofs over the same input with differentad. In the IETF schemeadis included directly; in the Pedersen scheme the two secrets are cross-bound:knonce includesblinding || ad,kbnonce includessecret || ad.
0.2.1 - 2026-02-19
- Bump
w3f-ring-proofdependency to 0.0.6.
RingProofParams::clone_verifier_keyworkaround, no longer needed as upstreamRingVerifierKeynow implementsClone.
0.2.0 - 2026-02-18
- Ring proof batch verification using random linear combination.
- Pedersen proof batch verification with 5N+2 point MSM.
- Domain size conversion utilities for ring proof parameters.
- Constant encoded lengths in codec for all proof and signature types.
- Comprehensive benchmarks for all VRF schemes (IETF, Pedersen, Ring).
Input::from(Affine)renamed toInput::from_affine(Affine).- Secret scalar field is now private.
- RFC-6979 nonce generation.
0.1.1 - 2025-12-12
secret-splitfeature: scalar multiplication with secret split for side-channel defense. Secret scalar is split into the sum of two randomly mutating scalars.- Ring verifier key builder for incremental ring construction.
- Optional cofactor clearing for RFC-9381
hash_to_curve. - Unlocked
sha2assembly feature.
- Bump Rust edition to 2024.
- Improved secret scalar generation.
- Simplified ring proof trait bounds using associated type bounds.
0.1.0 - 2025-03-28
- IETF VRF compliant with RFC-9381 (ECVRF).
- Pedersen VRF with key-hiding properties.
- Ring VRF with signer anonymity using zk-SNARK membership proofs.
- Built-in suites: Ed25519, Secp256r1, Bandersnatch, JubJub, Baby-JubJub.
- Elligator 2 and Try-and-Increment hash-to-curve strategies.
- RFC-6979 deterministic nonce generation (optional).
- Codec trait for customizable serialization formats.
- Test vectors for all suites and schemes.
no_stdsupport.parallelandasmoptimization features.