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
 9fn measure<T, Action: FnOnce() -> T>(action_name: &str, action: Action) -> T {
10    let start = Instant::now();
11    let result = action();
12    println!("{action_name}: {:?}", start.elapsed());
13    result
14}
15
16mod circuit;
17mod folding;
18mod input;
19mod scenario_config;
20
21fn scenario<FS: FoldingSchemeExt>(config: ScenarioConfig, rng: &mut impl rand::RngCore) {
22
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    for (i, external_inputs_at_step) in config.input().iter().enumerate() {
32        measure(&format!("Prove_step {i}"), || {
33            folding
34                .prove_step(&mut *rng, external_inputs_at_step.clone(), None)
35                .expect("Failed to prove step")
36        });
37    }
38
39    // ============== FOLDING VERIFICATION =========================================================
40
41    measure("Folding verification", || {
42        verify_folding(
43            &folding,
44            folding_vp,
45            config.start_ivc_state,
46            config.num_steps as u32,
47        )
48    });
49}
50
51fn main() {
52    let mut rng = rand::rngs::OsRng;
53    let config = ScenarioConfig::new();
54
55    println!("========== Nova folding scheme ==========");
56    scenario::<NovaFolding>(config.clone(), &mut rng);
57    println!("========== HyperNova folding scheme ==========");
58    scenario::<HyperNovaFolding>(config, &mut rng);
59}