Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Small RO trait simplification #222

Merged
merged 3 commits into from
Aug 23, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 7 additions & 7 deletions src/circuit.rs
Original file line number Diff line number Diff line change
Expand Up @@ -378,7 +378,7 @@ mod tests {
bellpepper::r1cs::{NovaShape, NovaWitness},
gadgets::utils::scalar_as_base,
provider::poseidon::PoseidonConstantsCircuit,
traits::{circuit::TrivialTestCircuit, ROConstantsTrait},
traits::circuit::TrivialTestCircuit,
};

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

test_recursive_circuit_with::<PastaG1, PastaG2>(
&params1, &params2, ro_consts1, ro_consts2, 9815, 10347,
Expand All @@ -467,9 +467,9 @@ mod tests {
let params1 = NovaAugmentedCircuitParams::new(BN_LIMB_WIDTH, BN_N_LIMBS, true);
let params2 = NovaAugmentedCircuitParams::new(BN_LIMB_WIDTH, BN_N_LIMBS, false);
let ro_consts1: ROConstantsCircuit<provider::bn256_grumpkin::grumpkin::Point> =
PoseidonConstantsCircuit::new();
PoseidonConstantsCircuit::default();
let ro_consts2: ROConstantsCircuit<provider::bn256_grumpkin::bn256::Point> =
PoseidonConstantsCircuit::new();
PoseidonConstantsCircuit::default();

test_recursive_circuit_with::<
provider::bn256_grumpkin::bn256::Point,
Expand All @@ -482,9 +482,9 @@ mod tests {
let params1 = NovaAugmentedCircuitParams::new(BN_LIMB_WIDTH, BN_N_LIMBS, true);
let params2 = NovaAugmentedCircuitParams::new(BN_LIMB_WIDTH, BN_N_LIMBS, false);
let ro_consts1: ROConstantsCircuit<provider::secp_secq::secq256k1::Point> =
PoseidonConstantsCircuit::new();
PoseidonConstantsCircuit::default();
let ro_consts2: ROConstantsCircuit<provider::secp_secq::secp256k1::Point> =
PoseidonConstantsCircuit::new();
PoseidonConstantsCircuit::default();

test_recursive_circuit_with::<
provider::secp_secq::secp256k1::Point,
Expand Down
10 changes: 5 additions & 5 deletions src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ use traits::{
circuit::StepCircuit,
commitment::{CommitmentEngineTrait, CommitmentTrait},
snark::RelaxedR1CSSNARKTrait,
AbsorbInROTrait, Group, ROConstants, ROConstantsCircuit, ROConstantsTrait, ROTrait,
AbsorbInROTrait, Group, ROConstants, ROConstantsCircuit, ROTrait,
};

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

let ro_consts_primary: ROConstants<G1> = ROConstants::<G1>::new();
let ro_consts_secondary: ROConstants<G2> = ROConstants::<G2>::new();
let ro_consts_primary: ROConstants<G1> = ROConstants::<G1>::default();
let ro_consts_secondary: ROConstants<G2> = ROConstants::<G2>::default();

let F_arity_primary = c_primary.arity();
let F_arity_secondary = c_secondary.arity();

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

// Initialize ck for the primary
let circuit_primary: NovaAugmentedCircuit<'_, G2, C1> = NovaAugmentedCircuit::new(
Expand Down
9 changes: 3 additions & 6 deletions src/nifs.rs
Original file line number Diff line number Diff line change
Expand Up @@ -118,10 +118,7 @@ impl<G: Group> NIFS<G> {
#[cfg(test)]
mod tests {
use super::*;
use crate::{
r1cs::R1CS,
traits::{Group, ROConstantsTrait},
};
use crate::{r1cs::R1CS, traits::Group};
use ::bellpepper_core::{num::AllocatedNum, ConstraintSystem, SynthesisError};
use ff::{Field, PrimeField};
use rand::rngs::OsRng;
Expand Down Expand Up @@ -176,7 +173,7 @@ mod tests {
let _ = synthesize_tiny_r1cs_bellpepper(&mut cs, None);
let (shape, ck) = cs.r1cs_shape();
let ro_consts =
<<G as Group>::RO as ROTrait<<G as Group>::Base, <G as Group>::Scalar>>::Constants::new();
<<G as Group>::RO as ROTrait<<G as Group>::Base, <G as Group>::Scalar>>::Constants::default();

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

let rand_inst_witness_generator =
|ck: &CommitmentKey<G>, I: &G::Scalar| -> (G::Scalar, R1CSInstance<G>, R1CSWitness<G>) {
Expand Down
20 changes: 9 additions & 11 deletions src/provider/poseidon.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
//! Poseidon Constants and Poseidon-based RO used in Nova
use crate::traits::{ROCircuitTrait, ROConstantsTrait, ROTrait};
use crate::traits::{ROCircuitTrait, ROTrait};
use bellpepper_core::{
boolean::{AllocatedBit, Boolean},
num::AllocatedNum,
Expand All @@ -24,13 +24,9 @@ use serde::{Deserialize, Serialize};
#[derive(Clone, Serialize, Deserialize)]
pub struct PoseidonConstantsCircuit<Scalar: PrimeField>(PoseidonConstants<Scalar, U24>);

impl<Scalar> ROConstantsTrait<Scalar> for PoseidonConstantsCircuit<Scalar>
where
Scalar: PrimeField + PrimeFieldBits,
{
impl<Scalar: PrimeField> Default for PoseidonConstantsCircuit<Scalar> {
/// Generate Poseidon constants
#[allow(clippy::new_without_default)]
fn new() -> Self {
fn default() -> Self {
Self(Sponge::<Scalar, U24>::api_constants(Strength::Standard))
}
}
Expand All @@ -39,8 +35,8 @@ where
#[derive(Serialize, Deserialize)]
pub struct PoseidonRO<Base, Scalar>
where
Base: PrimeField + PrimeFieldBits,
Scalar: PrimeField + PrimeFieldBits,
Base: PrimeField,
Scalar: PrimeField,
{
// Internal State
state: Vec<Base>,
Expand All @@ -53,8 +49,9 @@ where
impl<Base, Scalar> ROTrait<Base, Scalar> for PoseidonRO<Base, Scalar>
where
Base: PrimeField + PrimeFieldBits + Serialize + for<'de> Deserialize<'de>,
Scalar: PrimeField + PrimeFieldBits,
Scalar: PrimeField,
{
type CircuitRO = PoseidonROCircuit<Base>;
type Constants = PoseidonConstantsCircuit<Base>;

fn new(constants: PoseidonConstantsCircuit<Base>, num_absorbs: usize) -> Self {
Expand Down Expand Up @@ -123,6 +120,7 @@ impl<Scalar> ROCircuitTrait<Scalar> for PoseidonROCircuit<Scalar>
where
Scalar: PrimeField + PrimeFieldBits + Serialize + for<'de> Deserialize<'de>,
{
type NativeRO<T: PrimeField> = PoseidonRO<Scalar, T>;
type Constants = PoseidonConstantsCircuit<Scalar>;

/// Initialize the internal state and set the poseidon constants
Expand Down Expand Up @@ -217,7 +215,7 @@ mod tests {
{
// Check that the number computed inside the circuit is equal to the number computed outside the circuit
let mut csprng: OsRng = OsRng;
let constants = PoseidonConstantsCircuit::<G::Scalar>::new();
let constants = PoseidonConstantsCircuit::<G::Scalar>::default();
let num_absorbs = 32;
let mut ro: PoseidonRO<G::Scalar, G::Base> = PoseidonRO::new(constants.clone(), num_absorbs);
let mut ro_gadget: PoseidonROCircuit<G::Scalar> =
Expand Down
34 changes: 11 additions & 23 deletions src/traits/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@ pub trait Group:
+ Copy
+ Debug
+ Eq
+ Sized
+ GroupOps
+ GroupOpsOwned
+ ScalarMul<<Self as Group>::Scalar>
Expand Down Expand Up @@ -95,7 +94,6 @@ pub trait CompressedGroup:
+ Copy
+ Debug
+ Eq
+ Sized
+ Send
+ Sync
+ TranscriptReprTrait<Self::GroupElement>
Expand All @@ -117,14 +115,12 @@ pub trait AbsorbInROTrait<G: Group> {
}

/// A helper trait that defines the behavior of a hash function that we use as an RO
pub trait ROTrait<Base, Scalar> {
pub trait ROTrait<Base: PrimeField, Scalar> {
/// The circuit alter ego of this trait impl - this constrains it to use the same constants
type CircuitRO: ROCircuitTrait<Base, Constants = Self::Constants>;

/// A type representing constants/parameters associated with the hash function
type Constants: ROConstantsTrait<Base>
+ Clone
+ Send
+ Sync
+ Serialize
+ for<'de> Deserialize<'de>;
type Constants: Default + Clone + Send + Sync + Serialize + for<'de> Deserialize<'de>;

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

/// A helper trait that defines the behavior of a hash function that we use as an RO in the circuit model
pub trait ROCircuitTrait<Base: PrimeField> {
/// A type representing constants/parameters associated with the hash function
type Constants: ROConstantsTrait<Base>
+ Clone
+ Send
+ Sync
+ Serialize
+ for<'de> Deserialize<'de>;
/// the vanilla alter ego of this trait - this constrains it to use the same constants
type NativeRO<T: PrimeField>: ROTrait<Base, T, Constants = Self::Constants>;

/// A type representing constants/parameters associated with the hash function on this Base field
type Constants: Default + Clone + Send + Sync + Serialize + for<'de> Deserialize<'de>;

/// Initializes the hash function
fn new(constants: Self::Constants, num_absorbs: usize) -> Self;
Expand All @@ -158,13 +152,7 @@ pub trait ROCircuitTrait<Base: PrimeField> {
CS: ConstraintSystem<Base>;
}

/// A helper trait that defines the constants associated with a hash function
pub trait ROConstantsTrait<Base> {
/// produces constants/parameters associated with the hash function
fn new() -> Self;
}

/// An alias for constants associated with `G::RO`
/// An alias for constants associated with G::RO
pub type ROConstants<G> =
<<G as Group>::RO as ROTrait<<G as Group>::Base, <G as Group>::Scalar>>::Constants;

Expand Down
2 changes: 1 addition & 1 deletion src/traits/snark.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ use serde::{Deserialize, Serialize};

/// A trait that defines the behavior of a `zkSNARK`
pub trait RelaxedR1CSSNARKTrait<G: Group>:
Sized + Send + Sync + Serialize + for<'de> Deserialize<'de>
Send + Sync + Serialize + for<'de> Deserialize<'de>
{
/// A type that represents the prover's key
type ProverKey: Send + Sync + Serialize + for<'de> Deserialize<'de>;
Expand Down