diff --git a/plonky2/src/plonk/get_challenges.rs b/plonky2/src/plonk/get_challenges.rs index 507123bf..dd6dbb5a 100644 --- a/plonky2/src/plonk/get_challenges.rs +++ b/plonky2/src/plonk/get_challenges.rs @@ -75,7 +75,7 @@ impl, C: GenericConfig, const D: usize> common_data: &CommonCircuitData, ) -> anyhow::Result> { Ok(self - .get_challenges(common_data)? + .get_challenges(self.get_public_inputs_hash(), common_data)? .fri_challenges .fri_query_indices) } @@ -83,6 +83,7 @@ impl, C: GenericConfig, const D: usize> /// Computes all Fiat-Shamir challenges used in the Plonk proof. pub(crate) fn get_challenges( &self, + public_inputs_hash: <>::InnerHasher as Hasher>::Hash, common_data: &CommonCircuitData, ) -> anyhow::Result> { let Proof { @@ -100,7 +101,7 @@ impl, C: GenericConfig, const D: usize> } = &self.proof; get_challenges( - self.get_public_inputs_hash(), + public_inputs_hash, wires_cap, plonk_zs_partial_products_cap, quotient_polys_cap, @@ -119,6 +120,7 @@ impl, C: GenericConfig, const D: usize> /// Computes all Fiat-Shamir challenges used in the Plonk proof. pub(crate) fn get_challenges( &self, + public_inputs_hash: <>::InnerHasher as Hasher>::Hash, common_data: &CommonCircuitData, ) -> anyhow::Result> { let CompressedProof { @@ -136,7 +138,7 @@ impl, C: GenericConfig, const D: usize> } = &self.proof; get_challenges( - self.get_public_inputs_hash(), + public_inputs_hash, wires_cap, plonk_zs_partial_products_cap, quotient_polys_cap, @@ -303,9 +305,6 @@ impl ProofWithPublicInputsTarget { }, } = &self.proof; - let public_inputs_hash = - builder.hash_n_to_hash_no_pad::(self.public_inputs.clone()); - builder.get_challenges( public_inputs_hash, wires_cap, diff --git a/plonky2/src/plonk/proof.rs b/plonky2/src/plonk/proof.rs index a9bb1210..9fc4d3f6 100644 --- a/plonky2/src/plonk/proof.rs +++ b/plonky2/src/plonk/proof.rs @@ -174,7 +174,7 @@ impl, C: GenericConfig, const D: usize> self, common_data: &CommonCircuitData, ) -> anyhow::Result> { - let challenges = self.get_challenges(common_data)?; + let challenges = self.get_challenges(self.get_public_inputs_hash(), common_data)?; let fri_inferred_elements = self.get_inferred_elements(&challenges, common_data); let decompressed_proof = self.proof @@ -190,16 +190,15 @@ impl, C: GenericConfig, const D: usize> verifier_data: &VerifierOnlyCircuitData, common_data: &CommonCircuitData, ) -> anyhow::Result<()> { - let challenges = self.get_challenges(common_data)?; + let public_inputs_hash = self.get_public_inputs_hash(); + let challenges = self.get_challenges(public_inputs_hash, common_data)?; let fri_inferred_elements = self.get_inferred_elements(&challenges, common_data); let decompressed_proof = self.proof .decompress(&challenges, fri_inferred_elements, &common_data.fri_params); verify_with_challenges( - ProofWithPublicInputs { - public_inputs: self.public_inputs, - proof: decompressed_proof, - }, + decompressed_proof, + public_inputs_hash, challenges, verifier_data, common_data, diff --git a/plonky2/src/plonk/verifier.rs b/plonky2/src/plonk/verifier.rs index da5c9718..1f5a18d2 100644 --- a/plonky2/src/plonk/verifier.rs +++ b/plonky2/src/plonk/verifier.rs @@ -5,9 +5,9 @@ use plonky2_field::field_types::Field; use crate::fri::verifier::verify_fri_proof; use crate::hash::hash_types::RichField; use crate::plonk::circuit_data::{CommonCircuitData, VerifierOnlyCircuitData}; -use crate::plonk::config::GenericConfig; +use crate::plonk::config::{GenericConfig, Hasher}; use crate::plonk::plonk_common::reduce_with_powers; -use crate::plonk::proof::{ProofChallenges, ProofWithPublicInputs}; +use crate::plonk::proof::{Proof, ProofChallenges, ProofWithPublicInputs}; use crate::plonk::vanishing_poly::eval_vanishing_poly; use crate::plonk::vars::EvaluationVars; @@ -16,8 +16,19 @@ pub(crate) fn verify, C: GenericConfig, c verifier_data: &VerifierOnlyCircuitData, common_data: &CommonCircuitData, ) -> Result<()> { - let challenges = proof_with_pis.get_challenges(common_data)?; - verify_with_challenges(proof_with_pis, challenges, verifier_data, common_data) + ensure!( + proof_with_pis.public_inputs.len() == common_data.num_public_inputs, + "Number of public inputs doesn't match circuit data." + ); + let public_inputs_hash = proof_with_pis.get_public_inputs_hash(); + let challenges = proof_with_pis.get_challenges(public_inputs_hash, common_data)?; + verify_with_challenges( + proof_with_pis.proof, + public_inputs_hash, + challenges, + verifier_data, + common_data, + ) } pub(crate) fn verify_with_challenges< @@ -25,25 +36,18 @@ pub(crate) fn verify_with_challenges< C: GenericConfig, const D: usize, >( - proof_with_pis: ProofWithPublicInputs, + proof: Proof, + public_inputs_hash: <>::InnerHasher as Hasher>::Hash, challenges: ProofChallenges, verifier_data: &VerifierOnlyCircuitData, common_data: &CommonCircuitData, ) -> Result<()> { - ensure!( - proof_with_pis.public_inputs.len() == common_data.num_public_inputs, - "Number of public inputs doesn't match circuit data." - ); - let public_inputs_hash = &proof_with_pis.get_public_inputs_hash(); - - let ProofWithPublicInputs { proof, .. } = proof_with_pis; - let local_constants = &proof.openings.constants; let local_wires = &proof.openings.wires; let vars = EvaluationVars { local_constants, local_wires, - public_inputs_hash, + public_inputs_hash: &public_inputs_hash, }; let local_zs = &proof.openings.plonk_zs; let next_zs = &proof.openings.plonk_zs_right;