arnaucube
arnaucube/NovaPublic Self-hosted repository
absorb running instance separately (for clarity) (#52)

Srinath Setty srinath@microsoft.com
Fri, 13 May 2022 11:48:53 +0530
commit

82b7fabd9d66f3c9581b0271365d8255f05c511c

parent

706d688a133b8a26d6127bd8eaa9f794b9ea0b2f

3 files changed, 17 insertions(+), 14 deletions(-)

jump to
M src/circuit.rs → src/circuit.rs

@@ -203,7 +203,7 @@ T: AllocatedPoint<G::Base>,

) -> Result<(AllocatedRelaxedR1CSInstance<G>, AllocatedBit), SynthesisError> { // Check that u.x[0] = Hash(params, U, i, z0, zi) let mut ro: PoseidonROGadget<G::Base> = PoseidonROGadget::new(self.poseidon_constants.clone()); - ro.absorb(params); + ro.absorb(params.clone()); ro.absorb(i); ro.absorb(z_0); ro.absorb(z_i);

@@ -220,7 +220,7 @@

// Run NIFS Verifier let U_fold = U.fold_with_r1cs( cs.namespace(|| "compute fold of U and u"), - hash, // hash of the (params, U, i, z0, zi) + params, u, T, self.poseidon_constants.clone(),
M src/gadgets/r1cs.rs → src/gadgets/r1cs.rs

@@ -216,7 +216,7 @@ #[allow(clippy::too_many_arguments)]

pub fn fold_with_r1cs<CS: ConstraintSystem<<G as Group>::Base>>( &self, mut cs: CS, - hash: AllocatedNum<G::Base>, // hash of (params, running_instance, i, z0, zi) + params: AllocatedNum<G::Base>, // hash of R1CSShape of F' u: AllocatedR1CSInstance<G>, T: AllocatedPoint<G::Base>, poseidon_constants: NovaPoseidonConstants<G::Base>,

@@ -225,7 +225,8 @@ n_limbs: usize,

) -> Result<AllocatedRelaxedR1CSInstance<G>, SynthesisError> { // Compute r: let mut ro: PoseidonROGadget<G::Base> = PoseidonROGadget::new(poseidon_constants); - ro.absorb(hash); + ro.absorb(params); + self.absorb_in_ro(cs.namespace(|| "absorb running instance"), &mut ro)?; u.absorb_in_ro(&mut ro); ro.absorb(T.x.clone()); ro.absorb(T.y.clone());
M src/poseidon.rs → src/poseidon.rs

@@ -12,7 +12,7 @@ ConstraintSystem, SynthesisError,

}; use core::marker::PhantomData; use ff::{PrimeField, PrimeFieldBits}; -use generic_array::typenum::{U27, U9}; +use generic_array::typenum::{U27, U32}; use neptune::{ circuit::poseidon_hash, poseidon::{Poseidon, PoseidonConstants},

@@ -25,8 +25,8 @@ pub struct NovaPoseidonConstants<Scalar>

where Scalar: PrimeField, { - constants9: PoseidonConstants<Scalar, U9>, constants27: PoseidonConstants<Scalar, U27>, + constants32: PoseidonConstants<Scalar, U32>, } impl<Scalar> HashFuncConstantsTrait<Scalar> for NovaPoseidonConstants<Scalar>

@@ -36,11 +36,11 @@ {

/// Generate Poseidon constants for the arities that Nova uses #[allow(clippy::new_without_default)] fn new() -> Self { - let constants9 = PoseidonConstants::<Scalar, U9>::new_with_strength(Strength::Strengthened); let constants27 = PoseidonConstants::<Scalar, U27>::new_with_strength(Strength::Strengthened); + let constants32 = PoseidonConstants::<Scalar, U32>::new_with_strength(Strength::Strengthened); Self { - constants9, constants27, + constants32, } } }

@@ -65,9 +65,11 @@ Scalar: PrimeField + PrimeFieldBits,

{ fn hash_inner(&self) -> Base { match self.state.len() { - 9 => Poseidon::<Base, U9>::new_with_preimage(&self.state, &self.constants.constants9).hash(), 27 => { Poseidon::<Base, U27>::new_with_preimage(&self.state, &self.constants.constants27).hash() + } + 32 => { + Poseidon::<Base, U32>::new_with_preimage(&self.state, &self.constants.constants32).hash() } _ => { panic!(

@@ -169,15 +171,15 @@ where

CS: ConstraintSystem<Scalar>, { let out = match self.state.len() { - 9 => poseidon_hash( - cs.namespace(|| "Posideon hash"), - self.state.clone(), - &self.constants.constants9, - )?, 27 => poseidon_hash( cs.namespace(|| "Poseidon hash"), self.state.clone(), &self.constants.constants27, + )?, + 32 => poseidon_hash( + cs.namespace(|| "Posideon hash"), + self.state.clone(), + &self.constants.constants32, )?, _ => { panic!(