use crate::{
errors::SpartanError,
r1cs::{R1CSInstance, R1CSWitness},
traits::{Engine, Group, TranscriptReprTrait},
};
use bellpepper_core::Circuit;
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>;
fn setup<C: Circuit<E::Scalar>>(
circuit: C,
) -> Result<(Self::ProverKey, Self::VerifierKey), SpartanError>;
fn gen_witness<C: Circuit<E::Scalar>>(
pk: &Self::ProverKey,
circuit: C,
is_small: bool, ) -> Result<(R1CSInstance<E>, R1CSWitness<E>), SpartanError>;
fn prove(
pk: &Self::ProverKey,
U: &R1CSInstance<E>,
W: &R1CSWitness<E>,
) -> Result<Self, 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()
}
}