arnaucube
arnaucube/plonky2-semaphorePublic Self-hosted repository
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}