use crate::{
errors::VegaError,
traits::{Engine, Group, TranscriptReprTrait, circuit::VegaCircuit},
};
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: VegaCircuit<E>>(
circuit: C,
) -> Result<(Self::ProverKey, Self::VerifierKey), VegaError>;
fn prep_prove<C: VegaCircuit<E>>(
pk: &Self::ProverKey,
circuit: C,
is_small: bool, ) -> Result<Self::PrepSNARK, VegaError>;
fn prove<C: VegaCircuit<E>>(
pk: &Self::ProverKey,
circuit: C,
prep_snark: Self::PrepSNARK,
is_small: bool, ) -> Result<(Self, Self::PrepSNARK), VegaError>;
fn verify(&self, vk: &Self::VerifierKey) -> Result<Vec<E::Scalar>, VegaError>;
}
pub type VegaDigest = [u8; 32];
pub trait DigestHelperTrait<E: Engine> {
fn digest(&self) -> Result<VegaDigest, VegaError>;
}
impl<G: Group> TranscriptReprTrait<G> for VegaDigest {
fn to_transcript_bytes(&self) -> Vec<u8> {
self.to_vec()
}
}