use crate::{
errors::SpartanError,
traits::{Engine, Group, TranscriptReprTrait, circuit::SpartanCircuit},
};
use serde::{Deserialize, Serialize};
pub trait R1CSSNARKTrait<E: Engine>:
Sized + Send + Sync + Serialize + for<'de> Deserialize<'de>
{
type ProverKey: Send + Sync + Serialize + for<'de> Deserialize<'de>;
type VerifierKey: Send + Sync + Serialize + for<'de> Deserialize<'de>;
type PrepSNARK: Clone + Send + Sync + Serialize + for<'de> Deserialize<'de>;
fn setup<C: SpartanCircuit<E>>(
circuit: C,
) -> Result<(Self::ProverKey, Self::VerifierKey), SpartanError>;
fn prep_prove<C: SpartanCircuit<E>>(
pk: &Self::ProverKey,
circuit: C,
is_small: bool, ) -> Result<Self::PrepSNARK, SpartanError>;
fn prove<C: SpartanCircuit<E>>(
pk: &Self::ProverKey,
circuit: C,
prep_snark: Self::PrepSNARK,
is_small: bool, ) -> Result<(Self, Self::PrepSNARK), SpartanError>;
fn verify(&self, vk: &Self::VerifierKey) -> Result<Vec<E::Scalar>, SpartanError>;
}
pub type SpartanDigest = [u8; 32];
pub trait DigestHelperTrait<E: Engine> {
fn digest(&self) -> Result<SpartanDigest, SpartanError>;
}
impl<G: Group> TranscriptReprTrait<G> for SpartanDigest {
fn to_transcript_bytes(&self) -> Vec<u8> {
self.to_vec()
}
}