diff --git a/src/plonk.rs b/src/plonk.rs index 598d683..7844d28 100644 --- a/src/plonk.rs +++ b/src/plonk.rs @@ -9,7 +9,7 @@ use crate::arithmetic::CurveAffine; use crate::poly::{ commitment::Params, Coeff, EvaluationDomain, ExtendedLagrangeCoeff, LagrangeCoeff, Polynomial, }; -use crate::transcript::ChallengeScalar; +use crate::transcript::{ChallengeScalar, Transcript}; mod circuit; mod keygen; @@ -74,6 +74,18 @@ impl VerifyingKey { cs, }) } + + /// Hashes a verification key into a transcript. + pub fn hash>(&self, transcript: &mut T) -> io::Result<()> { + for commitment in &self.fixed_commitments { + transcript.common_point(*commitment)?; + } + for permutation in &self.permutations { + permutation.hash(transcript)?; + } + + Ok(()) + } } /// This is a proving key which allows for the creation of proofs for a diff --git a/src/plonk/permutation.rs b/src/plonk/permutation.rs index dffa01c..054ba23 100644 --- a/src/plonk/permutation.rs +++ b/src/plonk/permutation.rs @@ -4,6 +4,7 @@ use super::circuit::{Any, Column}; use crate::{ arithmetic::CurveAffine, poly::{Coeff, ExtendedLagrangeCoeff, LagrangeCoeff, Polynomial}, + transcript::Transcript, }; pub(crate) mod keygen; @@ -66,6 +67,14 @@ impl VerifyingKey { .collect::, _>>()?; Ok(VerifyingKey { commitments }) } + + pub(crate) fn hash>(&self, transcript: &mut T) -> io::Result<()> { + for commitment in &self.commitments { + transcript.common_point(*commitment)?; + } + + Ok(()) + } } /// The proving key for a single permutation argument. diff --git a/src/plonk/prover.rs b/src/plonk/prover.rs index 038b12d..41069bb 100644 --- a/src/plonk/prover.rs +++ b/src/plonk/prover.rs @@ -30,6 +30,9 @@ pub fn create_proof, ConcreteCircuit: Circ } } + // Hash verification key into transcript + pk.vk.hash(transcript).map_err(|_| Error::TranscriptError)?; + let domain = &pk.vk.domain; let mut meta = ConstraintSystem::default(); let config = ConcreteCircuit::configure(&mut meta); diff --git a/src/plonk/verifier.rs b/src/plonk/verifier.rs index 6d1f721..d324d48 100644 --- a/src/plonk/verifier.rs +++ b/src/plonk/verifier.rs @@ -29,6 +29,9 @@ pub fn verify_proof<'a, C: CurveAffine, T: TranscriptRead>( let num_proofs = instance_commitments.len(); + // Hash verification key into transcript + vk.hash(transcript).map_err(|_| Error::TranscriptError)?; + for instance_commitments in instance_commitments.iter() { // Hash the instance (external) commitments into the transcript for commitment in *instance_commitments {