use std::marker::PhantomData; use plonky2::plonk::circuit_data::{CommonCircuitData, VerifierOnlyCircuitData}; use plonky2::plonk::proof::{ProofWithPublicInputs}; use plonky2::recursion::dummy_circuit::{dummy_proof}; use crate::recursion::utils::conditional_verifier::dummy_circuit; use hashbrown::HashMap; use plonky2::hash::hash_types::{ RichField}; use plonky2::plonk::config::{AlgebraicHasher, GenericConfig}; use plonky2_field::extension::Extendable; use plonky2_poseidon2::poseidon2_hash::poseidon2::Poseidon2; use crate::{error::CircuitError, Result}; use crate::circuits::utils::vec_to_array; /// A generator for creating dummy proofs. pub struct DummyProofGen< F: RichField + Extendable + Poseidon2, const D: usize, C: GenericConfig, > where >::Hasher: AlgebraicHasher { phantom_data: PhantomData<(F,C)>, } impl< F: RichField + Extendable + Poseidon2, const D: usize, C: GenericConfig, > DummyProofGen where >::Hasher: AlgebraicHasher { /// Generates a single dummy leaf proof. pub fn gen_dummy_leaf_proof( common_data: &CommonCircuitData, ) -> Result> { dummy_proof::(&dummy_circuit::(common_data), HashMap::new()) .map_err(|e| CircuitError::DummyProofGenerationError(e.to_string())) } /// Generates a single dummy node proof. pub fn get_dummy_node_proof( node_common: &CommonCircuitData, node_verifier_only_data: &VerifierOnlyCircuitData, ) -> ProofWithPublicInputs { Self::recursion_base_proof(node_common, HashMap::new()) } fn recursion_base_proof( common_data: &CommonCircuitData, mut nonzero_public_inputs: HashMap ) -> ProofWithPublicInputs{ dummy_proof::( &dummy_circuit::(common_data), nonzero_public_inputs, ) .unwrap() } /// Generates an array of `N` dummy leaf proofs. pub fn gen_n_dummy_leaf_proofs( common_data: &CommonCircuitData, ) -> Result<[ProofWithPublicInputs; N]> { let dummy_proof = Self::gen_dummy_leaf_proof(common_data)?; let n_dummy_vec = (0..N).map(|_| dummy_proof.clone()).collect::>(); vec_to_array::>(n_dummy_vec) } /// Generates an array of `N` dummy node proofs. pub fn gen_n_dummy_node_proofs( node_common: &CommonCircuitData, node_verifier_only_data: &VerifierOnlyCircuitData, ) -> Result<[ProofWithPublicInputs; N]> { let dummy_proof = Self::get_dummy_node_proof(node_common, node_verifier_only_data); let n_dummy_vec = (0..N).map(|_| dummy_proof.clone()).collect::>(); vec_to_array::>(n_dummy_vec) } }