1use crate::{
3 errors::NovaError,
4 frontend::{num::AllocatedNum, AllocatedBit, ConstraintSystem, SynthesisError},
5};
6use core::fmt::Debug;
7use ff::{PrimeField, PrimeFieldBits};
8use num_bigint::BigInt;
9use serde::{Deserialize, Serialize};
10
11pub mod commitment;
12pub mod evm_serde;
13pub use evm_serde::CustomSerdeTrait;
14
15use commitment::CommitmentEngineTrait;
16
17pub trait Group: Clone + Copy + Debug + Send + Sync + Sized + Eq + PartialEq {
20 type Base: PrimeFieldBits + Serialize + for<'de> Deserialize<'de>;
22
23 type Scalar: PrimeFieldBits + PrimeFieldExt + Send + Sync + Serialize + for<'de> Deserialize<'de>;
25
26 fn group_params() -> (Self::Base, Self::Base, BigInt, BigInt);
28}
29
30pub trait Engine: Clone + Copy + Debug + Send + Sync + Sized + Eq + PartialEq {
32 type Base: PrimeFieldBits
34 + TranscriptReprTrait<Self::GE>
35 + Serialize
36 + for<'de> Deserialize<'de>
37 + CustomSerdeTrait;
38
39 type Scalar: PrimeFieldBits
41 + PrimeFieldExt
42 + Send
43 + Sync
44 + TranscriptReprTrait<Self::GE>
45 + Serialize
46 + for<'de> Deserialize<'de>
47 + CustomSerdeTrait;
48
49 type GE: Group<Base = Self::Base, Scalar = Self::Scalar>
51 + Serialize
52 + for<'de> Deserialize<'de>
53 + CustomSerdeTrait;
54
55 type RO: ROTrait<Self::Base>;
58
59 type ROCircuit: ROCircuitTrait<Self::Base>;
61
62 type RO2: ROTrait<Self::Scalar>;
65
66 type RO2Circuit: ROCircuitTrait<Self::Scalar>;
68
69 type TE: TranscriptEngineTrait<Self>;
71
72 type CE: CommitmentEngineTrait<Self>;
74}
75
76pub trait AbsorbInROTrait<E: Engine> {
78 fn absorb_in_ro(&self, ro: &mut E::RO);
80}
81
82pub trait AbsorbInRO2Trait<E: Engine> {
84 fn absorb_in_ro2(&self, ro: &mut E::RO2);
86}
87
88pub trait ROTrait<Base: PrimeField> {
90 type CircuitRO: ROCircuitTrait<Base, Constants = Self::Constants>;
92
93 type Constants: Default + Clone + Send + Sync + Serialize + for<'de> Deserialize<'de>;
95
96 fn new(constants: Self::Constants) -> Self;
98
99 fn absorb(&mut self, e: Base);
101
102 fn squeeze(&mut self, num_bits: usize, start_with_one: bool) -> Base;
105}
106
107pub trait ROCircuitTrait<Base: PrimeField> {
109 type NativeRO: ROTrait<Base, Constants = Self::Constants>;
111
112 type Constants: Default + Clone + Send + Sync + Serialize + for<'de> Deserialize<'de>;
114
115 fn new(constants: Self::Constants) -> Self;
117
118 fn absorb(&mut self, e: &AllocatedNum<Base>);
120
121 fn squeeze<CS: ConstraintSystem<Base>>(
125 &mut self,
126 cs: CS,
127 num_bits: usize,
128 start_with_one: bool,
129 ) -> Result<Vec<AllocatedBit>, SynthesisError>;
130
131 fn squeeze_scalar<CS: ConstraintSystem<Base>>(
134 &mut self,
135 cs: CS,
136 ) -> Result<AllocatedNum<Base>, SynthesisError>;
137}
138
139pub type ROConstants<E> = <<E as Engine>::RO as ROTrait<<E as Engine>::Base>>::Constants;
141
142pub type ROConstantsCircuit<E> =
144 <<E as Engine>::ROCircuit as ROCircuitTrait<<E as Engine>::Base>>::Constants;
145
146pub type RO2Constants<E> = <<E as Engine>::RO2 as ROTrait<<E as Engine>::Scalar>>::Constants;
148
149pub type RO2ConstantsCircuit<E> =
151 <<E as Engine>::RO2Circuit as ROCircuitTrait<<E as Engine>::Scalar>>::Constants;
152
153pub trait TranscriptReprTrait<G: Group>: Send + Sync {
155 fn to_transcript_bytes(&self) -> Vec<u8>;
157}
158
159pub trait TranscriptEngineTrait<E: Engine>: Send + Sync {
161 fn new(label: &'static [u8]) -> Self;
163
164 fn squeeze(&mut self, label: &'static [u8]) -> Result<E::Scalar, NovaError>;
166
167 fn squeeze_bits(
176 &mut self,
177 label: &'static [u8],
178 num_bits: usize,
179 start_with_one: bool,
180 ) -> Result<E::Scalar, NovaError>;
181
182 fn absorb<T: TranscriptReprTrait<E::GE>>(&mut self, label: &'static [u8], o: &T);
184
185 fn dom_sep(&mut self, bytes: &'static [u8]);
187}
188
189pub trait PrimeFieldExt: PrimeField {
191 fn from_uniform(bytes: &[u8]) -> Self;
193}
194
195impl<G: Group, T: TranscriptReprTrait<G>> TranscriptReprTrait<G> for &[T] {
196 fn to_transcript_bytes(&self) -> Vec<u8> {
197 self
198 .iter()
199 .flat_map(|t| t.to_transcript_bytes())
200 .collect::<Vec<u8>>()
201 }
202}
203
204pub mod circuit;
205pub mod evaluation;
206pub mod snark;