Skip to content

Commit 9584f46

Browse files
committed
refactor: removed ROConstantsTrait
- trait refactored to Default in associated type, - obviates the need for a separate trait, - refactored call sites and only implementation
1 parent d0a773a commit 9584f46

5 files changed

Lines changed: 34 additions & 49 deletions

File tree

src/circuit.rs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -378,7 +378,7 @@ mod tests {
378378
bellpepper::r1cs::{NovaShape, NovaWitness},
379379
gadgets::utils::scalar_as_base,
380380
provider::poseidon::PoseidonConstantsCircuit,
381-
traits::{circuit::TrivialTestCircuit, ROConstantsTrait},
381+
traits::circuit::TrivialTestCircuit,
382382
};
383383

384384
// In the following we use 1 to refer to the primary, and 2 to refer to the secondary circuit
@@ -454,8 +454,8 @@ mod tests {
454454
fn test_recursive_circuit_pasta() {
455455
let params1 = NovaAugmentedCircuitParams::new(BN_LIMB_WIDTH, BN_N_LIMBS, true);
456456
let params2 = NovaAugmentedCircuitParams::new(BN_LIMB_WIDTH, BN_N_LIMBS, false);
457-
let ro_consts1: ROConstantsCircuit<PastaG2> = PoseidonConstantsCircuit::new();
458-
let ro_consts2: ROConstantsCircuit<PastaG1> = PoseidonConstantsCircuit::new();
457+
let ro_consts1: ROConstantsCircuit<PastaG2> = PoseidonConstantsCircuit::default();
458+
let ro_consts2: ROConstantsCircuit<PastaG1> = PoseidonConstantsCircuit::default();
459459

460460
test_recursive_circuit_with::<PastaG1, PastaG2>(
461461
&params1, &params2, ro_consts1, ro_consts2, 9815, 10347,
@@ -467,9 +467,9 @@ mod tests {
467467
let params1 = NovaAugmentedCircuitParams::new(BN_LIMB_WIDTH, BN_N_LIMBS, true);
468468
let params2 = NovaAugmentedCircuitParams::new(BN_LIMB_WIDTH, BN_N_LIMBS, false);
469469
let ro_consts1: ROConstantsCircuit<provider::bn256_grumpkin::grumpkin::Point> =
470-
PoseidonConstantsCircuit::new();
470+
PoseidonConstantsCircuit::default();
471471
let ro_consts2: ROConstantsCircuit<provider::bn256_grumpkin::bn256::Point> =
472-
PoseidonConstantsCircuit::new();
472+
PoseidonConstantsCircuit::default();
473473

474474
test_recursive_circuit_with::<
475475
provider::bn256_grumpkin::bn256::Point,
@@ -482,9 +482,9 @@ mod tests {
482482
let params1 = NovaAugmentedCircuitParams::new(BN_LIMB_WIDTH, BN_N_LIMBS, true);
483483
let params2 = NovaAugmentedCircuitParams::new(BN_LIMB_WIDTH, BN_N_LIMBS, false);
484484
let ro_consts1: ROConstantsCircuit<provider::secp_secq::secq256k1::Point> =
485-
PoseidonConstantsCircuit::new();
485+
PoseidonConstantsCircuit::default();
486486
let ro_consts2: ROConstantsCircuit<provider::secp_secq::secp256k1::Point> =
487-
PoseidonConstantsCircuit::new();
487+
PoseidonConstantsCircuit::default();
488488

489489
test_recursive_circuit_with::<
490490
provider::secp_secq::secp256k1::Point,

src/lib.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ use traits::{
4545
circuit::StepCircuit,
4646
commitment::{CommitmentEngineTrait, CommitmentTrait},
4747
snark::RelaxedR1CSSNARKTrait,
48-
AbsorbInROTrait, Group, ROConstants, ROConstantsCircuit, ROConstantsTrait, ROTrait,
48+
AbsorbInROTrait, Group, ROConstants, ROConstantsCircuit, ROTrait,
4949
};
5050

5151
/// A type that holds public parameters of Nova
@@ -89,15 +89,15 @@ where
8989
let augmented_circuit_params_secondary =
9090
NovaAugmentedCircuitParams::new(BN_LIMB_WIDTH, BN_N_LIMBS, false);
9191

92-
let ro_consts_primary: ROConstants<G1> = ROConstants::<G1>::new();
93-
let ro_consts_secondary: ROConstants<G2> = ROConstants::<G2>::new();
92+
let ro_consts_primary: ROConstants<G1> = ROConstants::<G1>::default();
93+
let ro_consts_secondary: ROConstants<G2> = ROConstants::<G2>::default();
9494

9595
let F_arity_primary = c_primary.arity();
9696
let F_arity_secondary = c_secondary.arity();
9797

9898
// ro_consts_circuit_primary are parameterized by G2 because the type alias uses G2::Base = G1::Scalar
99-
let ro_consts_circuit_primary: ROConstantsCircuit<G2> = ROConstantsCircuit::<G2>::new();
100-
let ro_consts_circuit_secondary: ROConstantsCircuit<G1> = ROConstantsCircuit::<G1>::new();
99+
let ro_consts_circuit_primary: ROConstantsCircuit<G2> = ROConstantsCircuit::<G2>::default();
100+
let ro_consts_circuit_secondary: ROConstantsCircuit<G1> = ROConstantsCircuit::<G1>::default();
101101

102102
// Initialize ck for the primary
103103
let circuit_primary: NovaAugmentedCircuit<'_, G2, C1> = NovaAugmentedCircuit::new(

src/nifs.rs

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -118,10 +118,7 @@ impl<G: Group> NIFS<G> {
118118
#[cfg(test)]
119119
mod tests {
120120
use super::*;
121-
use crate::{
122-
r1cs::R1CS,
123-
traits::{Group, ROConstantsTrait},
124-
};
121+
use crate::{r1cs::R1CS, traits::Group};
125122
use ::bellpepper_core::{num::AllocatedNum, ConstraintSystem, SynthesisError};
126123
use ff::{Field, PrimeField};
127124
use rand::rngs::OsRng;
@@ -176,7 +173,7 @@ mod tests {
176173
let _ = synthesize_tiny_r1cs_bellpepper(&mut cs, None);
177174
let (shape, ck) = cs.r1cs_shape();
178175
let ro_consts =
179-
<<G as Group>::RO as ROTrait<<G as Group>::Base, <G as Group>::Scalar>>::Constants::new();
176+
<<G as Group>::RO as ROTrait<<G as Group>::Base, <G as Group>::Scalar>>::Constants::default();
180177

181178
// Now get the instance and assignment for one instance
182179
let mut cs: SatisfyingAssignment<G> = SatisfyingAssignment::new();
@@ -328,7 +325,7 @@ mod tests {
328325
// generate generators and ro constants
329326
let ck = R1CS::<G>::commitment_key(&S);
330327
let ro_consts =
331-
<<G as Group>::RO as ROTrait<<G as Group>::Base, <G as Group>::Scalar>>::Constants::new();
328+
<<G as Group>::RO as ROTrait<<G as Group>::Base, <G as Group>::Scalar>>::Constants::default();
332329

333330
let rand_inst_witness_generator =
334331
|ck: &CommitmentKey<G>, I: &G::Scalar| -> (G::Scalar, R1CSInstance<G>, R1CSWitness<G>) {

src/provider/poseidon.rs

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
//! Poseidon Constants and Poseidon-based RO used in Nova
2-
use crate::traits::{ROCircuitTrait, ROConstantsTrait, ROTrait};
2+
use crate::traits::{ROCircuitTrait, ROTrait};
33
use bellpepper_core::{
44
boolean::{AllocatedBit, Boolean},
55
num::AllocatedNum,
@@ -24,13 +24,9 @@ use serde::{Deserialize, Serialize};
2424
#[derive(Clone, Serialize, Deserialize)]
2525
pub struct PoseidonConstantsCircuit<Scalar: PrimeField>(PoseidonConstants<Scalar, U24>);
2626

27-
impl<Scalar> ROConstantsTrait<Scalar> for PoseidonConstantsCircuit<Scalar>
28-
where
29-
Scalar: PrimeField + PrimeFieldBits,
30-
{
27+
impl<Scalar: PrimeField> Default for PoseidonConstantsCircuit<Scalar> {
3128
/// Generate Poseidon constants
32-
#[allow(clippy::new_without_default)]
33-
fn new() -> Self {
29+
fn default() -> Self {
3430
Self(Sponge::<Scalar, U24>::api_constants(Strength::Standard))
3531
}
3632
}
@@ -39,8 +35,8 @@ where
3935
#[derive(Serialize, Deserialize)]
4036
pub struct PoseidonRO<Base, Scalar>
4137
where
42-
Base: PrimeField + PrimeFieldBits,
43-
Scalar: PrimeField + PrimeFieldBits,
38+
Base: PrimeField,
39+
Scalar: PrimeField,
4440
{
4541
// Internal State
4642
state: Vec<Base>,
@@ -53,8 +49,9 @@ where
5349
impl<Base, Scalar> ROTrait<Base, Scalar> for PoseidonRO<Base, Scalar>
5450
where
5551
Base: PrimeField + PrimeFieldBits + Serialize + for<'de> Deserialize<'de>,
56-
Scalar: PrimeField + PrimeFieldBits,
52+
Scalar: PrimeField,
5753
{
54+
type CircuitRO = PoseidonROCircuit<Base>;
5855
type Constants = PoseidonConstantsCircuit<Base>;
5956

6057
fn new(constants: PoseidonConstantsCircuit<Base>, num_absorbs: usize) -> Self {
@@ -123,6 +120,7 @@ impl<Scalar> ROCircuitTrait<Scalar> for PoseidonROCircuit<Scalar>
123120
where
124121
Scalar: PrimeField + PrimeFieldBits + Serialize + for<'de> Deserialize<'de>,
125122
{
123+
type VanillaRO<T: PrimeField> = PoseidonRO<Scalar, T>;
126124
type Constants = PoseidonConstantsCircuit<Scalar>;
127125

128126
/// Initialize the internal state and set the poseidon constants
@@ -217,7 +215,7 @@ mod tests {
217215
{
218216
// Check that the number computed inside the circuit is equal to the number computed outside the circuit
219217
let mut csprng: OsRng = OsRng;
220-
let constants = PoseidonConstantsCircuit::<G::Scalar>::new();
218+
let constants = PoseidonConstantsCircuit::<G::Scalar>::default();
221219
let num_absorbs = 32;
222220
let mut ro: PoseidonRO<G::Scalar, G::Base> = PoseidonRO::new(constants.clone(), num_absorbs);
223221
let mut ro_gadget: PoseidonROCircuit<G::Scalar> =

src/traits/mod.rs

Lines changed: 10 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -117,14 +117,12 @@ pub trait AbsorbInROTrait<G: Group> {
117117
}
118118

119119
/// A helper trait that defines the behavior of a hash function that we use as an RO
120-
pub trait ROTrait<Base, Scalar> {
120+
pub trait ROTrait<Base: PrimeField, Scalar> {
121+
/// The circuit alter ego of this trait impl - this constrains it to use the same constants
122+
type CircuitRO: ROCircuitTrait<Base, Constants = Self::Constants>;
123+
121124
/// A type representing constants/parameters associated with the hash function
122-
type Constants: ROConstantsTrait<Base>
123-
+ Clone
124-
+ Send
125-
+ Sync
126-
+ Serialize
127-
+ for<'de> Deserialize<'de>;
125+
type Constants: Default + Clone + Send + Sync + Serialize + for<'de> Deserialize<'de>;
128126

129127
/// Initializes the hash function
130128
fn new(constants: Self::Constants, num_absorbs: usize) -> Self;
@@ -138,13 +136,11 @@ pub trait ROTrait<Base, Scalar> {
138136

139137
/// A helper trait that defines the behavior of a hash function that we use as an RO in the circuit model
140138
pub trait ROCircuitTrait<Base: PrimeField> {
141-
/// A type representing constants/parameters associated with the hash function
142-
type Constants: ROConstantsTrait<Base>
143-
+ Clone
144-
+ Send
145-
+ Sync
146-
+ Serialize
147-
+ for<'de> Deserialize<'de>;
139+
/// the vanilla alter ego of this trait - this constrains it to use the same constants
140+
type VanillaRO<T: PrimeField>: ROTrait<Base, T, Constants = Self::Constants>;
141+
142+
/// A type representing constants/parameters associated with the hash function on this Base field
143+
type Constants: Default + Clone + Send + Sync + Serialize + for<'de> Deserialize<'de>;
148144

149145
/// Initializes the hash function
150146
fn new(constants: Self::Constants, num_absorbs: usize) -> Self;
@@ -158,12 +154,6 @@ pub trait ROCircuitTrait<Base: PrimeField> {
158154
CS: ConstraintSystem<Base>;
159155
}
160156

161-
/// A helper trait that defines the constants associated with a hash function
162-
pub trait ROConstantsTrait<Base> {
163-
/// produces constants/parameters associated with the hash function
164-
fn new() -> Self;
165-
}
166-
167157
/// An alias for constants associated with G::RO
168158
pub type ROConstants<G> =
169159
<<G as Group>::RO as ROTrait<<G as Group>::Base, <G as Group>::Scalar>>::Constants;

0 commit comments

Comments
 (0)