mod commit; mod errors; mod param; mod util; use ark_ec::PairingEngine; use ark_poly::MultilinearExtension; use ark_std::rand::RngCore; use poly_iop::IOPTranscript; use std::marker::PhantomData; pub use errors::PCSErrors; pub use param::{ProverParam, UniversalParams, VerifierParam}; /// KZG Polynomial Commitment Scheme on multilinear extensions. pub struct KZGMultilinearPC { #[doc(hidden)] phantom: PhantomData, } pub trait MultilinearCommitmentScheme { type ProverParam; type VerifierParam; type SRS; type Commitment; type Proof; type BatchProof; type Transcript; /// Generate SRS from RNG. /// WARNING: THIS FUNCTION IS FOR TESTING PURPOSE ONLY. /// THE OUTPUT SRS SHOULD NOT BE USED IN PRODUCTION. fn setup(rng: &mut R, num_vars: usize) -> Result; /// Generate a commitment for a polynomial fn commit( prover_param: &Self::ProverParam, poly: &impl MultilinearExtension, ) -> Result; /// Generate a commitment for a list of polynomials fn multi_commit( prover_param: &Self::ProverParam, polys: &[impl MultilinearExtension], ) -> Result; /// On input a polynomial `p` and a point `point`, outputs a proof for the /// same. fn open( prover_param: &Self::ProverParam, polynomial: &impl MultilinearExtension, point: &[E::Fr], ) -> Result; /// Input a list of MLEs, and a same number of points, and a transcript, /// compute a multi-opening for all the polynomials. #[allow(clippy::type_complexity)] // TODO: remove after we KZG-commit q(x) fn multi_open( prover_param: &Self::ProverParam, polynomials: &[impl MultilinearExtension], point: &[&[E::Fr]], transcript: &mut Self::Transcript, ) -> Result; /// Verifies that `value` is the evaluation at `x` of the polynomial /// committed inside `comm`. fn verify( verifier_param: &Self::VerifierParam, commitment: &Self::Commitment, point: &[E::Fr], value: &E::Fr, proof: &Self::Proof, ) -> Result; /// Verifies that `value_i` is the evaluation at `x_i` of the polynomial /// `poly_i` committed inside `comm`. fn batch_verify( verifier_param: &Self::VerifierParam, multi_commitment: &Self::Commitment, points: &[&[E::Fr]], batch_proof: &Self::BatchProof, transcript: &mut IOPTranscript, ) -> Result; }