use crate::{
errors::SpartanError,
traits::{Engine, TranscriptReprTrait},
};
use core::fmt::Debug;
use num_integer::Integer;
use num_traits::ToPrimitive;
use rayon::prelude::*;
use serde::{Deserialize, Serialize};
pub trait CommitmentTrait<E: Engine>:
Clone
+ Debug
+ PartialEq
+ Eq
+ Send
+ Sync
+ TranscriptReprTrait<E::GE>
+ Serialize
+ for<'de> Deserialize<'de>
{
}
pub trait Len {
fn length(&self) -> usize;
}
pub trait PCSEngineTrait<E: Engine>: Clone + Send + Sync {
type CommitmentKey: Clone + Debug + Len + Send + Sync + Serialize + for<'de> Deserialize<'de>;
type VerifierKey: Clone + Send + Sync + Serialize + for<'de> Deserialize<'de>;
type Commitment: CommitmentTrait<E>;
type Blind: Clone + Debug + Send + Sync + PartialEq + Eq + Serialize + for<'de> Deserialize<'de>;
type EvaluationArgument: Clone + Debug + Send + Sync + Serialize + for<'de> Deserialize<'de>;
fn setup(label: &'static [u8], n: usize) -> (Self::CommitmentKey, Self::VerifierKey);
fn blind(ck: &Self::CommitmentKey) -> Self::Blind;
fn commit(
ck: &Self::CommitmentKey,
v: &[E::Scalar],
r: &Self::Blind,
) -> Result<Self::Commitment, SpartanError>;
fn batch_commit(
ck: &Self::CommitmentKey,
v: &[Vec<E::Scalar>],
r: &[Self::Blind],
) -> Result<Vec<Self::Commitment>, SpartanError> {
if v.len() != r.len() {
return Err(SpartanError::InvalidInputLength);
}
v.par_iter()
.zip(r.par_iter())
.map(|(v_i, r_i)| Self::commit(ck, v_i, r_i))
.collect()
}
fn commit_small<T: Integer + Into<u64> + Copy + Sync + ToPrimitive>(
ck: &Self::CommitmentKey,
v: &[T],
r: &Self::Blind,
) -> Result<Self::Commitment, SpartanError>;
fn batch_commit_small<T: Integer + Into<u64> + Copy + Sync + ToPrimitive>(
ck: &Self::CommitmentKey,
v: &[Vec<T>],
r: &[Self::Blind],
) -> Result<Vec<Self::Commitment>, SpartanError> {
if v.len() != r.len() {
return Err(SpartanError::InvalidInputLength);
}
v.par_iter()
.zip(r.par_iter())
.map(|(v_i, r_i)| Self::commit_small(ck, v_i, r_i))
.collect()
}
fn prove(
ck: &Self::CommitmentKey,
transcript: &mut E::TE,
comm: &Self::Commitment,
poly: &[E::Scalar],
blind: &Self::Blind,
point: &[E::Scalar],
) -> Result<(E::Scalar, Self::EvaluationArgument), SpartanError>;
fn verify(
vk: &Self::VerifierKey,
transcript: &mut E::TE,
comm: &Self::Commitment,
point: &[E::Scalar],
eval: &E::Scalar,
arg: &Self::EvaluationArgument,
) -> Result<(), SpartanError>;
}