From 496887bb757f86c7dd2e1ca410c5c8b87bb238e4 Mon Sep 17 00:00:00 2001 From: therealyingtong Date: Thu, 1 Sep 2022 08:03:43 -0700 Subject: [PATCH 1/2] poseidon_hash_longer_input: Test real proof generation. This test passes the MockProver, but fails to generate a real proof. --- halo2_gadgets/src/poseidon/pow5.rs | 30 +++++++++++++++++++++++++++--- 1 file changed, 27 insertions(+), 3 deletions(-) diff --git a/halo2_gadgets/src/poseidon/pow5.rs b/halo2_gadgets/src/poseidon/pow5.rs index 7e7aa45b58..8a07d4523e 100644 --- a/halo2_gadgets/src/poseidon/pow5.rs +++ b/halo2_gadgets/src/poseidon/pow5.rs @@ -597,9 +597,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 +842,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] From f4293c2962e9157257241514c436eb5aa29b596a Mon Sep 17 00:00:00 2001 From: therealyingtong Date: Wed, 21 Jun 2023 11:24:54 +0800 Subject: [PATCH 2/2] Revert commit zcash/halo2@65a89f099b2be9dbc4b8b13ba1b44b620c118568 --- halo2_gadgets/src/poseidon/pow5.rs | 38 +++++++++++++++++------------- 1 file changed, 22 insertions(+), 16 deletions(-) diff --git a/halo2_gadgets/src/poseidon/pow5.rs b/halo2_gadgets/src/poseidon/pow5.rs index 8a07d4523e..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?;