use crate::{
errors::NovaError,
frontend::{num::AllocatedNum, AllocatedBit, ConstraintSystem, SynthesisError},
};
use core::fmt::Debug;
use ff::{PrimeField, PrimeFieldBits};
use num_bigint::BigInt;
use serde::{Deserialize, Serialize};
pub mod commitment;
pub mod evm_serde;
pub use evm_serde::CustomSerdeTrait;
use commitment::CommitmentEngineTrait;
pub trait Group: Clone + Copy + Debug + Send + Sync + Sized + Eq + PartialEq {
type Base: PrimeFieldBits + Serialize + for<'de> Deserialize<'de>;
type Scalar: PrimeFieldBits + PrimeFieldExt + Send + Sync + Serialize + for<'de> Deserialize<'de>;
fn group_params() -> (Self::Base, Self::Base, BigInt, BigInt);
}
pub trait Engine: Clone + Copy + Debug + Send + Sync + Sized + Eq + PartialEq {
type Base: PrimeFieldBits
+ TranscriptReprTrait<Self::GE>
+ Serialize
+ for<'de> Deserialize<'de>
+ CustomSerdeTrait;
type Scalar: PrimeFieldBits
+ PrimeFieldExt
+ Send
+ Sync
+ TranscriptReprTrait<Self::GE>
+ Serialize
+ for<'de> Deserialize<'de>
+ CustomSerdeTrait;
type GE: Group<Base = Self::Base, Scalar = Self::Scalar>
+ Serialize
+ for<'de> Deserialize<'de>
+ CustomSerdeTrait;
type RO: ROTrait<Self::Base>;
type ROCircuit: ROCircuitTrait<Self::Base>;
type RO2: ROTrait<Self::Scalar>;
type RO2Circuit: ROCircuitTrait<Self::Scalar>;
type TE: TranscriptEngineTrait<Self>;
type CE: CommitmentEngineTrait<Self>;
}
pub trait AbsorbInROTrait<E: Engine> {
fn absorb_in_ro(&self, ro: &mut E::RO);
}
pub trait AbsorbInRO2Trait<E: Engine> {
fn absorb_in_ro2(&self, ro: &mut E::RO2);
}
pub trait ROTrait<Base: PrimeField> {
type CircuitRO: ROCircuitTrait<Base, Constants = Self::Constants>;
type Constants: Default + Clone + Send + Sync + Serialize + for<'de> Deserialize<'de>;
fn new(constants: Self::Constants) -> Self;
fn absorb(&mut self, e: Base);
fn squeeze(&mut self, num_bits: usize, start_with_one: bool) -> Base;
}
pub trait ROCircuitTrait<Base: PrimeField> {
type NativeRO: ROTrait<Base, Constants = Self::Constants>;
type Constants: Default + Clone + Send + Sync + Serialize + for<'de> Deserialize<'de>;
fn new(constants: Self::Constants) -> Self;
fn absorb(&mut self, e: &AllocatedNum<Base>);
fn squeeze<CS: ConstraintSystem<Base>>(
&mut self,
cs: CS,
num_bits: usize,
start_with_one: bool,
) -> Result<Vec<AllocatedBit>, SynthesisError>;
fn squeeze_scalar<CS: ConstraintSystem<Base>>(
&mut self,
cs: CS,
) -> Result<AllocatedNum<Base>, SynthesisError>;
}
pub type ROConstants<E> = <<E as Engine>::RO as ROTrait<<E as Engine>::Base>>::Constants;
pub type ROConstantsCircuit<E> =
<<E as Engine>::ROCircuit as ROCircuitTrait<<E as Engine>::Base>>::Constants;
pub type RO2Constants<E> = <<E as Engine>::RO2 as ROTrait<<E as Engine>::Scalar>>::Constants;
pub type RO2ConstantsCircuit<E> =
<<E as Engine>::RO2Circuit as ROCircuitTrait<<E as Engine>::Scalar>>::Constants;
pub trait TranscriptReprTrait<G: Group>: Send + Sync {
fn to_transcript_bytes(&self) -> Vec<u8>;
}
pub trait TranscriptEngineTrait<E: Engine>: Send + Sync {
fn new(label: &'static [u8]) -> Self;
fn squeeze(&mut self, label: &'static [u8]) -> Result<E::Scalar, NovaError>;
fn squeeze_bits(
&mut self,
label: &'static [u8],
num_bits: usize,
start_with_one: bool,
) -> Result<E::Scalar, NovaError>;
fn absorb<T: TranscriptReprTrait<E::GE>>(&mut self, label: &'static [u8], o: &T);
fn dom_sep(&mut self, bytes: &'static [u8]);
}
pub trait PrimeFieldExt: PrimeField {
fn from_uniform(bytes: &[u8]) -> Self;
}
impl<G: Group, T: TranscriptReprTrait<G>> TranscriptReprTrait<G> for &[T] {
fn to_transcript_bytes(&self) -> Vec<u8> {
self
.iter()
.flat_map(|t| t.to_transcript_bytes())
.collect::<Vec<u8>>()
}
}
pub mod circuit;
pub mod evaluation;
pub mod snark;