arnaucube
arnaucube/sonobe-playgroundPublic Self-hosted repository
Common inputs
Piotr Mikołajczyk piomiko41@gmail.com
Wed, 02 Oct 2024 11:07:24 +0200
commit

82b20639be9abde77042a42ff3c98ddc36da7d72

parent

aeb9919e0127d2d67f99da955166bee5cb0393d2

3 files changed, 48 insertions(+), 11 deletions(-)

jump to
M Makefile → Makefile

@@ -11,3 +11,7 @@

.PHONY: clear-circuit-artifacts clear-circuit-artifacts: # Clear the circuit artifacts @rm -rf circuit/grayscale_step_js circuit/grayscale_step.r1cs + +.PHONY: run +run: # Run the experiment + @cargo run --release
M src/folding.rs → src/folding.rs

@@ -1,12 +1,12 @@

-use ark_bn254::{Bn254, constraints::GVar, Fr, G1Projective as G1}; +use ark_bn254::{constraints::GVar, Bn254, Fr, G1Projective as G1}; use ark_crypto_primitives::sponge::poseidon::PoseidonConfig; use ark_grumpkin::{constraints::GVar as GVar2, Projective as G2}; 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,11 +24,20 @@ 1,

false, >; +pub struct StepInput<OtherInstances> { + pub external_inputs: Vec<Fr>, + pub other_instances: Option<OtherInstances>, +} + pub trait FoldingSchemeExt: FoldingScheme<G1, G2, CircomFCircuit<Fr>> { fn prepreprocess( poseidon_config: PoseidonConfig<Fr>, circuit: CircomFCircuit<Fr>, ) -> Self::PreprocessorParam; + + fn transform_inputs( + full_input: Vec<Vec<Fr>>, + ) -> impl Iterator<Item = StepInput<Self::MultiCommittedInstanceWithWitness>>; } impl FoldingSchemeExt for NovaFolding {

@@ -38,6 +47,15 @@ circuit: CircomFCircuit<Fr>,

) -> Self::PreprocessorParam { Self::PreprocessorParam::new(poseidon_config, circuit) } + + fn transform_inputs( + full_input: Vec<Vec<Fr>>, + ) -> impl Iterator<Item = StepInput<Self::MultiCommittedInstanceWithWitness>> { + full_input.into_iter().map(|input| StepInput { + external_inputs: input, + other_instances: None, + }) + } } impl FoldingSchemeExt for HyperNovaFolding {

@@ -46,6 +64,15 @@ poseidon_config: PoseidonConfig<Fr>,

circuit: CircomFCircuit<Fr>, ) -> Self::PreprocessorParam { Self::PreprocessorParam::new(poseidon_config, circuit) + } + + fn transform_inputs( + full_input: Vec<Vec<Fr>>, + ) -> impl Iterator<Item = StepInput<Self::MultiCommittedInstanceWithWitness>> { + full_input.into_iter().map(|input| StepInput { + external_inputs: input, + other_instances: Some((vec![], vec![])), + }) } }
M src/main.rs → src/main.rs

@@ -3,8 +3,14 @@

use scenario_config::ScenarioConfig; use crate::folding::{ - prepare_folding, verify_folding, FoldingSchemeExt, HyperNovaFolding, NovaFolding, + FoldingSchemeExt, HyperNovaFolding, NovaFolding, prepare_folding, verify_folding, }; + +mod circuit; + +mod folding; +mod input; +mod scenario_config; fn measure<T, Action: FnOnce() -> T>(action_name: &str, action: Action) -> T { let start = Instant::now();

@@ -13,13 +19,7 @@ println!("{action_name}: {:?}", start.elapsed());

result } -mod circuit; -mod folding; -mod input; -mod scenario_config; - fn scenario<FS: FoldingSchemeExt>(config: ScenarioConfig, rng: &mut impl rand::RngCore) { - // ============== FOLDING PREPARATION ========================================================== let (mut folding, folding_vp) = measure("Prepare folding", || {

@@ -28,10 +28,15 @@ });

// ============== FOLDING ====================================================================== - for (i, external_inputs_at_step) in config.input().iter().enumerate() { + let input = config.input().to_vec(); + for (i, step_input) in FS::transform_inputs(input).enumerate() { measure(&format!("Prove_step {i}"), || { folding - .prove_step(&mut *rng, external_inputs_at_step.clone(), None) + .prove_step( + &mut *rng, + step_input.external_inputs, + step_input.other_instances, + ) .expect("Failed to prove step") }); }

@@ -54,6 +59,7 @@ let config = ScenarioConfig::new();

println!("========== Nova folding scheme =========="); scenario::<NovaFolding>(config.clone(), &mut rng); + println!("========== HyperNova folding scheme =========="); scenario::<HyperNovaFolding>(config, &mut rng); }