From 4ff6bbb3de8c7fb64d382db5a6e8714a97bef5b2 Mon Sep 17 00:00:00 2001 From: wborgeaud Date: Fri, 7 Oct 2022 09:47:03 +0200 Subject: [PATCH] Hardcode verifier data in the circuit --- evm/src/all_stark.rs | 24 ++++++++++-------------- evm/src/recursive_verifier.rs | 23 ++++++++++------------- plonky2/src/plonk/circuit_builder.rs | 16 +++++++++++++++- 3 files changed, 35 insertions(+), 28 deletions(-) diff --git a/evm/src/all_stark.rs b/evm/src/all_stark.rs index 0e2b7736..26840c5f 100644 --- a/evm/src/all_stark.rs +++ b/evm/src/all_stark.rs @@ -185,12 +185,12 @@ mod tests { use plonky2::field::types::{Field, PrimeField64}; use plonky2::iop::witness::PartialWitness; use plonky2::plonk::circuit_builder::CircuitBuilder; - use plonky2::plonk::circuit_data::CircuitConfig; + use plonky2::plonk::circuit_data::{CircuitConfig, VerifierCircuitData}; use plonky2::plonk::config::{GenericConfig, PoseidonGoldilocksConfig}; use plonky2::util::timing::TimingTree; use rand::{thread_rng, Rng}; - use crate::all_stark::AllStark; + use crate::all_stark::{AllStark, NUM_TABLES}; use crate::config::StarkConfig; use crate::cpu::cpu_stark::CpuStark; use crate::cpu::kernel::aggregator::KERNEL; @@ -773,23 +773,19 @@ mod tests { &circuit_config, )?; - let verifier_data = all_verifier_data_recursive_stark_proof( - &inner_all_stark, - inner_proof.degree_bits(inner_config), - inner_config, - &circuit_config, - ); + let verifier_data: [VerifierCircuitData; NUM_TABLES] = + all_verifier_data_recursive_stark_proof( + &inner_all_stark, + inner_proof.degree_bits(inner_config), + inner_config, + &circuit_config, + ); let circuit_config = CircuitConfig::standard_recursion_config(); let mut builder = CircuitBuilder::::new(circuit_config); let mut pw = PartialWitness::new(); let recursive_all_proof_target = add_virtual_recursive_all_proof(&mut builder, &verifier_data); - set_recursive_all_proof_target( - &mut pw, - &recursive_all_proof_target, - &recursive_all_proof, - &verifier_data, - ); + set_recursive_all_proof_target(&mut pw, &recursive_all_proof_target, &recursive_all_proof); RecursiveAllProof::verify_circuit( &mut builder, recursive_all_proof_target, diff --git a/evm/src/recursive_verifier.rs b/evm/src/recursive_verifier.rs index e94023a7..a16063c4 100644 --- a/evm/src/recursive_verifier.rs +++ b/evm/src/recursive_verifier.rs @@ -5,7 +5,7 @@ use itertools::Itertools; use plonky2::field::extension::Extendable; use plonky2::field::types::Field; use plonky2::fri::witness_util::set_fri_proof_target; -use plonky2::hash::hash_types::RichField; +use plonky2::hash::hash_types::{HashOut, RichField}; use plonky2::hash::hashing::SPONGE_WIDTH; use plonky2::iop::challenger::{Challenger, RecursiveChallenger}; use plonky2::iop::ext_target::ExtensionTarget; @@ -567,14 +567,16 @@ pub fn add_virtual_all_proof, const D: usize>( } } -pub fn add_virtual_recursive_all_proof< - F: RichField + Extendable, - C: GenericConfig, - const D: usize, ->( +/// Returns `RecursiveAllProofTargetWithData` where the proofs targets are virtual and the +/// verifier data targets are constants. +pub fn add_virtual_recursive_all_proof, H, C, const D: usize>( builder: &mut CircuitBuilder, verifier_data: &[VerifierCircuitData; NUM_TABLES], -) -> RecursiveAllProofTargetWithData { +) -> RecursiveAllProofTargetWithData +where + H: Hasher>, + C: GenericConfig, +{ let recursive_proofs = std::array::from_fn(|i| { let verifier_data = &verifier_data[i]; builder.add_virtual_proof_with_pis(&verifier_data.common) @@ -583,7 +585,7 @@ pub fn add_virtual_recursive_all_proof< let verifier_data = &verifier_data[i]; VerifierCircuitTarget { constants_sigmas_cap: builder - .add_virtual_cap(verifier_data.common.config.fri_config.cap_height), + .constant_merkle_cap(&verifier_data.verifier_only.constants_sigmas_cap), } }); RecursiveAllProofTargetWithData { @@ -690,7 +692,6 @@ pub fn set_recursive_all_proof_target, W, const D: witness: &mut W, recursive_all_proof_target: &RecursiveAllProofTargetWithData, all_proof: &RecursiveAllProof, - verifier_data: &[VerifierCircuitData; NUM_TABLES], ) where F: RichField + Extendable, C::Hasher: AlgebraicHasher, @@ -701,10 +702,6 @@ pub fn set_recursive_all_proof_target, W, const D: &recursive_all_proof_target.recursive_proofs[i], &all_proof.recursive_proofs[i], ); - witness.set_cap_target( - &recursive_all_proof_target.verifier_data[i].constants_sigmas_cap, - &verifier_data[i].verifier_only.constants_sigmas_cap, - ); } } pub fn set_all_proof_target, W, const D: usize>( diff --git a/plonky2/src/plonk/circuit_builder.rs b/plonky2/src/plonk/circuit_builder.rs index 05fe649b..bfa012da 100644 --- a/plonky2/src/plonk/circuit_builder.rs +++ b/plonky2/src/plonk/circuit_builder.rs @@ -23,8 +23,9 @@ use crate::gates::gate::{CurrentSlot, Gate, GateInstance, GateRef}; use crate::gates::noop::NoopGate; use crate::gates::public_input::PublicInputGate; use crate::gates::selectors::selector_polynomials; -use crate::hash::hash_types::{HashOutTarget, MerkleCapTarget, RichField}; +use crate::hash::hash_types::{HashOut, HashOutTarget, MerkleCapTarget, RichField}; use crate::hash::merkle_proofs::MerkleProofTarget; +use crate::hash::merkle_tree::MerkleCap; use crate::iop::ext_target::ExtensionTarget; use crate::iop::generator::{ ConstantGenerator, CopyGenerator, RandomValueGenerator, SimpleGenerator, WitnessGenerator, @@ -368,6 +369,19 @@ impl, const D: usize> CircuitBuilder { } } + pub fn constant_hash(&mut self, h: HashOut) -> HashOutTarget { + HashOutTarget { + elements: h.elements.map(|x| self.constant(x)), + } + } + + pub fn constant_merkle_cap>>( + &mut self, + cap: &MerkleCap, + ) -> MerkleCapTarget { + MerkleCapTarget(cap.0.iter().map(|h| self.constant_hash(*h)).collect()) + } + /// If the given target is a constant (i.e. it was created by the `constant(F)` method), returns /// its constant value. Otherwise, returns `None`. pub fn target_as_constant(&self, target: Target) -> Option {