diff --git a/README.md b/README.md index 4d0ded3..7619032 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ - ✅ Nova folding - ✅ HyperNova folding without multifolding (μ = ν = 0) -- ❌ HyperNova multifolding (μ = ν = 1) +- ✅ HyperNova multifolding (μ = ν = 1) ## Reproduce @@ -18,35 +18,32 @@ make run _12th Gen Intel® Core™ i7-12800H × 20, 32Gb RAM_ ``` -Prepare circuit: 62.569µs -Prepare input: 12.271114ms +Prepare circuit: 386.733µs +Prepare input: 9.041434ms ========== Nova folding scheme ==================== -Prepare folding: 1.038241793s -Transform input: 293.007µs -Prove_step 0: 186.297898ms -Prove_step 1: 216.137291ms -Prove_step 2: 244.387123ms -Prove_step 3: 253.724876ms -Prove_step 4: 249.476304ms -Prove_step 5: 254.825831ms -Folding verification: 15.513019ms +Prepare folding: 1.042210402s +Transform input: 352.973µs +Prove_step 0: 188.311556ms +Prove_step 1: 201.33003ms +Prove_step 2: 256.05521ms +Prove_step 3: 282.359763ms +Prove_step 4: 252.831315ms +Prove_step 5: 255.913864ms +Folding verification: 16.793244ms ========== HyperNova<1,1> folding scheme ========== -Prepare folding: 2.125681209s -Transform input: 221.36µs -Prove_step 0: 765.455805ms -Prove_step 1: 848.616158ms -Prove_step 2: 833.972256ms -Prove_step 3: 864.703408ms -Prove_step 4: 844.404617ms -Prove_step 5: 865.9787ms -Folding verification: 31.417487ms +Prepare folding: 2.065175679s +Transform input: 212.792µs +Prove_step 0: 796.910579ms +Prove_step 1: 853.848474ms +Prove_step 2: 930.1784ms +Prove_step 3: 872.190521ms +Prove_step 4: 910.903061ms +Prove_step 5: 939.589533ms +Folding verification: 29.238423ms ========== HyperNova<2,2> folding scheme ========== -Prepare folding: 2.843266713s -Transform input: 3.922030432s -Prove_step 0: 995.358483ms -Prove_step 1: 1.209482586s -thread 'main' panicked at src/folding.rs:159:6: -Failed to verify folded proof: IVCVerificationFail -note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace -make: *** [Makefile:17: run] Error 101 +Prepare folding: 2.995732852s +Transform input: 3.9520013s +Prove_step 0: 966.629701ms +Prove_step 1: 1.22535041s +Folding verification: 33.430805ms ``` diff --git a/src/folding.rs b/src/folding.rs index 43157d2..16733b7 100644 --- a/src/folding.rs +++ b/src/folding.rs @@ -31,6 +31,8 @@ pub struct StepInput { } pub trait FoldingSchemeExt: FoldingScheme> { + fn num_steps(num_inputs: usize) -> usize; + fn prepreprocess( poseidon_config: PoseidonConfig, circuit: CircomFCircuit, @@ -45,6 +47,11 @@ pub trait FoldingSchemeExt: FoldingScheme> { } impl FoldingSchemeExt for NovaFolding { + fn num_steps(num_inputs: usize) -> usize { + num_inputs // no multifolding + } + + fn prepreprocess( poseidon_config: PoseidonConfig, circuit: CircomFCircuit, @@ -69,6 +76,12 @@ impl FoldingSchemeExt for NovaFolding { } impl FoldingSchemeExt for HyperNovaFolding { + fn num_steps(num_inputs: usize) -> usize { + let per_step = M + N - 1; + assert_eq!(num_inputs % per_step, 0); + num_inputs / per_step + } + fn prepreprocess( poseidon_config: PoseidonConfig, circuit: CircomFCircuit, @@ -144,14 +157,14 @@ pub fn verify_folding( folding: &FS, folding_vp: FS::VerifierParam, start_ivc_state: Vec, - num_steps: u32, + num_inputs: usize, ) { let (running_instance, incoming_instance, cyclefold_instance) = folding.instances(); FS::verify( folding_vp, start_ivc_state, folding.state(), - Fr::from(num_steps), + Fr::from(FS::num_steps(num_inputs) as u32), running_instance, incoming_instance, cyclefold_instance, diff --git a/src/main.rs b/src/main.rs index c69f089..f8f3274 100644 --- a/src/main.rs +++ b/src/main.rs @@ -51,7 +51,7 @@ fn scenario(config: ScenarioConfig, rng: &mut impl rand::R &folding, folding_vp, config.start_ivc_state, - config.num_steps as u32, + config.num_inputs, ) }); } diff --git a/src/scenario_config.rs b/src/scenario_config.rs index 6d3c7d1..e4311a4 100644 --- a/src/scenario_config.rs +++ b/src/scenario_config.rs @@ -6,7 +6,7 @@ use crate::{circuit::create_circuit, input::prepare_input, measure}; #[derive(Clone)] pub struct ScenarioConfig { - pub num_steps: usize, + pub num_inputs: usize, pub start_ivc_state: Vec, pub circuit: CircomFCircuit, input: Vec>, @@ -15,7 +15,7 @@ pub struct ScenarioConfig { impl ScenarioConfig { pub fn new() -> Self { Self { - num_steps: 6, + num_inputs: 6, start_ivc_state: vec![Fr::zero(); 2], circuit: measure("Prepare circuit", create_circuit), input: measure("Prepare input", prepare_input), @@ -23,6 +23,6 @@ impl ScenarioConfig { } pub fn input(&self) -> &[Vec] { - &self.input[..self.num_steps] + &self.input[..self.num_inputs] } }