From 35b22974edb717d2954ede6342ab1b54002947a3 Mon Sep 17 00:00:00 2001 From: wborgeaud Date: Mon, 5 Sep 2022 12:25:30 +0200 Subject: [PATCH] Recursively verify --- evm/src/all_stark.rs | 34 +++++++++++----------------------- evm/src/recursive_verifier.rs | 24 +++++++++++++++++++++++- 2 files changed, 34 insertions(+), 24 deletions(-) diff --git a/evm/src/all_stark.rs b/evm/src/all_stark.rs index e04004cc..efc6a3af 100644 --- a/evm/src/all_stark.rs +++ b/evm/src/all_stark.rs @@ -174,6 +174,8 @@ mod tests { use itertools::Itertools; use plonky2::field::polynomial::PolynomialValues; 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::config::{GenericConfig, PoseidonGoldilocksConfig}; use plonky2::util::timing::TimingTree; @@ -750,29 +752,15 @@ mod tests { inner_config, circuit_config, )?; - recursive_all_proof.verify() - // let mut builder = CircuitBuilder::::new(circuit_config); - // let mut pw = PartialWitness::new(); - // let degree_bits = inner_proof.degree_bits(inner_config); - // let nums_ctl_zs = inner_proof.nums_ctl_zs(); - // let pt = add_virtual_all_proof( - // &mut builder, - // &inner_all_stark, - // inner_config, - // °ree_bits, - // &nums_ctl_zs, - // ); - // set_all_proof_target(&mut pw, &pt, &inner_proof, builder.zero()); - // - // verify_proof_circuit::(&mut builder, inner_all_stark, pt, inner_config); - // - // if print_gate_counts { - // builder.print_gate_counts(0); - // } - // - // let data = builder.build::(); - // let proof = data.prove(pw)?; - // data.verify(proof) + + let circuit_config = CircuitConfig::standard_recursion_config(); + let mut builder = CircuitBuilder::::new(circuit_config); + let mut pw = PartialWitness::new(); + recursive_all_proof.recursively_verify(&mut builder, &mut pw); + + let data = builder.build::(); + let proof = data.prove(pw)?; + data.verify(proof) } fn init_logger() { diff --git a/evm/src/recursive_verifier.rs b/evm/src/recursive_verifier.rs index 7488b86a..02fdc4d6 100644 --- a/evm/src/recursive_verifier.rs +++ b/evm/src/recursive_verifier.rs @@ -8,7 +8,7 @@ use plonky2::iop::ext_target::ExtensionTarget; use plonky2::iop::target::Target; use plonky2::iop::witness::{PartialWitness, Witness}; use plonky2::plonk::circuit_builder::CircuitBuilder; -use plonky2::plonk::circuit_data::{CircuitConfig, VerifierCircuitData}; +use plonky2::plonk::circuit_data::{CircuitConfig, VerifierCircuitData, VerifierCircuitTarget}; use plonky2::plonk::config::Hasher; use plonky2::plonk::config::{AlgebraicHasher, GenericConfig}; use plonky2::plonk::proof::ProofWithPublicInputs; @@ -56,6 +56,28 @@ impl, C: GenericConfig, const D: usize> } Ok(()) } + + pub fn recursively_verify(&self, builder: &mut CircuitBuilder, pw: &mut W) + where + W: Witness, + [(); C::Hasher::HASH_SIZE]:, + >::Hasher: AlgebraicHasher, + { + for (proof, verifier_data) in &self.recursive_proofs { + let pt = builder.add_virtual_proof_with_pis(&verifier_data.common); + pw.set_proof_with_pis_target(&pt, &proof); + let inner_data = VerifierCircuitTarget { + constants_sigmas_cap: builder + .add_virtual_cap(verifier_data.common.config.fri_config.cap_height), + }; + pw.set_cap_target( + &inner_data.constants_sigmas_cap, + &verifier_data.verifier_only.constants_sigmas_cap, + ); + builder.verify_proof(pt, &inner_data, &verifier_data.common); + } + // builder.print_gate_counts(0); + } } fn recursively_prove_stark_proof<