plonky2-semaphore/src/recursion.rs
src/recursion.rsRaw
1use plonky2::iop::witness::{PartialWitness, Witness};
2use plonky2::plonk::circuit_builder::CircuitBuilder;
3use plonky2::plonk::circuit_data::{CircuitConfig, VerifierCircuitData, VerifierCircuitTarget};
4use plonky2::plonk::proof::ProofWithPublicInputs;
5
6use crate::access_set::AccessSet;
7use crate::signal::{Digest, PlonkyProof, Signal, C, F};
8
9impl AccessSet {
10 pub fn aggregate_signals(
11 &self,
12 topic0: Digest,
13 signal0: Signal,
14 topic1: Digest,
15 signal1: Signal,
16 verifier_data: &VerifierCircuitData<F, C, 2>,
17 ) -> (Digest, Digest, PlonkyProof) {
18 let config = CircuitConfig::standard_recursion_zk_config();
19 let mut builder = CircuitBuilder::new(config);
20 let mut pw = PartialWitness::new();
21
22 let public_inputs0: Vec<F> = self
23 .0
24 .cap
25 .0
26 .iter()
27 .flat_map(|h| h.elements)
28 .chain(signal0.nullifier)
29 .chain(topic0)
30 .collect();
31 let public_inputs1: Vec<F> = self
32 .0
33 .cap
34 .0
35 .iter()
36 .flat_map(|h| h.elements)
37 .chain(signal1.nullifier)
38 .chain(topic1)
39 .collect();
40
41 let proof_target0 = builder.add_virtual_proof_with_pis(&verifier_data.common);
42 pw.set_proof_with_pis_target(
43 &proof_target0,
44 &ProofWithPublicInputs {
45 proof: signal0.proof,
46 public_inputs: public_inputs0,
47 },
48 );
49 let proof_target1 = builder.add_virtual_proof_with_pis(&verifier_data.common);
50 pw.set_proof_with_pis_target(
51 &proof_target1,
52 &ProofWithPublicInputs {
53 proof: signal1.proof,
54 public_inputs: public_inputs1,
55 },
56 );
57
58 let vd_target = VerifierCircuitTarget {
59 constants_sigmas_cap: builder
60 .add_virtual_cap(verifier_data.common.config.fri_config.cap_height),
61 };
62 pw.set_cap_target(
63 &vd_target.constants_sigmas_cap,
64 &verifier_data.verifier_only.constants_sigmas_cap,
65 );
66
67 builder.verify_proof(proof_target0, &vd_target, &verifier_data.common);
68 builder.verify_proof(proof_target1, &vd_target, &verifier_data.common);
69
70 let data = builder.build();
71 let recursive_proof = data.prove(pw).unwrap();
72
73 data.verify(recursive_proof.clone()).unwrap();
74
75 (signal0.nullifier, signal1.nullifier, recursive_proof.proof)
76 }
77}