mirror of
https://github.com/arnaucube/sonobe-playground.git
synced 2026-01-14 01:51:29 +01:00
upgrade to latest Sonobe version
This commit is contained in:
1141
Cargo.lock
generated
1141
Cargo.lock
generated
File diff suppressed because it is too large
Load Diff
18
Cargo.toml
18
Cargo.toml
@@ -5,20 +5,16 @@ edition = "2021"
|
|||||||
authors = ["Piotr Mikołajczyk <piomiko41@gmail.com>"]
|
authors = ["Piotr Mikołajczyk <piomiko41@gmail.com>"]
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
ark-bn254 = { version = "^0.4.0", features = ["r1cs"] }
|
ark-bn254 = { version = "^0.5.0", features = ["r1cs"] }
|
||||||
ark-crypto-primitives = { version = "0.4.0" }
|
ark-crypto-primitives = { version = "0.5.0" }
|
||||||
ark-grumpkin = { version = "0.4.0", features = ["r1cs"] }
|
ark-grumpkin = { version = "0.5.0", features = ["r1cs"] }
|
||||||
ark-groth16 = { version = "0.4.0", features = ["parallel"] }
|
ark-groth16 = { version = "0.5.0", features = ["parallel"] }
|
||||||
ark-serialize = { version = "0.4.0" }
|
ark-serialize = { version = "0.5.0" }
|
||||||
itertools = { version = "0.13.0" }
|
itertools = { version = "0.13.0" }
|
||||||
num-traits = { version = "0.2.15" }
|
num-traits = { version = "0.2.15" }
|
||||||
rand = { version = "0.8.5" }
|
rand = { version = "0.8.5" }
|
||||||
tracing = { version = "0.1.26" }
|
tracing = { version = "0.1.26" }
|
||||||
tracing-subscriber = { version = "0.3.18", features = ["fmt", "json", "env-filter"] }
|
tracing-subscriber = { version = "0.3.18", features = ["fmt", "json", "env-filter"] }
|
||||||
|
|
||||||
sonobe = { git = "https://github.com/privacy-scaling-explorations/sonobe", rev = "f1d82418ba047cf90805f2d0505370246df24d68", package = "folding-schemes" }
|
sonobe = { git = "https://github.com/privacy-scaling-explorations/sonobe", rev = "c6f1a246e0705582a75de6becf4ad21f325fa5a1", package = "folding-schemes" }
|
||||||
|
experimental-frontends = { git = "https://github.com/privacy-scaling-explorations/sonobe", rev = "c6f1a246e0705582a75de6becf4ad21f325fa5a1", package = "experimental-frontends" }
|
||||||
[patch.crates-io]
|
|
||||||
ark-r1cs-std = { git = "https://github.com/winderica/r1cs-std", branch = "cherry-pick" }
|
|
||||||
ark-bn254 = { git = "https://github.com/arnaucube/ark-curves-cherry-picked", branch = "cherry-pick" }
|
|
||||||
ark-grumpkin = { git = "https://github.com/arnaucube/ark-curves-cherry-picked", branch = "cherry-pick" }
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
[toolchain]
|
[toolchain]
|
||||||
channel = "1.79"
|
channel = "1.82.0"
|
||||||
components = [ "rustfmt", "clippy", "rust-src" ]
|
components = [ "rustfmt", "clippy", "rust-src" ]
|
||||||
targets = [ "x86_64-unknown-linux-gnu" ]
|
targets = [ "x86_64-unknown-linux-gnu" ]
|
||||||
|
|||||||
@@ -1,12 +1,13 @@
|
|||||||
use std::env::current_dir;
|
use std::env::current_dir;
|
||||||
|
|
||||||
use ark_bn254::Fr;
|
use ark_bn254::Fr;
|
||||||
use sonobe::frontend::{circom::CircomFCircuit, FCircuit};
|
use experimental_frontends::circom::CircomFCircuit;
|
||||||
|
use sonobe::frontend::FCircuit;
|
||||||
|
|
||||||
const IVC_STEP_WIDTH: usize = 2;
|
const IVC_STEP_WIDTH: usize = 2;
|
||||||
const STEP_INPUT_WIDTH: usize = 256;
|
pub(crate) const STEP_INPUT_WIDTH: usize = 256;
|
||||||
|
|
||||||
pub fn create_circuit() -> CircomFCircuit<Fr> {
|
pub fn create_circuit() -> CircomFCircuit<Fr, STEP_INPUT_WIDTH> {
|
||||||
let root = current_dir().expect("Failed to get current directory");
|
let root = current_dir().expect("Failed to get current directory");
|
||||||
let circuit_file = root.join("circuit/grayscale_step.r1cs");
|
let circuit_file = root.join("circuit/grayscale_step.r1cs");
|
||||||
let witness_generator_file = root.join("circuit/grayscale_step_js/grayscale_step.wasm");
|
let witness_generator_file = root.join("circuit/grayscale_step_js/grayscale_step.wasm");
|
||||||
@@ -15,7 +16,6 @@ pub fn create_circuit() -> CircomFCircuit<Fr> {
|
|||||||
circuit_file.into(),
|
circuit_file.into(),
|
||||||
witness_generator_file.into(),
|
witness_generator_file.into(),
|
||||||
IVC_STEP_WIDTH,
|
IVC_STEP_WIDTH,
|
||||||
STEP_INPUT_WIDTH,
|
|
||||||
);
|
);
|
||||||
CircomFCircuit::<Fr>::new(f_circuit_params).expect("Failed to create circuit")
|
CircomFCircuit::<Fr, STEP_INPUT_WIDTH>::new(f_circuit_params).expect("Failed to create circuit")
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,23 +1,23 @@
|
|||||||
use ark_bn254::{constraints::GVar, Bn254, Fr, G1Projective as G1};
|
use ark_bn254::{Bn254, 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::Projective as G2;
|
||||||
|
use experimental_frontends::{circom::CircomFCircuit, utils::VecF};
|
||||||
use sonobe::{
|
use sonobe::{
|
||||||
commitment::{kzg::KZG, pedersen::Pedersen},
|
commitment::{kzg::KZG, pedersen::Pedersen},
|
||||||
folding::{hypernova::HyperNova, nova::Nova},
|
folding::{hypernova::HyperNova, nova::Nova},
|
||||||
frontend::circom::CircomFCircuit,
|
|
||||||
transcript::poseidon::poseidon_canonical_config,
|
transcript::poseidon::poseidon_canonical_config,
|
||||||
Error, FoldingScheme, MultiFolding,
|
Error, FoldingScheme, MultiFolding,
|
||||||
};
|
};
|
||||||
use tracing::info_span;
|
use tracing::info_span;
|
||||||
|
|
||||||
|
use crate::circuit::STEP_INPUT_WIDTH;
|
||||||
|
|
||||||
pub type NovaFolding =
|
pub type NovaFolding =
|
||||||
Nova<G1, GVar, G2, GVar2, CircomFCircuit<Fr>, KZG<'static, Bn254>, Pedersen<G2>, false>;
|
Nova<G1, G2, CircomFCircuit<Fr, STEP_INPUT_WIDTH>, KZG<'static, Bn254>, Pedersen<G2>, false>;
|
||||||
pub type HyperNovaFolding<const M: usize, const N: usize> = HyperNova<
|
pub type HyperNovaFolding<const M: usize, const N: usize> = HyperNova<
|
||||||
G1,
|
G1,
|
||||||
GVar,
|
|
||||||
G2,
|
G2,
|
||||||
GVar2,
|
CircomFCircuit<Fr, STEP_INPUT_WIDTH>,
|
||||||
CircomFCircuit<Fr>,
|
|
||||||
KZG<'static, Bn254>,
|
KZG<'static, Bn254>,
|
||||||
Pedersen<G2>,
|
Pedersen<G2>,
|
||||||
M,
|
M,
|
||||||
@@ -26,11 +26,11 @@ pub type HyperNovaFolding<const M: usize, const N: usize> = HyperNova<
|
|||||||
>;
|
>;
|
||||||
|
|
||||||
pub struct StepInput<OtherInstances> {
|
pub struct StepInput<OtherInstances> {
|
||||||
pub external_inputs: Vec<Fr>,
|
pub external_inputs: VecF<Fr, STEP_INPUT_WIDTH>,
|
||||||
pub other_instances: Option<OtherInstances>,
|
pub other_instances: Option<OtherInstances>,
|
||||||
}
|
}
|
||||||
|
|
||||||
pub trait FoldingSchemeExt: FoldingScheme<G1, G2, CircomFCircuit<Fr>> {
|
pub trait FoldingSchemeExt: FoldingScheme<G1, G2, CircomFCircuit<Fr, STEP_INPUT_WIDTH>> {
|
||||||
const MULTISTEP_SIZE: usize;
|
const MULTISTEP_SIZE: usize;
|
||||||
|
|
||||||
fn num_steps(num_inputs: usize) -> usize {
|
fn num_steps(num_inputs: usize) -> usize {
|
||||||
@@ -40,7 +40,7 @@ pub trait FoldingSchemeExt: FoldingScheme<G1, G2, CircomFCircuit<Fr>> {
|
|||||||
|
|
||||||
fn prepreprocess(
|
fn prepreprocess(
|
||||||
poseidon_config: PoseidonConfig<Fr>,
|
poseidon_config: PoseidonConfig<Fr>,
|
||||||
circuit: CircomFCircuit<Fr>,
|
circuit: CircomFCircuit<Fr, STEP_INPUT_WIDTH>,
|
||||||
) -> Self::PreprocessorParam;
|
) -> Self::PreprocessorParam;
|
||||||
|
|
||||||
fn transform_multi_input(
|
fn transform_multi_input(
|
||||||
@@ -70,7 +70,7 @@ impl FoldingSchemeExt for NovaFolding {
|
|||||||
|
|
||||||
fn prepreprocess(
|
fn prepreprocess(
|
||||||
poseidon_config: PoseidonConfig<Fr>,
|
poseidon_config: PoseidonConfig<Fr>,
|
||||||
circuit: CircomFCircuit<Fr>,
|
circuit: CircomFCircuit<Fr, STEP_INPUT_WIDTH>,
|
||||||
) -> Self::PreprocessorParam {
|
) -> Self::PreprocessorParam {
|
||||||
Self::PreprocessorParam::new(poseidon_config, circuit)
|
Self::PreprocessorParam::new(poseidon_config, circuit)
|
||||||
}
|
}
|
||||||
@@ -83,7 +83,7 @@ impl FoldingSchemeExt for NovaFolding {
|
|||||||
) -> StepInput<Self::MultiCommittedInstanceWithWitness> {
|
) -> StepInput<Self::MultiCommittedInstanceWithWitness> {
|
||||||
assert_eq!(input.len(), 1);
|
assert_eq!(input.len(), 1);
|
||||||
StepInput {
|
StepInput {
|
||||||
external_inputs: input[0].clone(),
|
external_inputs: VecF(input[0].clone()),
|
||||||
other_instances: None,
|
other_instances: None,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -94,7 +94,7 @@ impl<const M: usize, const N: usize> FoldingSchemeExt for HyperNovaFolding<M, N>
|
|||||||
|
|
||||||
fn prepreprocess(
|
fn prepreprocess(
|
||||||
poseidon_config: PoseidonConfig<Fr>,
|
poseidon_config: PoseidonConfig<Fr>,
|
||||||
circuit: CircomFCircuit<Fr>,
|
circuit: CircomFCircuit<Fr, STEP_INPUT_WIDTH>,
|
||||||
) -> Self::PreprocessorParam {
|
) -> Self::PreprocessorParam {
|
||||||
Self::PreprocessorParam::new(poseidon_config, circuit)
|
Self::PreprocessorParam::new(poseidon_config, circuit)
|
||||||
}
|
}
|
||||||
@@ -111,7 +111,7 @@ impl<const M: usize, const N: usize> FoldingSchemeExt for HyperNovaFolding<M, N>
|
|||||||
};
|
};
|
||||||
|
|
||||||
let new_running = |instance| {
|
let new_running = |instance| {
|
||||||
self.new_running_instance(&mut *rng, initial_state.clone(), instance)
|
self.new_running_instance(&mut *rng, initial_state.clone(), VecF(instance))
|
||||||
.expect("Failed to create running instance")
|
.expect("Failed to create running instance")
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -123,20 +123,20 @@ impl<const M: usize, const N: usize> FoldingSchemeExt for HyperNovaFolding<M, N>
|
|||||||
let cccs = incoming
|
let cccs = incoming
|
||||||
.iter()
|
.iter()
|
||||||
.map(|instance| {
|
.map(|instance| {
|
||||||
self.new_incoming_instance(&mut *rng, initial_state.clone(), instance.clone())
|
self.new_incoming_instance(&mut *rng, initial_state.clone(), VecF(instance.clone()))
|
||||||
.expect("Failed to create incoming instance")
|
.expect("Failed to create incoming instance")
|
||||||
})
|
})
|
||||||
.collect();
|
.collect();
|
||||||
|
|
||||||
StepInput {
|
StepInput {
|
||||||
external_inputs: single.clone(),
|
external_inputs: VecF(single.clone()),
|
||||||
other_instances: Some((lcccs, cccs)),
|
other_instances: Some((lcccs, cccs)),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn prepare_folding<FS: FoldingSchemeExt>(
|
pub fn prepare_folding<FS: FoldingSchemeExt>(
|
||||||
circuit: &CircomFCircuit<Fr>,
|
circuit: &CircomFCircuit<Fr, STEP_INPUT_WIDTH>,
|
||||||
start_ivc_state: Vec<Fr>,
|
start_ivc_state: Vec<Fr>,
|
||||||
rng: &mut impl rand::RngCore,
|
rng: &mut impl rand::RngCore,
|
||||||
) -> (FS, FS::VerifierParam) {
|
) -> (FS, FS::VerifierParam) {
|
||||||
@@ -149,21 +149,7 @@ pub fn prepare_folding<FS: FoldingSchemeExt>(
|
|||||||
(folding, params.1)
|
(folding, params.1)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn verify_folding<FS: FoldingSchemeExt>(
|
pub fn verify_folding<FS: FoldingSchemeExt>(folding: &FS, folding_vp: FS::VerifierParam) {
|
||||||
folding: &FS,
|
let ivc_proof = folding.ivc_proof();
|
||||||
folding_vp: FS::VerifierParam,
|
FS::verify(folding_vp, ivc_proof).expect("Failed to verify folded proof");
|
||||||
start_ivc_state: Vec<Fr>,
|
|
||||||
num_inputs: usize,
|
|
||||||
) {
|
|
||||||
let (running_instance, incoming_instance, cyclefold_instance) = folding.instances();
|
|
||||||
FS::verify(
|
|
||||||
folding_vp,
|
|
||||||
start_ivc_state,
|
|
||||||
folding.state(),
|
|
||||||
Fr::from(FS::num_steps(num_inputs) as u32),
|
|
||||||
running_instance,
|
|
||||||
incoming_instance,
|
|
||||||
cyclefold_instance,
|
|
||||||
)
|
|
||||||
.expect("Failed to verify folded proof");
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -37,14 +37,7 @@ fn scenario<FS: FoldingSchemeExt>(
|
|||||||
|
|
||||||
// ============== FOLDING VERIFICATION =========================================================
|
// ============== FOLDING VERIFICATION =========================================================
|
||||||
|
|
||||||
info_span!("Folding verification").in_scope(|| {
|
info_span!("Folding verification").in_scope(|| verify_folding(&folding, folding_vp));
|
||||||
verify_folding(
|
|
||||||
&folding,
|
|
||||||
folding_vp,
|
|
||||||
config.start_ivc_state,
|
|
||||||
config.num_inputs,
|
|
||||||
)
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
|
|||||||
@@ -1,15 +1,18 @@
|
|||||||
use ark_bn254::Fr;
|
use ark_bn254::Fr;
|
||||||
|
use experimental_frontends::circom::CircomFCircuit;
|
||||||
use num_traits::Zero;
|
use num_traits::Zero;
|
||||||
use sonobe::frontend::circom::CircomFCircuit;
|
|
||||||
use tracing::info_span;
|
use tracing::info_span;
|
||||||
|
|
||||||
use crate::{circuit::create_circuit, input::prepare_input};
|
use crate::{
|
||||||
|
circuit::{create_circuit, STEP_INPUT_WIDTH},
|
||||||
|
input::prepare_input,
|
||||||
|
};
|
||||||
|
|
||||||
#[derive(Clone)]
|
#[derive(Clone)]
|
||||||
pub struct ScenarioConfig {
|
pub struct ScenarioConfig {
|
||||||
pub num_inputs: usize,
|
pub num_inputs: usize,
|
||||||
pub start_ivc_state: Vec<Fr>,
|
pub start_ivc_state: Vec<Fr>,
|
||||||
pub circuit: CircomFCircuit<Fr>,
|
pub circuit: CircomFCircuit<Fr, STEP_INPUT_WIDTH>,
|
||||||
input: Vec<Vec<Fr>>,
|
input: Vec<Vec<Fr>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user