Browse Source

Woohoo - multifolding works!

main
Piotr Mikołajczyk 6 months ago
parent
commit
93041985cf
No known key found for this signature in database GPG Key ID: 7ADA31326DE28EC7
4 changed files with 45 additions and 35 deletions
  1. +26
    -29
      README.md
  2. +15
    -2
      src/folding.rs
  3. +1
    -1
      src/main.rs
  4. +3
    -3
      src/scenario_config.rs

+ 26
- 29
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
```

+ 15
- 2
src/folding.rs

@ -31,6 +31,8 @@ pub struct StepInput {
}
pub trait FoldingSchemeExt: FoldingScheme<G1, G2, CircomFCircuit<Fr>> {
fn num_steps(num_inputs: usize) -> usize;
fn prepreprocess(
poseidon_config: PoseidonConfig<Fr>,
circuit: CircomFCircuit<Fr>,
@ -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<Fr>,
circuit: CircomFCircuit<Fr>,
@ -69,6 +76,12 @@ impl FoldingSchemeExt for NovaFolding {
}
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(
poseidon_config: PoseidonConfig<Fr>,
circuit: CircomFCircuit<Fr>,
@ -144,14 +157,14 @@ pub fn verify_folding(
folding: &FS,
folding_vp: FS::VerifierParam,
start_ivc_state: Vec<Fr>,
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,

+ 1
- 1
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,
)
});
}

+ 3
- 3
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<Fr>,
pub circuit: CircomFCircuit<Fr>,
input: Vec<Vec<Fr>>,
@ -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<Fr>] {
&self.input[..self.num_steps]
&self.input[..self.num_inputs]
}
}

Loading…
Cancel
Save