use crate::{
errors::NovaError,
traits::{commitment::CommitmentEngineTrait, Engine},
};
use serde::{Deserialize, Serialize};
pub trait EvaluationEngineTrait<E: Engine>: Clone + Send + Sync {
type ProverKey: Clone + Send + Sync + Serialize + for<'de> Deserialize<'de>;
type VerifierKey: Clone + Send + Sync + Serialize + for<'de> Deserialize<'de>;
type EvaluationArgument: Clone + Send + Sync + Serialize + for<'de> Deserialize<'de>;
fn setup(
ck: &<<E as Engine>::CE as CommitmentEngineTrait<E>>::CommitmentKey,
) -> Result<(Self::ProverKey, Self::VerifierKey), NovaError>;
fn prove(
ck: &<<E as Engine>::CE as CommitmentEngineTrait<E>>::CommitmentKey,
pk: &Self::ProverKey,
transcript: &mut E::TE,
comm: &<<E as Engine>::CE as CommitmentEngineTrait<E>>::Commitment,
poly: &[E::Scalar],
point: &[E::Scalar],
eval: &E::Scalar,
) -> Result<Self::EvaluationArgument, NovaError>;
fn verify(
vk: &Self::VerifierKey,
transcript: &mut E::TE,
comm: &<<E as Engine>::CE as CommitmentEngineTrait<E>>::Commitment,
point: &[E::Scalar],
eval: &E::Scalar,
arg: &Self::EvaluationArgument,
) -> Result<(), NovaError>;
}