From aeb9919e0127d2d67f99da955166bee5cb0393d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Piotr=20Miko=C5=82ajczyk?= Date: Fri, 27 Sep 2024 13:55:08 +0200 Subject: [PATCH] With verification --- Cargo.lock | 2 -- Cargo.toml | 2 -- src/folding.rs | 17 +++++++---------- src/main.rs | 38 ++++++++++++++++++++++---------------- src/scenario_config.rs | 1 + 5 files changed, 30 insertions(+), 30 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 7d79c23..7f1ceb9 100644 --- a/Cargo.lock +++ b/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", diff --git a/Cargo.toml b/Cargo.toml index 46022db..57865a2 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -7,8 +7,6 @@ authors = ["Piotr Mikołajczyk "] [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" } diff --git a/src/folding.rs b/src/folding.rs index ca3663c..e018f7d 100644 --- a/src/folding.rs +++ b/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 = @@ -25,8 +24,6 @@ pub type HyperNovaFolding = HyperNova< false, >; -pub type VerifierParam = >>::VerifierParam; - pub trait FoldingSchemeExt: FoldingScheme> { fn prepreprocess( poseidon_config: PoseidonConfig, @@ -55,7 +52,7 @@ impl FoldingSchemeExt for HyperNovaFolding { pub fn prepare_folding( circuit: &CircomFCircuit, start_ivc_state: Vec, - rng: &mut OsRng, + rng: &mut impl rand::RngCore, ) -> (FS, FS::VerifierParam) { let preprocess_params = FS::prepreprocess(poseidon_canonical_config::(), circuit.clone()); let params = @@ -66,14 +63,14 @@ pub fn prepare_folding( (folding, params.1) } -pub fn verify_folding( - folding: &NovaFolding, - folding_vp: VerifierParam, +pub fn verify_folding( + folding: &FS, + folding_vp: FS::VerifierParam, start_ivc_state: Vec, num_steps: u32, ) { let (running_instance, incoming_instance, cyclefold_instance) = folding.instances(); - NovaFolding::verify( + FS::verify( folding_vp, start_ivc_state, folding.state(), diff --git a/src/main.rs b/src/main.rs index 30c12e9..8771a5c 100644 --- a/src/main.rs +++ b/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() { - let mut rng = rand::rngs::OsRng; - let config = ScenarioConfig::new(); +fn scenario(config: ScenarioConfig, rng: &mut impl rand::RngCore) { + + // ============== FOLDING PREPARATION ========================================================== let (mut folding, folding_vp) = measure("Prepare folding", || { - prepare_folding::(&config.circuit, config.start_ivc_state.clone(), &mut rng) + prepare_folding::(&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::(); + scenario::(config.clone(), &mut rng); println!("========== HyperNova folding scheme =========="); - scenario::(); + scenario::(config, &mut rng); } diff --git a/src/scenario_config.rs b/src/scenario_config.rs index d700ef4..23a0050 100644 --- a/src/scenario_config.rs +++ b/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,