Browse Source

upgrade to latest Sonobe version

main
arnaucube 3 months ago
parent
commit
7d5b1e3ad5
7 changed files with 237 additions and 1006 deletions
  1. +197
    -944
      Cargo.lock
  2. +7
    -11
      Cargo.toml
  3. +1
    -1
      rust-toolchain.toml
  4. +5
    -5
      src/circuit.rs
  5. +20
    -34
      src/folding.rs
  6. +1
    -8
      src/main.rs
  7. +6
    -3
      src/scenario_config.rs

+ 197
- 944
Cargo.lock
File diff suppressed because it is too large
View File


+ 7
- 11
Cargo.toml

@ -5,20 +5,16 @@ edition = "2021"
authors = ["Piotr Mikołajczyk <piomiko41@gmail.com>"]
[dependencies]
ark-bn254 = { version = "^0.4.0", features = ["r1cs"] }
ark-crypto-primitives = { version = "0.4.0" }
ark-grumpkin = { version = "0.4.0", features = ["r1cs"] }
ark-groth16 = { version = "0.4.0", features = ["parallel"] }
ark-serialize = { version = "0.4.0" }
ark-bn254 = { version = "^0.5.0", features = ["r1cs"] }
ark-crypto-primitives = { version = "0.5.0" }
ark-grumpkin = { version = "0.5.0", features = ["r1cs"] }
ark-groth16 = { version = "0.5.0", features = ["parallel"] }
ark-serialize = { version = "0.5.0" }
itertools = { version = "0.13.0" }
num-traits = { version = "0.2.15" }
rand = { version = "0.8.5" }
tracing = { version = "0.1.26" }
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" }
[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" }
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" }

+ 1
- 1
rust-toolchain.toml

@ -1,4 +1,4 @@
[toolchain]
channel = "1.79"
channel = "1.82.0"
components = [ "rustfmt", "clippy", "rust-src" ]
targets = [ "x86_64-unknown-linux-gnu" ]

+ 5
- 5
src/circuit.rs

@ -1,12 +1,13 @@
use std::env::current_dir;
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 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 circuit_file = root.join("circuit/grayscale_step.r1cs");
let witness_generator_file = root.join("circuit/grayscale_step_js/grayscale_step.wasm");
@ -15,7 +16,6 @@ pub fn create_circuit() -> CircomFCircuit {
circuit_file.into(),
witness_generator_file.into(),
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")
}

+ 20
- 34
src/folding.rs

@ -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_grumpkin::{constraints::GVar as GVar2, Projective as G2};
use ark_grumpkin::Projective as G2;
use experimental_frontends::{circom::CircomFCircuit, utils::VecF};
use sonobe::{
commitment::{kzg::KZG, pedersen::Pedersen},
folding::{hypernova::HyperNova, nova::Nova},
frontend::circom::CircomFCircuit,
transcript::poseidon::poseidon_canonical_config,
Error, FoldingScheme, MultiFolding,
};
use tracing::info_span;
use crate::circuit::STEP_INPUT_WIDTH;
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<
G1,
GVar,
G2,
GVar2,
CircomFCircuit<Fr>,
CircomFCircuit<Fr, STEP_INPUT_WIDTH>,
KZG<'static, Bn254>,
Pedersen<G2>,
M,
@ -26,11 +26,11 @@ pub type HyperNovaFolding = HyperNova<
>;
pub struct StepInput<OtherInstances> {
pub external_inputs: Vec<Fr>,
pub external_inputs: VecF<Fr, STEP_INPUT_WIDTH>,
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;
fn num_steps(num_inputs: usize) -> usize {
@ -40,7 +40,7 @@ pub trait FoldingSchemeExt: FoldingScheme> {
fn prepreprocess(
poseidon_config: PoseidonConfig<Fr>,
circuit: CircomFCircuit<Fr>,
circuit: CircomFCircuit<Fr, STEP_INPUT_WIDTH>,
) -> Self::PreprocessorParam;
fn transform_multi_input(
@ -70,7 +70,7 @@ impl FoldingSchemeExt for NovaFolding {
fn prepreprocess(
poseidon_config: PoseidonConfig<Fr>,
circuit: CircomFCircuit<Fr>,
circuit: CircomFCircuit<Fr, STEP_INPUT_WIDTH>,
) -> Self::PreprocessorParam {
Self::PreprocessorParam::new(poseidon_config, circuit)
}
@ -83,7 +83,7 @@ impl FoldingSchemeExt for NovaFolding {
) -> StepInput<Self::MultiCommittedInstanceWithWitness> {
assert_eq!(input.len(), 1);
StepInput {
external_inputs: input[0].clone(),
external_inputs: VecF(input[0].clone()),
other_instances: None,
}
}
@ -94,7 +94,7 @@ impl FoldingSchemeExt for HyperNovaFolding
fn prepreprocess(
poseidon_config: PoseidonConfig<Fr>,
circuit: CircomFCircuit<Fr>,
circuit: CircomFCircuit<Fr, STEP_INPUT_WIDTH>,
) -> Self::PreprocessorParam {
Self::PreprocessorParam::new(poseidon_config, circuit)
}
@ -111,7 +111,7 @@ impl FoldingSchemeExt for HyperNovaFolding
};
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")
};
@ -123,20 +123,20 @@ impl FoldingSchemeExt for HyperNovaFolding
let cccs = incoming
.iter()
.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")
})
.collect();
StepInput {
external_inputs: single.clone(),
external_inputs: VecF(single.clone()),
other_instances: Some((lcccs, cccs)),
}
}
}
pub fn prepare_folding<FS: FoldingSchemeExt>(
circuit: &CircomFCircuit<Fr>,
circuit: &CircomFCircuit<Fr, STEP_INPUT_WIDTH>,
start_ivc_state: Vec<Fr>,
rng: &mut impl rand::RngCore,
) -> (FS, FS::VerifierParam) {
@ -149,21 +149,7 @@ pub fn prepare_folding(
(folding, params.1)
}
pub fn verify_folding<FS: FoldingSchemeExt>(
folding: &FS,
folding_vp: FS::VerifierParam,
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");
pub fn verify_folding<FS: FoldingSchemeExt>(folding: &FS, folding_vp: FS::VerifierParam) {
let ivc_proof = folding.ivc_proof();
FS::verify(folding_vp, ivc_proof).expect("Failed to verify folded proof");
}

+ 1
- 8
src/main.rs

@ -37,14 +37,7 @@ fn scenario(
// ============== FOLDING VERIFICATION =========================================================
info_span!("Folding verification").in_scope(|| {
verify_folding(
&folding,
folding_vp,
config.start_ivc_state,
config.num_inputs,
)
});
info_span!("Folding verification").in_scope(|| verify_folding(&folding, folding_vp));
}
fn main() {

+ 6
- 3
src/scenario_config.rs

@ -1,15 +1,18 @@
use ark_bn254::Fr;
use experimental_frontends::circom::CircomFCircuit;
use num_traits::Zero;
use sonobe::frontend::circom::CircomFCircuit;
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)]
pub struct ScenarioConfig {
pub num_inputs: usize,
pub start_ivc_state: Vec<Fr>,
pub circuit: CircomFCircuit<Fr>,
pub circuit: CircomFCircuit<Fr, STEP_INPUT_WIDTH>,
input: Vec<Vec<Fr>>,
}

Loading…
Cancel
Save