use ark_bn254::{Bn254, constraints::GVar, Fr, G1Projective as G1}; use ark_crypto_primitives::sponge::poseidon::PoseidonConfig; use ark_grumpkin::{constraints::GVar as GVar2, Projective as G2}; use sonobe::{ commitment::{kzg::KZG, pedersen::Pedersen}, folding::{hypernova::HyperNova, nova::Nova}, FoldingScheme, frontend::circom::CircomFCircuit, transcript::poseidon::poseidon_canonical_config, }; pub type NovaFolding = Nova, KZG<'static, Bn254>, Pedersen, false>; pub type HyperNovaFolding = HyperNova< G1, GVar, G2, GVar2, CircomFCircuit, KZG<'static, Bn254>, Pedersen, 1, 1, false, >; pub trait FoldingSchemeExt: FoldingScheme> { fn prepreprocess( poseidon_config: PoseidonConfig, circuit: CircomFCircuit, ) -> Self::PreprocessorParam; } impl FoldingSchemeExt for NovaFolding { fn prepreprocess( poseidon_config: PoseidonConfig, circuit: CircomFCircuit, ) -> Self::PreprocessorParam { Self::PreprocessorParam::new(poseidon_config, circuit) } } impl FoldingSchemeExt for HyperNovaFolding { fn prepreprocess( poseidon_config: PoseidonConfig, circuit: CircomFCircuit, ) -> Self::PreprocessorParam { Self::PreprocessorParam::new(poseidon_config, circuit) } } pub fn prepare_folding( circuit: &CircomFCircuit, start_ivc_state: Vec, rng: &mut impl rand::RngCore, ) -> (FS, FS::VerifierParam) { let preprocess_params = FS::prepreprocess(poseidon_canonical_config::(), circuit.clone()); let params = FS::preprocess(&mut *rng, &preprocess_params).expect("Failed to preprocess folding scheme"); let folding = FS::init(¶ms, circuit.clone(), start_ivc_state).expect("Failed to init folding scheme"); (folding, params.1) } pub fn verify_folding( folding: &FS, folding_vp: FS::VerifierParam, start_ivc_state: Vec, num_steps: u32, ) { let (running_instance, incoming_instance, cyclefold_instance) = folding.instances(); FS::verify( folding_vp, start_ivc_state, folding.state(), Fr::from(num_steps), running_instance, incoming_instance, cyclefold_instance, ) .expect("Failed to verify folded proof"); }