Recursively verify

This commit is contained in:
wborgeaud 2022-09-05 12:25:30 +02:00
parent e6490fdd11
commit 35b22974ed
2 changed files with 34 additions and 24 deletions

View File

@ -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::<F, D>::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,
// &degree_bits,
// &nums_ctl_zs,
// );
// set_all_proof_target(&mut pw, &pt, &inner_proof, builder.zero());
//
// verify_proof_circuit::<F, C, D>(&mut builder, inner_all_stark, pt, inner_config);
//
// if print_gate_counts {
// builder.print_gate_counts(0);
// }
//
// let data = builder.build::<C>();
// let proof = data.prove(pw)?;
// data.verify(proof)
let circuit_config = CircuitConfig::standard_recursion_config();
let mut builder = CircuitBuilder::<F, D>::new(circuit_config);
let mut pw = PartialWitness::new();
recursive_all_proof.recursively_verify(&mut builder, &mut pw);
let data = builder.build::<C>();
let proof = data.prove(pw)?;
data.verify(proof)
}
fn init_logger() {

View File

@ -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<F: RichField + Extendable<D>, C: GenericConfig<D, F = F>, const D: usize>
}
Ok(())
}
pub fn recursively_verify<W>(&self, builder: &mut CircuitBuilder<F, D>, pw: &mut W)
where
W: Witness<F>,
[(); C::Hasher::HASH_SIZE]:,
<C as GenericConfig<D>>::Hasher: AlgebraicHasher<F>,
{
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<