diff --git a/halo2_gadgets/src/poseidon/pow5.rs b/halo2_gadgets/src/poseidon/pow5.rs index 7e7aa45b58..704bda1daa 100644 --- a/halo2_gadgets/src/poseidon/pow5.rs +++ b/halo2_gadgets/src/poseidon/pow5.rs @@ -341,24 +341,30 @@ impl< // Load the input into this region. let load_input_word = |i: usize| { - let constraint_var = match input.0[i].clone() { - Some(PaddedWord::Message(word)) => word, - Some(PaddedWord::Padding(padding_value)) => region.assign_fixed( - || format!("load pad_{}", i), - config.rc_b[i], - 1, - || Value::known(padding_value), - )?, + let (cell, value) = match input.0[i].clone() { + Some(PaddedWord::Message(word)) => (word.cell(), word.value().copied()), + Some(PaddedWord::Padding(padding_value)) => { + let cell = region + .assign_fixed( + || format!("load pad_{}", i), + config.rc_b[i], + 1, + || Value::known(padding_value), + )? + .cell(); + (cell, Value::known(padding_value)) + } _ => panic!("Input is not padded"), }; - constraint_var - .copy_advice( - || format!("load input_{}", i), - &mut region, - config.state[i], - 1, - ) - .map(StateWord) + let var = region.assign_advice( + || format!("load input_{}", i), + config.state[i], + 1, + || value, + )?; + region.constrain_equal(cell, var.cell())?; + + Ok(StateWord(var)) }; let input: Result, Error> = (0..RATE).map(load_input_word).collect(); let input = input?; @@ -597,9 +603,11 @@ mod tests { circuit::{Layouter, SimpleFloorPlanner, Value}, dev::MockProver, pasta::Fp, - plonk::{Circuit, ConstraintSystem, Error}, + plonk::{self, Circuit, ConstraintSystem, Error, SingleVerifier}, + poly::commitment::Params, + transcript::{Blake2bRead, Blake2bWrite, Challenge255}, }; - use pasta_curves::pallas; + use pasta_curves::{pallas, EqAffine}; use rand::rngs::OsRng; use super::{PoseidonInstructions, Pow5Chip, Pow5Config, StateWord}; @@ -840,7 +848,29 @@ mod tests { _spec: PhantomData, }; let prover = MockProver::run(k, &circuit, vec![]).unwrap(); - assert_eq!(prover.verify(), Ok(())) + assert_eq!(prover.verify(), Ok(())); + + let params = Params::new(k); + let vk = plonk::keygen_vk(¶ms, &circuit).unwrap(); + let pk = plonk::keygen_pk(¶ms, vk, &circuit).unwrap(); + + let mut transcript = Blake2bWrite::<_, EqAffine, _>::init(vec![]); + plonk::create_proof( + ¶ms, + &pk, + &[circuit], + &[&[]], + &mut OsRng, + &mut transcript, + ) + .unwrap(); + let proof = transcript.finalize(); + + let strategy = SingleVerifier::new(¶ms); + let mut transcript = Blake2bRead::<_, _, Challenge255<_>>::init(&proof[..]); + assert!( + plonk::verify_proof(¶ms, pk.get_vk(), strategy, &[&[]], &mut transcript).is_ok() + ); } #[test]