arnaucube
arnaucube/sonobe-playgroundPublic Self-hosted repository
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}