mirror of
https://github.com/arnaucube/sonobe-playground.git
synced 2026-01-13 17:41:28 +01:00
folding verification
This commit is contained in:
@@ -1,25 +1,49 @@
|
|||||||
use ark_bn254::{Bn254, constraints::GVar, Fr, G1Projective as G1};
|
use ark_bn254::{constraints::GVar, Bn254, Fr, G1Projective as G1};
|
||||||
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 rand::rngs::OsRng;
|
||||||
use sonobe::{
|
use sonobe::{
|
||||||
commitment::{kzg::KZG, pedersen::Pedersen},
|
commitment::{kzg::KZG, pedersen::Pedersen},
|
||||||
folding::nova::{Nova, PreprocessorParam},
|
folding::nova::{Nova, PreprocessorParam},
|
||||||
FoldingScheme,
|
|
||||||
frontend::circom::CircomFCircuit,
|
frontend::circom::CircomFCircuit,
|
||||||
transcript::poseidon::poseidon_canonical_config,
|
transcript::poseidon::poseidon_canonical_config,
|
||||||
|
FoldingScheme,
|
||||||
};
|
};
|
||||||
|
|
||||||
pub type NovaFolding =
|
pub type NovaFolding =
|
||||||
Nova<G1, GVar, G2, GVar2, CircomFCircuit<Fr>, KZG<'static, Bn254>, Pedersen<G2>, false>;
|
Nova<G1, GVar, G2, GVar2, CircomFCircuit<Fr>, KZG<'static, Bn254>, Pedersen<G2>, false>;
|
||||||
|
pub type NovaVerifierParam =
|
||||||
|
<NovaFolding as FoldingScheme<G1, G2, CircomFCircuit<Fr>>>::VerifierParam;
|
||||||
|
|
||||||
pub fn prepare_folding(
|
pub fn prepare_folding(
|
||||||
circuit: &CircomFCircuit<Fr>,
|
circuit: &CircomFCircuit<Fr>,
|
||||||
start_ivc_state: Vec<Fr>,
|
start_ivc_state: Vec<Fr>,
|
||||||
rng: &mut OsRng,
|
rng: &mut OsRng,
|
||||||
) -> NovaFolding {
|
) -> (NovaFolding, NovaVerifierParam) {
|
||||||
let nova_preprocess_params =
|
let nova_preprocess_params =
|
||||||
PreprocessorParam::new(poseidon_canonical_config::<Fr>(), circuit.clone());
|
PreprocessorParam::new(poseidon_canonical_config::<Fr>(), circuit.clone());
|
||||||
let nova_params = NovaFolding::preprocess(&mut *rng, &nova_preprocess_params)
|
let nova_params = NovaFolding::preprocess(&mut *rng, &nova_preprocess_params)
|
||||||
.expect("Failed to preprocess Nova");
|
.expect("Failed to preprocess Nova");
|
||||||
NovaFolding::init(&nova_params, circuit.clone(), start_ivc_state).expect("Failed to init Nova")
|
let folding = NovaFolding::init(&nova_params, circuit.clone(), start_ivc_state)
|
||||||
|
.expect("Failed to init Nova");
|
||||||
|
|
||||||
|
(folding, nova_params.1)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn verify_folding(
|
||||||
|
folding: &NovaFolding,
|
||||||
|
folding_vp: NovaVerifierParam,
|
||||||
|
start_ivc_state: Vec<Fr>,
|
||||||
|
num_steps: u32,
|
||||||
|
) {
|
||||||
|
let (running_instance, incoming_instance, cyclefold_instance) = folding.instances();
|
||||||
|
NovaFolding::verify(
|
||||||
|
folding_vp,
|
||||||
|
start_ivc_state,
|
||||||
|
folding.state(),
|
||||||
|
Fr::from(num_steps),
|
||||||
|
running_instance,
|
||||||
|
incoming_instance,
|
||||||
|
cyclefold_instance,
|
||||||
|
)
|
||||||
|
.expect("Failed to verify folded proof");
|
||||||
}
|
}
|
||||||
|
|||||||
18
src/main.rs
18
src/main.rs
@@ -3,8 +3,11 @@ use std::time::Instant;
|
|||||||
use ark_bn254::Fr;
|
use ark_bn254::Fr;
|
||||||
use num_traits::identities::Zero;
|
use num_traits::identities::Zero;
|
||||||
use sonobe::FoldingScheme;
|
use sonobe::FoldingScheme;
|
||||||
|
use crate::{
|
||||||
use crate::{circuit::create_circuit, folding::prepare_folding, input::prepare_input};
|
circuit::create_circuit,
|
||||||
|
folding::{prepare_folding, verify_folding},
|
||||||
|
input::prepare_input,
|
||||||
|
};
|
||||||
|
|
||||||
fn measure<T, Action: FnOnce() -> T>(action_name: &str, action: Action) -> T {
|
fn measure<T, Action: FnOnce() -> T>(action_name: &str, action: Action) -> T {
|
||||||
let start = Instant::now();
|
let start = Instant::now();
|
||||||
@@ -23,15 +26,20 @@ fn main() {
|
|||||||
let circuit = measure("Prepare circuit", create_circuit);
|
let circuit = measure("Prepare circuit", create_circuit);
|
||||||
|
|
||||||
let start_ivc_state = vec![Fr::zero(); 2];
|
let start_ivc_state = vec![Fr::zero(); 2];
|
||||||
let mut folding = measure("Prepare folding", || {
|
let (mut folding, folding_vp) = measure("Prepare folding", || {
|
||||||
prepare_folding(&circuit, start_ivc_state, &mut rng)
|
prepare_folding(&circuit, start_ivc_state.clone(), &mut rng)
|
||||||
});
|
});
|
||||||
|
|
||||||
for (i, external_inputs_at_step) in prepare_input()[..5].iter().enumerate() {
|
let num_steps = 5;
|
||||||
|
for (i, external_inputs_at_step) in prepare_input()[..num_steps].iter().enumerate() {
|
||||||
measure(&format!("Nova::prove_step {i}"), || {
|
measure(&format!("Nova::prove_step {i}"), || {
|
||||||
folding
|
folding
|
||||||
.prove_step(rng, external_inputs_at_step.clone(), None)
|
.prove_step(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, start_ivc_state, num_steps as u32)
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user