Woohoo - multifolding works!

This commit is contained in:
Piotr Mikołajczyk
2024-10-14 18:11:32 +02:00
parent 29de06397b
commit 93041985cf
4 changed files with 45 additions and 35 deletions

View File

@@ -4,7 +4,7 @@
- ✅ Nova folding - ✅ Nova folding
- ✅ HyperNova folding without multifolding (μ = ν = 0) - ✅ HyperNova folding without multifolding (μ = ν = 0)
- HyperNova multifolding (μ = ν = 1) - HyperNova multifolding (μ = ν = 1)
## Reproduce ## Reproduce
@@ -18,35 +18,32 @@ make run
_12th Gen Intel® Core™ i7-12800H × 20, 32Gb RAM_ _12th Gen Intel® Core™ i7-12800H × 20, 32Gb RAM_
``` ```
Prepare circuit: 62.569µs Prepare circuit: 386.733µs
Prepare input: 12.271114ms Prepare input: 9.041434ms
========== Nova folding scheme ==================== ========== Nova folding scheme ====================
Prepare folding: 1.038241793s Prepare folding: 1.042210402s
Transform input: 293.007µs Transform input: 352.973µs
Prove_step 0: 186.297898ms Prove_step 0: 188.311556ms
Prove_step 1: 216.137291ms Prove_step 1: 201.33003ms
Prove_step 2: 244.387123ms Prove_step 2: 256.05521ms
Prove_step 3: 253.724876ms Prove_step 3: 282.359763ms
Prove_step 4: 249.476304ms Prove_step 4: 252.831315ms
Prove_step 5: 254.825831ms Prove_step 5: 255.913864ms
Folding verification: 15.513019ms Folding verification: 16.793244ms
========== HyperNova<1,1> folding scheme ========== ========== HyperNova<1,1> folding scheme ==========
Prepare folding: 2.125681209s Prepare folding: 2.065175679s
Transform input: 221.36µs Transform input: 212.792µs
Prove_step 0: 765.455805ms Prove_step 0: 796.910579ms
Prove_step 1: 848.616158ms Prove_step 1: 853.848474ms
Prove_step 2: 833.972256ms Prove_step 2: 930.1784ms
Prove_step 3: 864.703408ms Prove_step 3: 872.190521ms
Prove_step 4: 844.404617ms Prove_step 4: 910.903061ms
Prove_step 5: 865.9787ms Prove_step 5: 939.589533ms
Folding verification: 31.417487ms Folding verification: 29.238423ms
========== HyperNova<2,2> folding scheme ========== ========== HyperNova<2,2> folding scheme ==========
Prepare folding: 2.843266713s Prepare folding: 2.995732852s
Transform input: 3.922030432s Transform input: 3.9520013s
Prove_step 0: 995.358483ms Prove_step 0: 966.629701ms
Prove_step 1: 1.209482586s Prove_step 1: 1.22535041s
thread 'main' panicked at src/folding.rs:159:6: Folding verification: 33.430805ms
Failed to verify folded proof: IVCVerificationFail
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
make: *** [Makefile:17: run] Error 101
``` ```

View File

@@ -31,6 +31,8 @@ pub struct StepInput<OtherInstances> {
} }
pub trait FoldingSchemeExt: FoldingScheme<G1, G2, CircomFCircuit<Fr>> { pub trait FoldingSchemeExt: FoldingScheme<G1, G2, CircomFCircuit<Fr>> {
fn num_steps(num_inputs: usize) -> usize;
fn prepreprocess( fn prepreprocess(
poseidon_config: PoseidonConfig<Fr>, poseidon_config: PoseidonConfig<Fr>,
circuit: CircomFCircuit<Fr>, circuit: CircomFCircuit<Fr>,
@@ -45,6 +47,11 @@ pub trait FoldingSchemeExt: FoldingScheme<G1, G2, CircomFCircuit<Fr>> {
} }
impl FoldingSchemeExt for NovaFolding { impl FoldingSchemeExt for NovaFolding {
fn num_steps(num_inputs: usize) -> usize {
num_inputs // no multifolding
}
fn prepreprocess( fn prepreprocess(
poseidon_config: PoseidonConfig<Fr>, poseidon_config: PoseidonConfig<Fr>,
circuit: CircomFCircuit<Fr>, circuit: CircomFCircuit<Fr>,
@@ -69,6 +76,12 @@ impl FoldingSchemeExt for NovaFolding {
} }
impl<const N: usize, const M: usize> FoldingSchemeExt for HyperNovaFolding<N, M> { impl<const N: usize, const M: usize> FoldingSchemeExt for HyperNovaFolding<N, M> {
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( fn prepreprocess(
poseidon_config: PoseidonConfig<Fr>, poseidon_config: PoseidonConfig<Fr>,
circuit: CircomFCircuit<Fr>, circuit: CircomFCircuit<Fr>,
@@ -144,14 +157,14 @@ pub fn verify_folding<FS: FoldingSchemeExt>(
folding: &FS, folding: &FS,
folding_vp: FS::VerifierParam, folding_vp: FS::VerifierParam,
start_ivc_state: Vec<Fr>, start_ivc_state: Vec<Fr>,
num_steps: u32, num_inputs: usize,
) { ) {
let (running_instance, incoming_instance, cyclefold_instance) = folding.instances(); let (running_instance, incoming_instance, cyclefold_instance) = folding.instances();
FS::verify( FS::verify(
folding_vp, folding_vp,
start_ivc_state, start_ivc_state,
folding.state(), folding.state(),
Fr::from(num_steps), Fr::from(FS::num_steps(num_inputs) as u32),
running_instance, running_instance,
incoming_instance, incoming_instance,
cyclefold_instance, cyclefold_instance,

View File

@@ -51,7 +51,7 @@ fn scenario<FS: FoldingSchemeExt>(config: ScenarioConfig, rng: &mut impl rand::R
&folding, &folding,
folding_vp, folding_vp,
config.start_ivc_state, config.start_ivc_state,
config.num_steps as u32, config.num_inputs,
) )
}); });
} }

View File

@@ -6,7 +6,7 @@ use crate::{circuit::create_circuit, input::prepare_input, measure};
#[derive(Clone)] #[derive(Clone)]
pub struct ScenarioConfig { pub struct ScenarioConfig {
pub num_steps: usize, pub num_inputs: usize,
pub start_ivc_state: Vec<Fr>, pub start_ivc_state: Vec<Fr>,
pub circuit: CircomFCircuit<Fr>, pub circuit: CircomFCircuit<Fr>,
input: Vec<Vec<Fr>>, input: Vec<Vec<Fr>>,
@@ -15,7 +15,7 @@ pub struct ScenarioConfig {
impl ScenarioConfig { impl ScenarioConfig {
pub fn new() -> Self { pub fn new() -> Self {
Self { Self {
num_steps: 6, num_inputs: 6,
start_ivc_state: vec![Fr::zero(); 2], start_ivc_state: vec![Fr::zero(); 2],
circuit: measure("Prepare circuit", create_circuit), circuit: measure("Prepare circuit", create_circuit),
input: measure("Prepare input", prepare_input), input: measure("Prepare input", prepare_input),
@@ -23,6 +23,6 @@ impl ScenarioConfig {
} }
pub fn input(&self) -> &[Vec<Fr>] { pub fn input(&self) -> &[Vec<Fr>] {
&self.input[..self.num_steps] &self.input[..self.num_inputs]
} }
} }