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

@@ -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,

View File

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

View File

@@ -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]
}
}