From b0b2a10da04f2a82baf08567492f2546333e6544 Mon Sep 17 00:00:00 2001 From: Daniel Lubarov Date: Thu, 21 Oct 2021 14:22:22 -0700 Subject: [PATCH] Only log timing for the final proof in recursion tests (#315) * Only log timing for the final proof in recursion tests Just to reduce noise; the performance of the final proof is most meaningful * fmt --- src/gadgets/permutation.rs | 6 +++--- src/plonk/circuit_data.rs | 15 +++++++++++++-- src/plonk/prover.rs | 12 +++++------- src/plonk/recursive_verifier.rs | 24 +++++++++++++++++------- 4 files changed, 38 insertions(+), 19 deletions(-) diff --git a/src/gadgets/permutation.rs b/src/gadgets/permutation.rs index 248ed9e4..4479ccb0 100644 --- a/src/gadgets/permutation.rs +++ b/src/gadgets/permutation.rs @@ -413,7 +413,7 @@ mod tests { builder.assert_permutation(a, b); let data = builder.build(); - let proof = data.prove(pw).unwrap(); + let proof = data.prove(pw)?; verify(proof, &data.verifier_only, &data.common) } @@ -442,7 +442,7 @@ mod tests { builder.assert_permutation(a, b); let data = builder.build(); - let proof = data.prove(pw).unwrap(); + let proof = data.prove(pw)?; verify(proof, &data.verifier_only, &data.common) } @@ -470,7 +470,7 @@ mod tests { builder.assert_permutation(a, b); let data = builder.build(); - data.prove(pw).unwrap(); + data.prove(pw)?; Ok(()) } diff --git a/src/plonk/circuit_data.rs b/src/plonk/circuit_data.rs index 391e5c2f..026fc54e 100644 --- a/src/plonk/circuit_data.rs +++ b/src/plonk/circuit_data.rs @@ -19,6 +19,7 @@ use crate::plonk::proof::ProofWithPublicInputs; use crate::plonk::prover::prove; use crate::plonk::verifier::verify; use crate::util::marking::MarkedTargets; +use crate::util::timing::TimingTree; #[derive(Clone, Debug)] pub struct CircuitConfig { @@ -107,7 +108,12 @@ pub struct CircuitData, const D: usize> { impl, const D: usize> CircuitData { pub fn prove(&self, inputs: PartialWitness) -> Result> { - prove(&self.prover_only, &self.common, inputs) + prove( + &self.prover_only, + &self.common, + inputs, + &mut TimingTree::default(), + ) } pub fn verify(&self, proof_with_pis: ProofWithPublicInputs) -> Result<()> { @@ -129,7 +135,12 @@ pub struct ProverCircuitData, const D: usize> { impl, const D: usize> ProverCircuitData { pub fn prove(&self, inputs: PartialWitness) -> Result> { - prove(&self.prover_only, &self.common, inputs) + prove( + &self.prover_only, + &self.common, + inputs, + &mut TimingTree::default(), + ) } } diff --git a/src/plonk/prover.rs b/src/plonk/prover.rs index 19852cff..ef26683c 100644 --- a/src/plonk/prover.rs +++ b/src/plonk/prover.rs @@ -26,8 +26,8 @@ pub(crate) fn prove, const D: usize>( prover_data: &ProverOnlyCircuitData, common_data: &CommonCircuitData, inputs: PartialWitness, + timing: &mut TimingTree, ) -> Result> { - let mut timing = TimingTree::new("prove", Level::Debug); let config = &common_data.config; let num_challenges = config.num_challenges; let quotient_degree = common_data.quotient_degree(); @@ -73,7 +73,7 @@ pub(crate) fn prove, const D: usize>( config.rate_bits, config.zero_knowledge & PlonkPolynomials::WIRES.blinding, config.cap_height, - &mut timing, + timing, prover_data.fft_root_table.as_ref(), ) ); @@ -119,7 +119,7 @@ pub(crate) fn prove, const D: usize>( config.rate_bits, config.zero_knowledge & PlonkPolynomials::ZS_PARTIAL_PRODUCTS.blinding, config.cap_height, - &mut timing, + timing, prover_data.fft_root_table.as_ref(), ) ); @@ -169,7 +169,7 @@ pub(crate) fn prove, const D: usize>( config.rate_bits, config.zero_knowledge & PlonkPolynomials::QUOTIENT.blinding, config.cap_height, - &mut timing, + timing, prover_data.fft_root_table.as_ref(), ) ); @@ -191,12 +191,10 @@ pub(crate) fn prove, const D: usize>( zeta, &mut challenger, common_data, - &mut timing, + timing, ) ); - timing.print(); - let proof = Proof { wires_cap: wires_commitment.merkle_tree.cap, plonk_zs_partial_products_cap: zs_partial_products_commitment.merkle_tree.cap, diff --git a/src/plonk/recursive_verifier.rs b/src/plonk/recursive_verifier.rs index f9bda416..a46a784e 100644 --- a/src/plonk/recursive_verifier.rs +++ b/src/plonk/recursive_verifier.rs @@ -124,7 +124,7 @@ impl, const D: usize> CircuitBuilder { #[cfg(test)] mod tests { use anyhow::Result; - use log::info; + use log::{info, Level}; use super::*; use crate::field::goldilocks_field::GoldilocksField; @@ -141,7 +141,9 @@ mod tests { CompressedProofWithPublicInputs, OpeningSetTarget, Proof, ProofTarget, ProofWithPublicInputs, }; + use crate::plonk::prover::prove; use crate::util::log2_strict; + use crate::util::timing::TimingTree; // Construct a `FriQueryRoundTarget` with the same dimensions as the ones in `proof`. fn get_fri_query_round, const D: usize>( @@ -367,7 +369,7 @@ mod tests { let config = CircuitConfig::standard_recursion_config(); let (proof, vd, cd) = dummy_proof::(&config, 8_000)?; - let (proof, _vd, cd) = recursive_proof(proof, vd, cd, &config, &config, true)?; + let (proof, _vd, cd) = recursive_proof(proof, vd, cd, &config, &config, true, true)?; test_serialization(&proof, &cd)?; Ok(()) @@ -383,8 +385,8 @@ mod tests { let config = CircuitConfig::standard_recursion_config(); let (proof, vd, cd) = dummy_proof::(&config, 8_000)?; - let (proof, vd, cd) = recursive_proof(proof, vd, cd, &config, &config, false)?; - let (proof, _vd, cd) = recursive_proof(proof, vd, cd, &config, &config, true)?; + let (proof, vd, cd) = recursive_proof(proof, vd, cd, &config, &config, false, false)?; + let (proof, _vd, cd) = recursive_proof(proof, vd, cd, &config, &config, true, true)?; test_serialization(&proof, &cd)?; @@ -414,8 +416,9 @@ mod tests { let (proof, vd, cd) = dummy_proof::(&normal_config, 8_000)?; let (proof, vd, cd) = - recursive_proof(proof, vd, cd, &normal_config, &normal_config, false)?; - let (proof, _vd, cd) = recursive_proof(proof, vd, cd, &normal_config, &final_config, true)?; + recursive_proof(proof, vd, cd, &normal_config, &normal_config, false, false)?; + let (proof, _vd, cd) = + recursive_proof(proof, vd, cd, &normal_config, &final_config, true, true)?; test_serialization(&proof, &cd)?; @@ -449,6 +452,7 @@ mod tests { inner_config: &CircuitConfig, config: &CircuitConfig, print_gate_counts: bool, + print_timing: bool, ) -> Result<( ProofWithPublicInputs, VerifierOnlyCircuitData, @@ -474,7 +478,13 @@ mod tests { } let data = builder.build(); - let proof = data.prove(pw)?; + + let mut timing = TimingTree::new("prove", Level::Debug); + let proof = prove(&data.prover_only, &data.common, pw, &mut timing)?; + if print_timing { + timing.print(); + } + data.verify(proof.clone())?; Ok((proof, data.verifier_only, data.common))