Browse Source

With verification

main
Piotr Mikołajczyk 6 months ago
parent
commit
aeb9919e01
No known key found for this signature in database GPG Key ID: 7ADA31326DE28EC7
5 changed files with 30 additions and 30 deletions
  1. +0
    -2
      Cargo.lock
  2. +0
    -2
      Cargo.toml
  3. +7
    -10
      src/folding.rs
  4. +22
    -16
      src/main.rs
  5. +1
    -0
      src/scenario_config.rs

+ 0
- 2
Cargo.lock

@ -3326,8 +3326,6 @@ version = "0.1.0"
dependencies = [ dependencies = [
"ark-bn254 0.4.0", "ark-bn254 0.4.0",
"ark-crypto-primitives", "ark-crypto-primitives",
"ark-ec 0.4.1",
"ark-ff 0.4.1",
"ark-groth16", "ark-groth16",
"ark-grumpkin", "ark-grumpkin",
"ark-serialize 0.4.1", "ark-serialize 0.4.1",

+ 0
- 2
Cargo.toml

@ -7,8 +7,6 @@ authors = ["Piotr Mikołajczyk "]
[dependencies] [dependencies]
ark-bn254 = { version = "^0.4.0", features = ["r1cs"] } ark-bn254 = { version = "^0.4.0", features = ["r1cs"] }
ark-crypto-primitives = { version = "0.4.0" } 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-grumpkin = { version = "0.4.0", features = ["r1cs"] }
ark-groth16 = { version = "0.4.0", features = ["parallel"] } ark-groth16 = { version = "0.4.0", features = ["parallel"] }
ark-serialize = { version = "0.4.0" } ark-serialize = { version = "0.4.0" }

+ 7
- 10
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_crypto_primitives::sponge::poseidon::PoseidonConfig;
use ark_grumpkin::{constraints::GVar as GVar2, Projective as G2}; use ark_grumpkin::{constraints::GVar as GVar2, Projective as G2};
use rand::rngs::OsRng;
use sonobe::{ use sonobe::{
commitment::{kzg::KZG, pedersen::Pedersen}, commitment::{kzg::KZG, pedersen::Pedersen},
folding::{hypernova::HyperNova, nova::Nova}, folding::{hypernova::HyperNova, nova::Nova},
FoldingScheme,
frontend::circom::CircomFCircuit, frontend::circom::CircomFCircuit,
transcript::poseidon::poseidon_canonical_config, transcript::poseidon::poseidon_canonical_config,
FoldingScheme,
}; };
pub type NovaFolding = pub type NovaFolding =
@ -25,8 +24,6 @@ pub type HyperNovaFolding = HyperNova<
false, false,
>; >;
pub type VerifierParam<FS> = <FS as FoldingScheme<G1, G2, CircomFCircuit<Fr>>>::VerifierParam;
pub trait FoldingSchemeExt: FoldingScheme<G1, G2, CircomFCircuit<Fr>> { pub trait FoldingSchemeExt: FoldingScheme<G1, G2, CircomFCircuit<Fr>> {
fn prepreprocess( fn prepreprocess(
poseidon_config: PoseidonConfig<Fr>, poseidon_config: PoseidonConfig<Fr>,
@ -55,7 +52,7 @@ impl FoldingSchemeExt for HyperNovaFolding {
pub fn prepare_folding<FS: FoldingSchemeExt>( pub fn prepare_folding<FS: FoldingSchemeExt>(
circuit: &CircomFCircuit<Fr>, circuit: &CircomFCircuit<Fr>,
start_ivc_state: Vec<Fr>, start_ivc_state: Vec<Fr>,
rng: &mut OsRng,
rng: &mut impl rand::RngCore,
) -> (FS, FS::VerifierParam) { ) -> (FS, FS::VerifierParam) {
let preprocess_params = FS::prepreprocess(poseidon_canonical_config::<Fr>(), circuit.clone()); let preprocess_params = FS::prepreprocess(poseidon_canonical_config::<Fr>(), circuit.clone());
let params = let params =
@ -66,14 +63,14 @@ pub fn prepare_folding(
(folding, params.1) (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>, start_ivc_state: Vec<Fr>,
num_steps: u32, num_steps: u32,
) { ) {
let (running_instance, incoming_instance, cyclefold_instance) = folding.instances(); let (running_instance, incoming_instance, cyclefold_instance) = folding.instances();
NovaFolding::verify(
FS::verify(
folding_vp, folding_vp,
start_ivc_state, start_ivc_state,
folding.state(), folding.state(),

+ 22
- 16
src/main.rs

@ -1,7 +1,6 @@
use std::time::Instant; use std::time::Instant;
use scenario_config::ScenarioConfig; use scenario_config::ScenarioConfig;
use sonobe::FoldingScheme;
use crate::folding::{ use crate::folding::{
prepare_folding, verify_folding, FoldingSchemeExt, HyperNovaFolding, NovaFolding, prepare_folding, verify_folding, FoldingSchemeExt, HyperNovaFolding, NovaFolding,
@ -19,35 +18,42 @@ mod folding;
mod input; mod input;
mod scenario_config; 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", || { 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() { for (i, external_inputs_at_step) in config.input().iter().enumerate() {
measure(&format!("Prove_step {i}"), || { measure(&format!("Prove_step {i}"), || {
folding 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") .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() { fn main() {
let mut rng = rand::rngs::OsRng;
let config = ScenarioConfig::new();
println!("========== Nova folding scheme =========="); println!("========== Nova folding scheme ==========");
scenario::<NovaFolding>();
scenario::<NovaFolding>(config.clone(), &mut rng);
println!("========== HyperNova folding scheme =========="); println!("========== HyperNova folding scheme ==========");
scenario::<HyperNovaFolding>();
scenario::<HyperNovaFolding>(config, &mut rng);
} }

+ 1
- 0
src/scenario_config.rs

@ -4,6 +4,7 @@ use sonobe::frontend::circom::CircomFCircuit;
use crate::{circuit::create_circuit, input::prepare_input, measure}; use crate::{circuit::create_circuit, input::prepare_input, measure};
#[derive(Clone)]
pub struct ScenarioConfig { pub struct ScenarioConfig {
pub num_steps: usize, pub num_steps: usize,
pub start_ivc_state: Vec<Fr>, pub start_ivc_state: Vec<Fr>,

Loading…
Cancel
Save