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    prepare_folding, verify_folding, FoldingSchemeExt, HyperNovaFolding, NovaFolding,
 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 start_state = config.start_ivc_state.clone();
26    let (mut folding, folding_vp) = measure("Prepare folding", || {
27        prepare_folding::<FS>(&config.circuit, start_state.clone(), rng)
28    });
29
30    // ============== FOLDING ======================================================================
31
32    let input = measure("Transform input", || {
33        folding.transform_inputs(config.input().to_vec(), start_state.clone(), &mut *rng)
34    });
35    for (i, step_input) in input.into_iter().enumerate() {
36        measure(&format!("Prove_step {i}"), || {
37            folding
38                .prove_step(
39                    &mut *rng,
40                    step_input.external_inputs,
41                    step_input.other_instances,
42                )
43                .expect("Failed to prove step")
44        });
45    }
46
47    // ============== FOLDING VERIFICATION =========================================================
48
49    measure("Folding verification", || {
50        verify_folding(
51            &folding,
52            folding_vp,
53            config.start_ivc_state,
54            config.num_inputs,
55        )
56    });
57}
58
59fn main() {
60    let mut rng = rand::rngs::OsRng;
61    let config = ScenarioConfig::new();
62
63    println!("========== Nova folding scheme ====================");
64    scenario::<NovaFolding>(config.clone(), &mut rng);
65
66    println!("========== HyperNova<1,1> folding scheme ==========");
67    scenario::<HyperNovaFolding<1, 1>>(config.clone(), &mut rng);
68
69    println!("========== HyperNova<2,2> folding scheme ==========");
70    scenario::<HyperNovaFolding<2, 2>>(config, &mut rng);
71}