arnaucube
arnaucube/sonobe-playgroundPublic Self-hosted repository
sonobe-playground/src/main.rs
src/main.rsRaw
 1use std::time::Instant;
 2
 3use scenario_config::ScenarioConfig;
 4
 5use crate::folding::{
 6    FoldingSchemeExt, HyperNovaFolding, NovaFolding, prepare_folding, verify_folding,
 7};
 8
 9mod circuit;
10
11mod folding;
12mod input;
13mod scenario_config;
14
15fn measure<T, Action: FnOnce() -> T>(action_name: &str, action: Action) -> T {
16    let start = Instant::now();
17    let result = action();
18    println!("{action_name}: {:?}", start.elapsed());
19    result
20}
21
22fn scenario<FS: FoldingSchemeExt>(config: ScenarioConfig, rng: &mut impl rand::RngCore) {
23    // ============== FOLDING PREPARATION ==========================================================
24
25    let (mut folding, folding_vp) = measure("Prepare folding", || {
26        prepare_folding::<FS>(&config.circuit, config.start_ivc_state.clone(), rng)
27    });
28
29    // ============== FOLDING ======================================================================
30
31    let input = config.input().to_vec();
32    for (i, step_input) in FS::transform_inputs(input).enumerate() {
33        measure(&format!("Prove_step {i}"), || {
34            folding
35                .prove_step(
36                    &mut *rng,
37                    step_input.external_inputs,
38                    step_input.other_instances,
39                )
40                .expect("Failed to prove step")
41        });
42    }
43
44    // ============== FOLDING VERIFICATION =========================================================
45
46    measure("Folding verification", || {
47        verify_folding(
48            &folding,
49            folding_vp,
50            config.start_ivc_state,
51            config.num_steps as u32,
52        )
53    });
54}
55
56fn main() {
57    let mut rng = rand::rngs::OsRng;
58    let config = ScenarioConfig::new();
59
60    println!("========== Nova folding scheme ==========");
61    scenario::<NovaFolding>(config.clone(), &mut rng);
62
63    println!("========== HyperNova folding scheme ==========");
64    scenario::<HyperNovaFolding>(config, &mut rng);
65}