sonobe-playground/src/folding.rs
src/folding.rsRaw
1use ark_bn254::{constraints::GVar, Bn254, Fr, G1Projective as G1};
2use ark_grumpkin::{constraints::GVar as GVar2, Projective as G2};
3use rand::rngs::OsRng;
4use sonobe::{
5 commitment::{kzg::KZG, pedersen::Pedersen},
6 folding::nova::{Nova, PreprocessorParam},
7 frontend::circom::CircomFCircuit,
8 transcript::poseidon::poseidon_canonical_config,
9 FoldingScheme,
10};
11
12pub type NovaFolding =
13 Nova<G1, GVar, G2, GVar2, CircomFCircuit<Fr>, KZG<'static, Bn254>, Pedersen<G2>, false>;
14pub type NovaVerifierParam =
15 <NovaFolding as FoldingScheme<G1, G2, CircomFCircuit<Fr>>>::VerifierParam;
16
17pub fn prepare_folding(
18 circuit: &CircomFCircuit<Fr>,
19 start_ivc_state: Vec<Fr>,
20 rng: &mut OsRng,
21) -> (NovaFolding, NovaVerifierParam) {
22 let nova_preprocess_params =
23 PreprocessorParam::new(poseidon_canonical_config::<Fr>(), circuit.clone());
24 let nova_params = NovaFolding::preprocess(&mut *rng, &nova_preprocess_params)
25 .expect("Failed to preprocess Nova");
26 let folding = NovaFolding::init(&nova_params, circuit.clone(), start_ivc_state)
27 .expect("Failed to init Nova");
28
29 (folding, nova_params.1)
30}
31
32pub fn verify_folding(
33 folding: &NovaFolding,
34 folding_vp: NovaVerifierParam,
35 start_ivc_state: Vec<Fr>,
36 num_steps: u32,
37) {
38 let (running_instance, incoming_instance, cyclefold_instance) = folding.instances();
39 NovaFolding::verify(
40 folding_vp,
41 start_ivc_state,
42 folding.state(),
43 Fr::from(num_steps),
44 running_instance,
45 incoming_instance,
46 cyclefold_instance,
47 )
48 .expect("Failed to verify folded proof");
49}