use core::ops::{Add, Mul};
use std::{fmt::Debug, hash::Hash};
use ff::{FromUniformBytes, PrimeField};
use crate::{
plonk::{k_from_circuit, Circuit},
poly::{Coeff, Error, LagrangeCoeff, Polynomial, ProverQuery, VerifierQuery},
transcript::{Hashable, Sampleable, Transcript},
utils::helpers::ProcessedSerdeObject,
};
pub trait PolynomialCommitmentScheme<F: PrimeField>: Clone + Debug {
type Parameters: Params;
type VerifierParameters;
type Commitment: Clone
+ Debug
+ Default
+ PartialEq
+ ProcessedSerdeObject
+ Send
+ Sync
+ Add<Output = Self::Commitment>
+ Mul<F, Output = Self::Commitment>;
type VerificationGuard: Guard<F, Self>;
fn gen_params(k: u32) -> Self::Parameters;
fn get_verifier_params(params: &Self::Parameters) -> Self::VerifierParameters;
fn commit(params: &Self::Parameters, polynomial: &Polynomial<F, Coeff>) -> Self::Commitment;
fn commit_lagrange(
params: &Self::Parameters,
poly: &Polynomial<F, LagrangeCoeff>,
) -> Self::Commitment;
fn multi_open<T: Transcript>(
params: &Self::Parameters,
prover_query: &[ProverQuery<F>],
transcript: &mut T,
) -> Result<(), Error>
where
F: Sampleable<T::Hash> + Hash + Ord + Hashable<T::Hash>,
Self::Commitment: Hashable<T::Hash>;
fn multi_prepare<'com, T: Transcript>(
verifier_query: &[VerifierQuery<'com, F, Self>],
transcript: &mut T,
) -> Result<Self::VerificationGuard, Error>
where
F: Sampleable<T::Hash> + Hash + Ord + Hashable<T::Hash>,
Self::Commitment: 'com + Hashable<T::Hash>;
}
pub trait Guard<F: PrimeField, CS: PolynomialCommitmentScheme<F>>: Sized {
fn verify(self, params: &CS::VerifierParameters) -> Result<(), Error>;
fn batch_verify<'a, I, J>(guards: I, params: J) -> Result<(), Error>
where
I: ExactSizeIterator<Item = Self>,
J: ExactSizeIterator<Item = &'a CS::VerifierParameters>,
CS::VerifierParameters: 'a,
{
assert_eq!(guards.len(), params.len());
guards
.into_iter()
.zip(params)
.try_for_each(|(guard, params)| guard.verify(params))
}
}
pub trait Params {
fn max_k(&self) -> u32;
fn downsize(&mut self, new_k: u32);
fn downsize_from_circuit<
F: PrimeField + Ord + FromUniformBytes<64>,
ConcreCircuit: Circuit<F>,
>(
&mut self,
circuit: &ConcreCircuit,
) {
let k = k_from_circuit(circuit);
self.downsize(k);
}
}