With verification
Piotr Mikołajczyk piomiko41@gmail.com
Fri, 27 Sep 2024 13:55:08 +0200
5 files changed,
30 insertions(+),
30 deletions(-)
M
Cargo.lock
→
Cargo.lock
@@ -3326,8 +3326,6 @@ version = "0.1.0"
dependencies = [ "ark-bn254 0.4.0", "ark-crypto-primitives", - "ark-ec 0.4.1", - "ark-ff 0.4.1", "ark-groth16", "ark-grumpkin", "ark-serialize 0.4.1",
M
Cargo.toml
→
Cargo.toml
@@ -7,8 +7,6 @@
[dependencies] ark-bn254 = { version = "^0.4.0", features = ["r1cs"] } ark-crypto-primitives = { version = "0.4.0" } -ark-ec = { version = "0.4.0" } -ark-ff = { version = "0.4.0" } ark-grumpkin = { version = "0.4.0", features = ["r1cs"] } ark-groth16 = { version = "0.4.0", features = ["parallel"] } ark-serialize = { version = "0.4.0" }
M
src/folding.rs
→
src/folding.rs
@@ -1,13 +1,12 @@
-use ark_bn254::{constraints::GVar, Bn254, Fr, G1Projective as G1}; +use ark_bn254::{Bn254, constraints::GVar, Fr, G1Projective as G1}; use ark_crypto_primitives::sponge::poseidon::PoseidonConfig; use ark_grumpkin::{constraints::GVar as GVar2, Projective as G2}; -use rand::rngs::OsRng; use sonobe::{ commitment::{kzg::KZG, pedersen::Pedersen}, folding::{hypernova::HyperNova, nova::Nova}, + FoldingScheme, frontend::circom::CircomFCircuit, transcript::poseidon::poseidon_canonical_config, - FoldingScheme, }; pub type NovaFolding =@@ -24,8 +23,6 @@ 1,
1, false, >; - -pub type VerifierParam<FS> = <FS as FoldingScheme<G1, G2, CircomFCircuit<Fr>>>::VerifierParam; pub trait FoldingSchemeExt: FoldingScheme<G1, G2, CircomFCircuit<Fr>> { fn prepreprocess(@@ -55,7 +52,7 @@
pub fn prepare_folding<FS: FoldingSchemeExt>( circuit: &CircomFCircuit<Fr>, start_ivc_state: Vec<Fr>, - rng: &mut OsRng, + rng: &mut impl rand::RngCore, ) -> (FS, FS::VerifierParam) { let preprocess_params = FS::prepreprocess(poseidon_canonical_config::<Fr>(), circuit.clone()); let params =@@ -66,14 +63,14 @@
(folding, params.1) } -pub fn verify_folding( - folding: &NovaFolding, - folding_vp: VerifierParam<NovaFolding>, +pub fn verify_folding<FS: FoldingSchemeExt>( + folding: &FS, + folding_vp: FS::VerifierParam, start_ivc_state: Vec<Fr>, num_steps: u32, ) { let (running_instance, incoming_instance, cyclefold_instance) = folding.instances(); - NovaFolding::verify( + FS::verify( folding_vp, start_ivc_state, folding.state(),
M
src/main.rs
→
src/main.rs
@@ -1,7 +1,6 @@
use std::time::Instant; use scenario_config::ScenarioConfig; -use sonobe::FoldingScheme; use crate::folding::{ prepare_folding, verify_folding, FoldingSchemeExt, HyperNovaFolding, NovaFolding,@@ -19,35 +18,42 @@ mod folding;
mod input; mod scenario_config; -fn scenario<FS: FoldingSchemeExt>() { - let mut rng = rand::rngs::OsRng; - let config = ScenarioConfig::new(); +fn scenario<FS: FoldingSchemeExt>(config: ScenarioConfig, rng: &mut impl rand::RngCore) { + + // ============== FOLDING PREPARATION ========================================================== let (mut folding, folding_vp) = measure("Prepare folding", || { - prepare_folding::<FS>(&config.circuit, config.start_ivc_state.clone(), &mut rng) + prepare_folding::<FS>(&config.circuit, config.start_ivc_state.clone(), rng) }); + // ============== FOLDING ====================================================================== + for (i, external_inputs_at_step) in config.input().iter().enumerate() { measure(&format!("Prove_step {i}"), || { folding - .prove_step(rng, external_inputs_at_step.clone(), None) + .prove_step(&mut *rng, external_inputs_at_step.clone(), None) .expect("Failed to prove step") }); } - // measure("Folding verification", || { - // verify_folding( - // &folding, - // folding_vp, - // config.start_ivc_state, - // config.num_steps as u32, - // ) - // }); + // ============== FOLDING VERIFICATION ========================================================= + + measure("Folding verification", || { + verify_folding( + &folding, + folding_vp, + config.start_ivc_state, + config.num_steps as u32, + ) + }); } fn main() { + let mut rng = rand::rngs::OsRng; + let config = ScenarioConfig::new(); + println!("========== Nova folding scheme =========="); - scenario::<NovaFolding>(); + scenario::<NovaFolding>(config.clone(), &mut rng); println!("========== HyperNova folding scheme =========="); - scenario::<HyperNovaFolding>(); + scenario::<HyperNovaFolding>(config, &mut rng); }
M
src/scenario_config.rs
→
src/scenario_config.rs
@@ -4,6 +4,7 @@ use sonobe::frontend::circom::CircomFCircuit;
use crate::{circuit::create_circuit, input::prepare_input, measure}; +#[derive(Clone)] pub struct ScenarioConfig { pub num_steps: usize, pub start_ivc_state: Vec<Fr>,