mirror of
https://github.com/arnaucube/sonobe-playground.git
synced 2026-01-14 10:01:30 +01:00
With verification
This commit is contained in:
2
Cargo.lock
generated
2
Cargo.lock
generated
@@ -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",
|
||||||
|
|||||||
@@ -7,8 +7,6 @@ authors = ["Piotr Mikołajczyk <piomiko41@gmail.com>"]
|
|||||||
[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" }
|
||||||
|
|||||||
@@ -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<FS: FoldingSchemeExt>(
|
|||||||
(folding, params.1)
|
(folding, params.1)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn verify_folding(
|
pub fn verify_folding<FS: FoldingSchemeExt>(
|
||||||
folding: &NovaFolding,
|
folding: &FS,
|
||||||
folding_vp: VerifierParam<NovaFolding>,
|
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(),
|
||||||
|
|||||||
38
src/main.rs
38
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>() {
|
fn scenario<FS: FoldingSchemeExt>(config: ScenarioConfig, rng: &mut impl rand::RngCore) {
|
||||||
let mut rng = rand::rngs::OsRng;
|
|
||||||
let config = ScenarioConfig::new();
|
// ============== 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", || {
|
// ============== FOLDING VERIFICATION =========================================================
|
||||||
// verify_folding(
|
|
||||||
// &folding,
|
measure("Folding verification", || {
|
||||||
// folding_vp,
|
verify_folding(
|
||||||
// config.start_ivc_state,
|
&folding,
|
||||||
// config.num_steps as u32,
|
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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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>,
|
||||||
|
|||||||
Reference in New Issue
Block a user