use hashbrown::HashMap; use plonky2::hash::hash_types::RichField; use plonky2::plonk::circuit_data::{ProverCircuitData, VerifierCircuitData}; use plonky2::plonk::config::{AlgebraicHasher, GenericConfig}; use plonky2::plonk::proof::ProofWithPublicInputs; use plonky2_field::extension::Extendable; use plonky2_poseidon2::Poseidon2; use crate::circuit_helper::Plonky2Circuit; use crate::circuits::params::CircuitParams; use crate::circuits::sample_cells::{SampleCircuit, SampleCircuitInput, SampleTargets}; use crate::Result; pub struct Bundle< F: RichField + Extendable + Poseidon2, C: GenericConfig, const D: usize, H: AlgebraicHasher, >{ pub bundle_size: usize, pub circuit: SampleCircuit, pub prover_data: ProverCircuitData, pub verifier_data: VerifierCircuitData, pub sample_targets: SampleTargets, pub bundle_proofs: HashMap>, } impl< F: RichField + Extendable + Poseidon2, C: GenericConfig, const D: usize, H: AlgebraicHasher, > Bundle { pub fn new(bundle_size: usize, circuit_params: CircuitParams) -> Result{ let samp_circ = SampleCircuit::::new(circuit_params.clone()); let (sample_targets, circuit_data) = samp_circ.build_with_standard_config()?; println!("sampling circuit built. Degree bits = {:?}", circuit_data.common.degree_bits()); let verifier_data = circuit_data.verifier_data(); let prover_data = circuit_data.prover_data(); Ok(Self{ bundle_size, circuit: samp_circ, prover_data, verifier_data, sample_targets, bundle_proofs: HashMap::new(), }) } pub fn prove_all(&mut self, circ_inputs: Vec>) -> Result<()>{ assert_eq!(circ_inputs.len(), self.bundle_size, "not enough circuit input provided"); for (i, input) in circ_inputs.into_iter().enumerate(){ self.prove(i, input)?; } Ok(()) } pub fn prove(&mut self, index: usize, circ_input: SampleCircuitInput) -> Result<()>{ let proof = self.circuit.prove(&self.sample_targets, &circ_input, &self.prover_data)?; self.bundle_proofs.insert(index, proof); Ok(()) } }