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}