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