absorb running instance separately (for clarity) (#52)
Srinath Setty srinath@microsoft.com
Fri, 13 May 2022 11:48:53 +0530
3 files changed,
17 insertions(+),
14 deletions(-)
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!(