mirror of
https://github.com/arnaucube/sonobe-playground.git
synced 2026-01-13 17:41:28 +01:00
Woohoo - multifolding works!
This commit is contained in:
55
README.md
55
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
|
||||
```
|
||||
|
||||
@@ -31,6 +31,8 @@ pub struct StepInput<OtherInstances> {
|
||||
}
|
||||
|
||||
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<G1, G2, CircomFCircuit<Fr>> {
|
||||
}
|
||||
|
||||
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<FS: FoldingSchemeExt>(
|
||||
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,
|
||||
|
||||
@@ -51,7 +51,7 @@ fn scenario<FS: FoldingSchemeExt>(config: ScenarioConfig, rng: &mut impl rand::R
|
||||
&folding,
|
||||
folding_vp,
|
||||
config.start_ivc_state,
|
||||
config.num_steps as u32,
|
||||
config.num_inputs,
|
||||
)
|
||||
});
|
||||
}
|
||||
|
||||
@@ -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]
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user