use crate::{
errors::NovaError,
r1cs::{R1CSShape, RelaxedR1CSInstance, RelaxedR1CSWitness},
traits::Engine,
CommitmentKey,
};
use serde::{Deserialize, Serialize};
pub fn default_ck_hint<E: Engine>() -> Box<dyn for<'a> Fn(&'a R1CSShape<E>) -> usize> {
Box::new(|_shape: &R1CSShape<E>| 0)
}
pub trait RelaxedR1CSSNARKTrait<E: Engine>:
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> + DigestHelperTrait<E>;
fn ck_floor() -> Box<dyn for<'a> Fn(&'a R1CSShape<E>) -> usize> {
default_ck_hint()
}
fn setup(
ck: &CommitmentKey<E>,
S: &R1CSShape<E>,
) -> Result<(Self::ProverKey, Self::VerifierKey), NovaError>;
fn prove(
ck: &CommitmentKey<E>,
pk: &Self::ProverKey,
S: &R1CSShape<E>,
U: &RelaxedR1CSInstance<E>,
W: &RelaxedR1CSWitness<E>,
) -> Result<Self, NovaError>;
fn verify(&self, vk: &Self::VerifierKey, U: &RelaxedR1CSInstance<E>) -> Result<(), NovaError>;
}
pub trait DigestHelperTrait<E: Engine> {
fn digest(&self) -> E::Scalar;
}