From d5b015bbc7c948f1e370cfabadce3d83c6514781 Mon Sep 17 00:00:00 2001 From: cyphersnake Date: Wed, 5 Feb 2025 15:30:03 +0100 Subject: [PATCH 1/7] refactor(ivc): rn trace -> support_trace --- src/ivc/cyclefold/sfc/input/assigned.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ivc/cyclefold/sfc/input/assigned.rs b/src/ivc/cyclefold/sfc/input/assigned.rs index 3b48765f..7c58cce2 100644 --- a/src/ivc/cyclefold/sfc/input/assigned.rs +++ b/src/ivc/cyclefold/sfc/input/assigned.rs @@ -905,7 +905,7 @@ impl Input { Halo2PlonkError::Synthesis })?; - for (acc_W, incoming_W, trace, new_acc_W, index) in itertools::multizip(( + for (acc_W, incoming_W, support_trace, new_acc_W, index) in itertools::multizip(( self.self_trace.input_accumulator.ins.W_commitments.iter(), self.self_trace.incoming.W_commitments.iter(), self.support_trace.incoming.iter(), @@ -914,7 +914,7 @@ impl Input { )) { info!("start {index} commitment check"); - let [expected_x, expected_y, x0, y0, l0, x1, y1, l1]: [_; support_circuit::INSTANCES_LEN] = trace.instance + let [expected_x, expected_y, x0, y0, l0, x1, y1, l1]: [_; support_circuit::INSTANCES_LEN] = support_trace.instance .instances .first() .expect("`SupportCircuit` always has instances.len() == 1 and it should always be used for sfc") From 47981379726a80c80e227eb712553bdcf9c3de86 Mon Sep 17 00:00:00 2001 From: cyphersnake Date: Wed, 5 Feb 2025 15:31:03 +0100 Subject: [PATCH 2/7] refactor(nifs): rm unused methods --- src/nifs/sangria/accumulator.rs | 27 +-------------------------- 1 file changed, 1 insertion(+), 26 deletions(-) diff --git a/src/nifs/sangria/accumulator.rs b/src/nifs/sangria/accumulator.rs index 402b6a60..f466a38d 100644 --- a/src/nifs/sangria/accumulator.rs +++ b/src/nifs/sangria/accumulator.rs @@ -18,7 +18,7 @@ use crate::{ ivc::sangria::instances_accumulator_computation, main_gate::{AssignedValue, WrapValue}, plonk::{ - self, GetChallenges, GetWitness, PlonkInstance, PlonkStructure, PlonkTrace, PlonkWitness, + self, GetChallenges, GetWitness, PlonkInstance, PlonkTrace, PlonkWitness, }, poseidon::{AbsorbInRO, ROTrait}, util::ScalarToBase, @@ -294,31 +294,6 @@ impl RelaxedPlonkTrace pub type RelaxedPlonkTraceArgs = plonk::PlonkTraceArgs; -impl RelaxedPlonkTrace -where - C::Base: PrimeFieldBits + FromUniformBytes<64>, -{ - pub fn new(args: RelaxedPlonkTraceArgs) -> Self { - Self { - U: RelaxedPlonkInstance::new( - args.num_challenges, - args.num_witness, - args.num_io.len() - 1, // instances - ), - W: RelaxedPlonkWitness::new(args.k_table_size, &args.round_sizes), - } - } -} - -impl From<&PlonkStructure> for RelaxedPlonkTrace -where - C::Base: PrimeFieldBits + FromUniformBytes<64>, -{ - fn from(value: &PlonkStructure) -> Self { - Self::new(RelaxedPlonkTraceArgs::from(value)) - } -} - impl GetWitness for RelaxedPlonkWitness { fn get_witness(&self) -> &[Vec] { &self.W From c27ff1f5bf31b998fe6b70866f11ad0e9386b72d Mon Sep 17 00:00:00 2001 From: cyphersnake Date: Wed, 5 Feb 2025 15:35:32 +0100 Subject: [PATCH 3/7] refactor(bench): add `sangria_` prefix --- .../{poseidon => cyclefold_poseidon}/main.rs | 0 benches/sangria_poseidon/main.rs | 213 ++++++++++++++++++ benches/{trivial => sangria_trivial}/main.rs | 0 3 files changed, 213 insertions(+) rename benches/{poseidon => cyclefold_poseidon}/main.rs (100%) create mode 100644 benches/sangria_poseidon/main.rs rename benches/{trivial => sangria_trivial}/main.rs (100%) diff --git a/benches/poseidon/main.rs b/benches/cyclefold_poseidon/main.rs similarity index 100% rename from benches/poseidon/main.rs rename to benches/cyclefold_poseidon/main.rs diff --git a/benches/sangria_poseidon/main.rs b/benches/sangria_poseidon/main.rs new file mode 100644 index 00000000..750e202f --- /dev/null +++ b/benches/sangria_poseidon/main.rs @@ -0,0 +1,213 @@ +use std::{array, io, marker::PhantomData, num::NonZeroUsize, path::Path}; + +use bn256::G1 as C1; +use criterion::{black_box, criterion_group, Criterion}; +use grumpkin::G1 as C2; +use metadata::LevelFilter; +use sirius::{ + commitment::CommitmentKey, + ff::{Field, FromUniformBytes, PrimeFieldBits}, + group::{prime::PrimeCurve, Group}, + halo2_proofs::{ + circuit::{AssignedCell, Layouter}, + plonk::ConstraintSystem, + }, + halo2curves::{bn256, grumpkin, CurveAffine, CurveExt}, + ivc::{step_circuit, CircuitPublicParamsInput, PublicParams, StepCircuit, SynthesisError, IVC}, + main_gate::{MainGate, MainGateConfig, RegionCtx, WrapValue}, + poseidon::{self, poseidon_circuit::PoseidonChip, ROPair, Spec}, +}; +use tracing::*; +use tracing_subscriber::{fmt::format::FmtSpan, EnvFilter}; + +const ARITY: usize = 1; + +const CIRCUIT_TABLE_SIZE1: usize = 17; +const CIRCUIT_TABLE_SIZE2: usize = 17; +const COMMITMENT_KEY_SIZE: usize = 21; + +// Spec for user defined poseidon circuit +const T1: usize = 3; +const RATE1: usize = 2; +const R_F1: usize = 4; +const R_P1: usize = 3; + +#[derive(Clone, Debug)] +struct TestPoseidonCircuitConfig { + pconfig: MainGateConfig, +} + +#[derive(Default, Debug, Clone)] +struct TestPoseidonCircuit { + _p: PhantomData, +} + +impl> StepCircuit for TestPoseidonCircuit { + type Config = TestPoseidonCircuitConfig; + + fn configure(meta: &mut ConstraintSystem) -> Self::Config { + let pconfig = MainGate::configure(meta); + Self::Config { pconfig } + } + + fn synthesize_step( + &self, + config: Self::Config, + layouter: &mut impl Layouter, + z_in: &[AssignedCell; ARITY], + ) -> Result<[AssignedCell; ARITY], SynthesisError> { + let spec = Spec::::new(R_F1, R_P1); + let mut pchip = PoseidonChip::new(config.pconfig, spec); + let input = z_in.iter().map(|x| x.into()).collect::>>(); + pchip.update(&input); + let output = layouter + .assign_region( + || "poseidon hash", + |region| { + let ctx = &mut RegionCtx::new(region, 0); + pchip.squeeze(ctx) + }, + ) + .map_err(SynthesisError::Halo2)?; + Ok([output]) + } +} + +// specs for IVC circuit +const T: usize = 5; +const RATE: usize = 4; + +type RandomOracle = poseidon::PoseidonRO; + +type RandomOracleConstant = >::Args; + +const LIMB_WIDTH: NonZeroUsize = unsafe { NonZeroUsize::new_unchecked(32) }; +const LIMBS_COUNT: NonZeroUsize = unsafe { NonZeroUsize::new_unchecked(10) }; + +type C1Affine = ::Affine; +type C2Affine = ::Affine; + +type C1Scalar = ::Scalar; +type C2Scalar = ::Scalar; + +const FOLDER: &str = ".cache/examples"; + +#[instrument] +fn get_or_create_commitment_key( + k: usize, + label: &'static str, +) -> io::Result> { + unsafe { CommitmentKey::load_or_setup_cache(Path::new(FOLDER), label, k) } +} + +pub fn criterion_benchmark(c: &mut Criterion) { + let _span = info_span!("poseidon_bench").entered(); + let prepare_span = info_span!("prepare").entered(); + + // C1 + let sc1 = TestPoseidonCircuit::default(); + // C2 + let sc2 = step_circuit::trivial::Circuit::::default(); + + let primary_spec = RandomOracleConstant::<::ScalarExt>::new(10, 10); + let secondary_spec = RandomOracleConstant::<::ScalarExt>::new(10, 10); + + let primary_commitment_key = + get_or_create_commitment_key::(COMMITMENT_KEY_SIZE, "bn256") + .expect("Failed to get secondary key"); + let secondary_commitment_key = + get_or_create_commitment_key::(COMMITMENT_KEY_SIZE, "grumpkin") + .expect("Failed to get primary key"); + + let pp = PublicParams::< + '_, + ARITY, + ARITY, + T, + C1Affine, + C2Affine, + TestPoseidonCircuit<_>, + step_circuit::trivial::Circuit, + RandomOracle, + RandomOracle, + >::new( + CircuitPublicParamsInput::new( + CIRCUIT_TABLE_SIZE1 as u32, + &primary_commitment_key, + primary_spec, + &sc1, + ), + CircuitPublicParamsInput::new( + CIRCUIT_TABLE_SIZE2 as u32, + &secondary_commitment_key, + secondary_spec, + &sc2, + ), + LIMB_WIDTH, + LIMBS_COUNT, + ) + .unwrap(); + + prepare_span.exit(); + + let mut group = c.benchmark_group("ivc_of_poseidon"); + group.significance_level(0.1).sample_size(10); + + group.bench_function("fold_1_step", |b| { + let mut rnd = rand::thread_rng(); + let primary_z_0 = array::from_fn(|_| C1Scalar::random(&mut rnd)); + let secondary_z_0 = array::from_fn(|_| C2Scalar::random(&mut rnd)); + + b.iter(|| { + IVC::fold( + &pp, + &sc1, + black_box(primary_z_0), + &sc2, + black_box(secondary_z_0), + NonZeroUsize::new(1).unwrap(), + ) + .unwrap(); + }) + }); + + group.bench_function("fold_2_step", |b| { + let mut rnd = rand::thread_rng(); + let primary_z_0 = array::from_fn(|_| C1Scalar::random(&mut rnd)); + let secondary_z_0 = array::from_fn(|_| C2Scalar::random(&mut rnd)); + + b.iter(|| { + IVC::fold( + &pp, + &sc1, + black_box(primary_z_0), + &sc2, + black_box(secondary_z_0), + NonZeroUsize::new(2).unwrap(), + ) + .unwrap(); + }) + }); + + group.finish(); +} + +criterion_group!(benches, criterion_benchmark); + +fn main() { + tracing_subscriber::fmt() + .with_span_events(FmtSpan::ENTER | FmtSpan::CLOSE) + .with_env_filter( + EnvFilter::builder() + .with_default_directive(LevelFilter::INFO.into()) + .from_env_lossy(), + ) + .json() + .init(); + + benches(); + + criterion::Criterion::default() + .configure_from_args() + .final_summary(); +} diff --git a/benches/trivial/main.rs b/benches/sangria_trivial/main.rs similarity index 100% rename from benches/trivial/main.rs rename to benches/sangria_trivial/main.rs From 9cef272d96e974bd07b217a4464524484501db09 Mon Sep 17 00:00:00 2001 From: cyphersnake Date: Wed, 5 Feb 2025 15:43:06 +0100 Subject: [PATCH 4/7] refactor(ivc): `use ivc::IVC -> ivc::sangria::IVC` --- Cargo.toml | 4 ++-- benches/cyclefold_poseidon/main.rs | 5 ++++- benches/sangria_poseidon/main.rs | 5 ++++- benches/sangria_trivial/main.rs | 9 ++++++--- examples/cli.rs | 6 +++++- examples/instances.rs | 6 +++--- examples/merkle/main.rs | 5 ++++- examples/my_circuit.rs | 6 +++--- examples/poseidon.rs | 5 ++++- examples/sha256/main.rs | 5 ++++- examples/trivial/main.rs | 6 +++--- .../incrementally_verifiable_computation/mod.rs | 4 ++-- .../public_params.rs | 2 +- src/ivc/cyclefold/sfc/sangria_adapter.rs | 4 +++- src/ivc/cyclefold/support_circuit/mod.rs | 2 +- src/ivc/mod.rs | 10 ++++------ .../sangria/consistency_markers_computation.rs | 2 +- src/ivc/sangria/mod.rs | 3 +++ src/ivc/sangria/step_folding_circuit.rs | 8 +++++--- src/ivc/step_circuit.rs | 2 +- src/lib.rs | 16 ++++++++-------- 21 files changed, 71 insertions(+), 44 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index ea108b53..76232408 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -63,11 +63,11 @@ default-features = false features = ["prepush-hook", "run-cargo-fmt", "run-cargo-test", "run-cargo-clippy"] [[bench]] -name = "trivial" +name = "sangria_trivial" harness = false [[bench]] -name = "poseidon" +name = "sangria_poseidon" harness = false [features] diff --git a/benches/cyclefold_poseidon/main.rs b/benches/cyclefold_poseidon/main.rs index 750e202f..6c945e76 100644 --- a/benches/cyclefold_poseidon/main.rs +++ b/benches/cyclefold_poseidon/main.rs @@ -13,7 +13,10 @@ use sirius::{ plonk::ConstraintSystem, }, halo2curves::{bn256, grumpkin, CurveAffine, CurveExt}, - ivc::{step_circuit, CircuitPublicParamsInput, PublicParams, StepCircuit, SynthesisError, IVC}, + ivc::{ + sangria::{CircuitPublicParamsInput, PublicParams, IVC}, + step_circuit, StepCircuit, SynthesisError, + }, main_gate::{MainGate, MainGateConfig, RegionCtx, WrapValue}, poseidon::{self, poseidon_circuit::PoseidonChip, ROPair, Spec}, }; diff --git a/benches/sangria_poseidon/main.rs b/benches/sangria_poseidon/main.rs index 750e202f..6c945e76 100644 --- a/benches/sangria_poseidon/main.rs +++ b/benches/sangria_poseidon/main.rs @@ -13,7 +13,10 @@ use sirius::{ plonk::ConstraintSystem, }, halo2curves::{bn256, grumpkin, CurveAffine, CurveExt}, - ivc::{step_circuit, CircuitPublicParamsInput, PublicParams, StepCircuit, SynthesisError, IVC}, + ivc::{ + sangria::{CircuitPublicParamsInput, PublicParams, IVC}, + step_circuit, StepCircuit, SynthesisError, + }, main_gate::{MainGate, MainGateConfig, RegionCtx, WrapValue}, poseidon::{self, poseidon_circuit::PoseidonChip, ROPair, Spec}, }; diff --git a/benches/sangria_trivial/main.rs b/benches/sangria_trivial/main.rs index e563811a..fe7d53cf 100644 --- a/benches/sangria_trivial/main.rs +++ b/benches/sangria_trivial/main.rs @@ -11,7 +11,10 @@ use sirius::{ ff::Field, group::{prime::PrimeCurve, Group}, halo2curves::{bn256, grumpkin, CurveAffine, CurveExt}, - ivc::{step_circuit, CircuitPublicParamsInput, PublicParams, IVC}, + ivc::{ + sangria::{CircuitPublicParamsInput, PublicParams}, + step_circuit, SangriaIVC, + }, poseidon::{self, ROPair}, }; use tracing::*; @@ -109,7 +112,7 @@ pub fn criterion_benchmark(c: &mut Criterion) { let secondary_z_0 = array::from_fn(|_| C2Scalar::random(&mut rnd)); b.iter(|| { - IVC::fold( + SangriaIVC::fold( &pp, &sc1, black_box(primary_z_0), @@ -127,7 +130,7 @@ pub fn criterion_benchmark(c: &mut Criterion) { let secondary_z_0 = array::from_fn(|_| C2Scalar::random(&mut rnd)); b.iter(|| { - IVC::fold( + SangriaIVC::fold( &pp, &sc1, black_box(primary_z_0), diff --git a/examples/cli.rs b/examples/cli.rs index 02b4ba86..a082c92d 100644 --- a/examples/cli.rs +++ b/examples/cli.rs @@ -15,7 +15,11 @@ use halo2_proofs::halo2curves; use poseidon::poseidon_step_circuit::TestPoseidonCircuit; use sirius::{ ff::{FromUniformBytes, PrimeField, PrimeFieldBits}, - ivc::{step_circuit::trivial, CircuitPublicParamsInput, PublicParams, StepCircuit, IVC}, + ivc::{ + sangria::{CircuitPublicParamsInput, PublicParams, IVC}, + step_circuit::trivial, + StepCircuit, + }, poseidon::ROPair, }; use tracing::*; diff --git a/examples/instances.rs b/examples/instances.rs index 51c23f5f..c04312a8 100644 --- a/examples/instances.rs +++ b/examples/instances.rs @@ -10,9 +10,9 @@ use sirius::{ step_circuit::{trivial, AssignedCell, ConstraintSystem, Layouter}, SynthesisError, }, - prelude::{ + sangria_prelude::{ bn256::{new_default_pp, C1Affine, C1Scalar, C2Affine, C2Scalar}, - CommitmentKey, PrimeField, StepCircuit, IVC, + CommitmentKey, PrimeField, StepCircuit, SangriaIVC, }, }; use tracing::debug; @@ -155,7 +155,7 @@ fn main() { &sc2, ); - IVC::fold_with_debug_mode( + SangriaIVC::fold_with_debug_mode( &pp, &sc1, array::from_fn(|i| C1Scalar::from(i as u64)), diff --git a/examples/merkle/main.rs b/examples/merkle/main.rs index 6885704c..7e8ace99 100644 --- a/examples/merkle/main.rs +++ b/examples/merkle/main.rs @@ -27,7 +27,10 @@ mod sirius_mod { commitment::CommitmentKey, ff::Field, group::{prime::PrimeCurve, Group}, - ivc::{step_circuit::trivial, CircuitPublicParamsInput, PublicParams, IVC}, + ivc::{ + sangria::{CircuitPublicParamsInput, PublicParams, IVC}, + step_circuit::trivial, + }, }; use tracing::info_span; diff --git a/examples/my_circuit.rs b/examples/my_circuit.rs index d0541d51..a3d437e0 100644 --- a/examples/my_circuit.rs +++ b/examples/my_circuit.rs @@ -5,9 +5,9 @@ use sirius::{ step_circuit::{trivial, AssignedCell, ConstraintSystem, Layouter}, SynthesisError, }, - prelude::{ + sangria_prelude::{ bn256::{new_default_pp, C1Affine, C1Scalar, C2Affine, C2Scalar}, - CommitmentKey, PrimeField, StepCircuit, IVC, + CommitmentKey, PrimeField, StepCircuit, SangriaIVC, }, }; @@ -87,7 +87,7 @@ fn main() { &sc2, ); - IVC::fold_with_debug_mode( + SangriaIVC::fold_with_debug_mode( &pp, &sc1, array::from_fn(|i| C1Scalar::from(i as u64)), diff --git a/examples/poseidon.rs b/examples/poseidon.rs index 9c487a1e..a008e896 100644 --- a/examples/poseidon.rs +++ b/examples/poseidon.rs @@ -127,7 +127,10 @@ use sirius::{ commitment::CommitmentKey, group::{prime::PrimeCurve, Group}, halo2curves::{bn256, grumpkin, CurveAffine}, - ivc::{step_circuit, CircuitPublicParamsInput, PublicParams, IVC}, + ivc::{ + sangria::{CircuitPublicParamsInput, PublicParams, IVC}, + step_circuit, + }, poseidon::{self, ROPair}, }; use tracing::*; diff --git a/examples/sha256/main.rs b/examples/sha256/main.rs index 15bc7c88..2e4d8c1f 100644 --- a/examples/sha256/main.rs +++ b/examples/sha256/main.rs @@ -13,7 +13,10 @@ use sirius::{ ff::PrimeField, group::{prime::PrimeCurve, Group}, halo2curves::{bn256, grumpkin, CurveAffine, CurveExt}, - ivc::{step_circuit, CircuitPublicParamsInput, PublicParams, StepCircuit, SynthesisError, IVC}, + ivc::{ + sangria::{CircuitPublicParamsInput, PublicParams, IVC}, + step_circuit, StepCircuit, SynthesisError, + }, poseidon::{self, ROPair}, }; use tracing::*; diff --git a/examples/trivial/main.rs b/examples/trivial/main.rs index 0c880456..5501df44 100644 --- a/examples/trivial/main.rs +++ b/examples/trivial/main.rs @@ -2,7 +2,7 @@ use std::{array, num::NonZeroUsize}; use sirius::{ commitment::CommitmentKey, - ivc::{step_circuit::trivial, IVC}, + ivc::{step_circuit::trivial, SangriaIVC}, }; /// Arity : Input/output size per fold-step for primary step-circuit @@ -31,7 +31,7 @@ const PRIMARY_CIRCUIT_TABLE_SIZE: usize = 17; /// Key size for Primary Circuit const SECONDARY_COMMITMENT_KEY_SIZE: usize = 21; -use sirius::prelude::bn256::{new_default_pp, C1Affine, C1Scalar, C2Affine, C2Scalar}; +use sirius::sangria_prelude::bn256::{new_default_pp, C1Affine, C1Scalar, C2Affine, C2Scalar}; fn main() { let sc1 = trivial::Circuit::::default(); @@ -52,7 +52,7 @@ fn main() { &sc2, ); - IVC::fold_with_debug_mode( + SangriaIVC::fold_with_debug_mode( &pp, &sc1, array::from_fn(|i| C1Scalar::from(i as u64)), diff --git a/src/ivc/cyclefold/incrementally_verifiable_computation/mod.rs b/src/ivc/cyclefold/incrementally_verifiable_computation/mod.rs index 0ff17f2e..72d9f251 100644 --- a/src/ivc/cyclefold/incrementally_verifiable_computation/mod.rs +++ b/src/ivc/cyclefold/incrementally_verifiable_computation/mod.rs @@ -29,7 +29,7 @@ use crate::{ plonk::{eval, PlonkTrace}, polynomial::lagrange, poseidon::random_oracle::ROTrait, - prelude::CommitmentKey, + sangria_prelude::CommitmentKey, table::CircuitRunner, util, }; @@ -534,7 +534,7 @@ mod tests { commitment::CommitmentKey, halo2_proofs::arithmetic::Field, ivc::step_circuit::trivial, - prelude::bn256::{C1Affine, C1Scalar, C2Affine}, + sangria_prelude::bn256::{C1Affine, C1Scalar, C2Affine}, }; /// Arity : Input/output size per fold-step for primary step-circuit diff --git a/src/ivc/cyclefold/incrementally_verifiable_computation/public_params.rs b/src/ivc/cyclefold/incrementally_verifiable_computation/public_params.rs index bb27d9ac..b7ef8848 100644 --- a/src/ivc/cyclefold/incrementally_verifiable_computation/public_params.rs +++ b/src/ivc/cyclefold/incrementally_verifiable_computation/public_params.rs @@ -29,7 +29,7 @@ use crate::{ plonk::{PlonkStructure, PlonkTrace}, polynomial::Expression, poseidon::{PoseidonHash, ROTrait, Spec}, - prelude::CommitmentKey, + sangria_prelude::CommitmentKey, table::CircuitRunner, util, }; diff --git a/src/ivc/cyclefold/sfc/sangria_adapter.rs b/src/ivc/cyclefold/sfc/sangria_adapter.rs index 05bf53c1..d0e22f44 100644 --- a/src/ivc/cyclefold/sfc/sangria_adapter.rs +++ b/src/ivc/cyclefold/sfc/sangria_adapter.rs @@ -18,7 +18,9 @@ use crate::{ }, ivc::{ cyclefold::{ro_chip, DEFAULT_LIMBS_COUNT, DEFAULT_LIMB_WIDTH}, - fold_relaxed_plonk_instance_chip::{self, BigUintView, FoldRelaxedPlonkInstanceChip}, + sangria::fold_relaxed_plonk_instance_chip::{ + self, BigUintView, FoldRelaxedPlonkInstanceChip, + }, }, main_gate::{AssignedValue, MainGate, MainGateConfig, RegionCtx}, nifs::sangria, diff --git a/src/ivc/cyclefold/support_circuit/mod.rs b/src/ivc/cyclefold/support_circuit/mod.rs index 885c4f77..f3dadcae 100644 --- a/src/ivc/cyclefold/support_circuit/mod.rs +++ b/src/ivc/cyclefold/support_circuit/mod.rs @@ -172,7 +172,7 @@ mod tests { use super::*; use crate::{ halo2_proofs::{dev::MockProver, halo2curves::group::prime::PrimeCurveAffine}, - prelude::{bn256::C1Affine as Curve, Field}, + sangria_prelude::{bn256::C1Affine as Curve, Field}, }; type Base = ::Base; diff --git a/src/ivc/mod.rs b/src/ivc/mod.rs index cda44ec7..0043a9f3 100644 --- a/src/ivc/mod.rs +++ b/src/ivc/mod.rs @@ -1,15 +1,13 @@ pub mod step_circuit; pub mod sangria; -pub use sangria::{ - fold_relaxed_plonk_instance_chip, incrementally_verifiable_computation, - public_params::{CircuitPublicParamsInput, PublicParams}, - step_folding_circuit, -}; +pub use sangria::step_folding_circuit; pub mod protogalaxy; pub mod cyclefold; pub use halo2_proofs::circuit::SimpleFloorPlanner; -pub use incrementally_verifiable_computation::*; +pub use sangria::incrementally_verifiable_computation::{ + Instances, StepCircuit, SynthesisError, IVC as SangriaIVC, +}; diff --git a/src/ivc/sangria/consistency_markers_computation.rs b/src/ivc/sangria/consistency_markers_computation.rs index 3de457aa..e89c48ed 100644 --- a/src/ivc/sangria/consistency_markers_computation.rs +++ b/src/ivc/sangria/consistency_markers_computation.rs @@ -210,7 +210,7 @@ mod tests { use super::*; use crate::{ commitment::CommitmentKey, - ivc::fold_relaxed_plonk_instance_chip::FoldRelaxedPlonkInstanceChip, + ivc::sangria::fold_relaxed_plonk_instance_chip::FoldRelaxedPlonkInstanceChip, main_gate::AdviceCyclicAssignor, poseidon::{poseidon_circuit::PoseidonChip, PoseidonHash, Spec}, table::WitnessCollector, diff --git a/src/ivc/sangria/mod.rs b/src/ivc/sangria/mod.rs index 8be65dc1..0cddee4d 100644 --- a/src/ivc/sangria/mod.rs +++ b/src/ivc/sangria/mod.rs @@ -4,3 +4,6 @@ pub mod incrementally_verifiable_computation; pub mod instances_accumulator_computation; pub mod public_params; pub mod step_folding_circuit; + +pub use incrementally_verifiable_computation::IVC; +pub use public_params::{CircuitPublicParamsInput, PublicParams}; diff --git a/src/ivc/sangria/step_folding_circuit.rs b/src/ivc/sangria/step_folding_circuit.rs index 2bda683a..16edaa72 100644 --- a/src/ivc/sangria/step_folding_circuit.rs +++ b/src/ivc/sangria/step_folding_circuit.rs @@ -13,10 +13,12 @@ use crate::{ }, halo2curves::CurveAffine, ivc::{ - fold_relaxed_plonk_instance_chip::{ - AssignedRelaxedPlonkInstance, FoldRelaxedPlonkInstanceChip, FoldResult, + sangria::{ + consistency_markers_computation::AssignedConsistencyMarkersComputation, + fold_relaxed_plonk_instance_chip::{ + AssignedRelaxedPlonkInstance, FoldRelaxedPlonkInstanceChip, FoldResult, + }, }, - sangria::consistency_markers_computation::AssignedConsistencyMarkersComputation, StepCircuit, }, main_gate::{AdviceCyclicAssignor, MainGate, MainGateConfig, RegionCtx}, diff --git a/src/ivc/step_circuit.rs b/src/ivc/step_circuit.rs index d6160099..dedfff9b 100644 --- a/src/ivc/step_circuit.rs +++ b/src/ivc/step_circuit.rs @@ -1,6 +1,6 @@ use tracing::*; -use super::fold_relaxed_plonk_instance_chip; +use super::sangria::fold_relaxed_plonk_instance_chip; pub use crate::halo2_proofs::{ circuit::{AssignedCell, Layouter}, plonk::ConstraintSystem, diff --git a/src/lib.rs b/src/lib.rs index 51fce4ba..d6cb4973 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -25,14 +25,14 @@ pub use halo2_proofs::{ halo2curves::{ff, group}, }; -pub mod prelude { +pub mod sangria_prelude { use std::num::NonZeroUsize; use crate::ff::{FromUniformBytes, PrimeFieldBits}; pub use crate::{ commitment::CommitmentKey, ff::{Field, PrimeField}, - ivc::{StepCircuit, IVC}, + ivc::{StepCircuit, SangriaIVC}, }; /// Within the IVC framework, on-circuit & off-circuit random oracle will be used @@ -104,7 +104,7 @@ pub mod prelude { pub type C2Scalar = ::Scalar; pub type PublicParams<'l, const A1: usize, C1, const A2: usize, C2> = - crate::ivc::PublicParams< + crate::ivc::sangria::PublicParams< 'l, A1, A2, @@ -139,13 +139,13 @@ pub mod prelude { C2: StepCircuit, { PublicParams::new( - crate::ivc::CircuitPublicParamsInput::new( + crate::ivc::sangria::CircuitPublicParamsInput::new( primary_k_table_size, primary_commitment_key, super::default_random_oracle_constant(), sc1, ), - crate::ivc::CircuitPublicParamsInput::new( + crate::ivc::sangria::CircuitPublicParamsInput::new( secondary_k_table_size, secondary_commitment_key, super::default_random_oracle_constant(), @@ -181,7 +181,7 @@ pub mod prelude { pub type C2Scalar = ::Scalar; pub type PublicParams<'l, const A1: usize, C1, const A2: usize, C2> = - crate::ivc::PublicParams< + crate::ivc::sangria::PublicParams< 'l, A1, A2, @@ -216,13 +216,13 @@ pub mod prelude { C2: StepCircuit, { PublicParams::new( - crate::ivc::CircuitPublicParamsInput::new( + crate::ivc::sangria::CircuitPublicParamsInput::new( primary_k_table_size, primary_commitment_key, super::default_random_oracle_constant(), sc1, ), - crate::ivc::CircuitPublicParamsInput::new( + crate::ivc::sangria::CircuitPublicParamsInput::new( secondary_k_table_size, secondary_commitment_key, super::default_random_oracle_constant(), From 674a9d5264a446089dc9fb61a84dfecb8e7d0bea Mon Sep 17 00:00:00 2001 From: cyphersnake Date: Wed, 5 Feb 2025 16:04:41 +0100 Subject: [PATCH 5/7] feat: impl cyclefold trivial example --- benches/cyclefold_poseidon/main.rs | 2 +- examples/cyclefold_trivial/main.rs | 63 +++++++++++++++++++ examples/instances.rs | 2 +- examples/my_circuit.rs | 2 +- examples/{trivial => sangria_trivial}/main.rs | 0 src/ivc/cyclefold/mod.rs | 4 +- src/ivc/mod.rs | 2 + src/lib.rs | 25 +++++++- src/nifs/sangria/accumulator.rs | 4 +- 9 files changed, 96 insertions(+), 8 deletions(-) create mode 100644 examples/cyclefold_trivial/main.rs rename examples/{trivial => sangria_trivial}/main.rs (100%) diff --git a/benches/cyclefold_poseidon/main.rs b/benches/cyclefold_poseidon/main.rs index 6c945e76..8a322caa 100644 --- a/benches/cyclefold_poseidon/main.rs +++ b/benches/cyclefold_poseidon/main.rs @@ -14,7 +14,7 @@ use sirius::{ }, halo2curves::{bn256, grumpkin, CurveAffine, CurveExt}, ivc::{ - sangria::{CircuitPublicParamsInput, PublicParams, IVC}, + cyclefold::{PublicParams, IVC}, step_circuit, StepCircuit, SynthesisError, }, main_gate::{MainGate, MainGateConfig, RegionCtx, WrapValue}, diff --git a/examples/cyclefold_trivial/main.rs b/examples/cyclefold_trivial/main.rs new file mode 100644 index 00000000..f96b231f --- /dev/null +++ b/examples/cyclefold_trivial/main.rs @@ -0,0 +1,63 @@ +use std::{array, path::Path}; + +use sirius::{commitment::CommitmentKey, ff::Field, ivc::step_circuit::trivial}; + +/// Arity : Input/output size per fold-step for primary step-circuit +/// For tivial case it can be any number +const A1: usize = 5; + +/// Key size for Primary Circuit +const PRIMARY_COMMITMENT_KEY_SIZE: usize = 23; + +/// Table size for Primary Circuit +/// +/// Requires at least 17, for service purposes, but if the primary requires more, increase the +/// constant +const PRIMARY_CIRCUIT_TABLE_SIZE: usize = 20; + +/// Key size for Primary Circuit +const SECONDARY_COMMITMENT_KEY_SIZE: usize = 23; + +use sirius::cyclefold_prelude::{ + bn256::{C1Affine, C1Scalar, C2Affine}, + PublicParams, IVC, +}; + +const FOLDER: &str = ".cache/examples"; + +fn main() { + let sc = trivial::Circuit::::default(); + + let primary_commitment_key = unsafe { + CommitmentKey::::load_or_setup_cache( + Path::new(FOLDER), + "bn256", + PRIMARY_COMMITMENT_KEY_SIZE, + ) + .unwrap() + }; + + let secondary_commitment_key = unsafe { + CommitmentKey::::load_or_setup_cache( + Path::new(FOLDER), + "grumpkin", + SECONDARY_COMMITMENT_KEY_SIZE, + ) + .unwrap() + }; + + let mut pp = PublicParams::new( + &sc, + primary_commitment_key, + secondary_commitment_key, + PRIMARY_CIRCUIT_TABLE_SIZE as u32, + ) + .unwrap(); + + IVC::new(&mut pp, &sc, array::from_fn(|_| C1Scalar::ZERO)) + .expect("while step=0") + .next(&pp, &sc) + .expect("while step=1") + .verify(&pp) + .expect("while verify"); +} diff --git a/examples/instances.rs b/examples/instances.rs index c04312a8..cd347f31 100644 --- a/examples/instances.rs +++ b/examples/instances.rs @@ -12,7 +12,7 @@ use sirius::{ }, sangria_prelude::{ bn256::{new_default_pp, C1Affine, C1Scalar, C2Affine, C2Scalar}, - CommitmentKey, PrimeField, StepCircuit, SangriaIVC, + CommitmentKey, PrimeField, SangriaIVC, StepCircuit, }, }; use tracing::debug; diff --git a/examples/my_circuit.rs b/examples/my_circuit.rs index a3d437e0..5b2553d3 100644 --- a/examples/my_circuit.rs +++ b/examples/my_circuit.rs @@ -7,7 +7,7 @@ use sirius::{ }, sangria_prelude::{ bn256::{new_default_pp, C1Affine, C1Scalar, C2Affine, C2Scalar}, - CommitmentKey, PrimeField, StepCircuit, SangriaIVC, + CommitmentKey, PrimeField, SangriaIVC, StepCircuit, }, }; diff --git a/examples/trivial/main.rs b/examples/sangria_trivial/main.rs similarity index 100% rename from examples/trivial/main.rs rename to examples/sangria_trivial/main.rs diff --git a/src/ivc/cyclefold/mod.rs b/src/ivc/cyclefold/mod.rs index 6aacca8f..a80e9db9 100644 --- a/src/ivc/cyclefold/mod.rs +++ b/src/ivc/cyclefold/mod.rs @@ -11,7 +11,9 @@ mod support_circuit; mod sfc; #[allow(clippy::upper_case_acronyms)] -mod incrementally_verifiable_computation; +pub mod incrementally_verifiable_computation; + +pub use incrementally_verifiable_computation::{PublicParams, IVC}; pub const T: usize = 5; pub const T_MAIN_GATE: usize = 5; diff --git a/src/ivc/mod.rs b/src/ivc/mod.rs index 0043a9f3..aef35056 100644 --- a/src/ivc/mod.rs +++ b/src/ivc/mod.rs @@ -7,7 +7,9 @@ pub mod protogalaxy; pub mod cyclefold; +pub use cyclefold::incrementally_verifiable_computation::IVC as CyclefoldIVC; pub use halo2_proofs::circuit::SimpleFloorPlanner; + pub use sangria::incrementally_verifiable_computation::{ Instances, StepCircuit, SynthesisError, IVC as SangriaIVC, }; diff --git a/src/lib.rs b/src/lib.rs index d6cb4973..f43186e3 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -25,6 +25,29 @@ pub use halo2_proofs::{ halo2curves::{ff, group}, }; +pub mod cyclefold_prelude { + /// All imports and alias related to what will use bn256 & grumpkin as the first and second + /// curve respectively + pub mod bn256 { + pub use bn256::G1; + pub use grumpkin::G1 as G2; + + use crate::halo2curves::{ + bn256, + group::{prime::PrimeCurve, Group}, + grumpkin, + }; + + pub type C1Affine = ::Affine; + pub type C2Affine = ::Affine; + + pub type C1Scalar = ::Scalar; + pub type C2Scalar = ::Scalar; + } + + pub use crate::ivc::cyclefold::{PublicParams, IVC}; +} + pub mod sangria_prelude { use std::num::NonZeroUsize; @@ -32,7 +55,7 @@ pub mod sangria_prelude { pub use crate::{ commitment::CommitmentKey, ff::{Field, PrimeField}, - ivc::{StepCircuit, SangriaIVC}, + ivc::{SangriaIVC, StepCircuit}, }; /// Within the IVC framework, on-circuit & off-circuit random oracle will be used diff --git a/src/nifs/sangria/accumulator.rs b/src/nifs/sangria/accumulator.rs index f466a38d..2cbf98b4 100644 --- a/src/nifs/sangria/accumulator.rs +++ b/src/nifs/sangria/accumulator.rs @@ -17,9 +17,7 @@ use crate::{ ff::{Field, PrimeField}, ivc::sangria::instances_accumulator_computation, main_gate::{AssignedValue, WrapValue}, - plonk::{ - self, GetChallenges, GetWitness, PlonkInstance, PlonkTrace, PlonkWitness, - }, + plonk::{self, GetChallenges, GetWitness, PlonkInstance, PlonkTrace, PlonkWitness}, poseidon::{AbsorbInRO, ROTrait}, util::ScalarToBase, }; From fe120bd18197081dc05881b3730457e35d08243d Mon Sep 17 00:00:00 2001 From: cyphersnake Date: Thu, 6 Feb 2025 00:00:37 +0100 Subject: [PATCH 6/7] chore: bump rust-toolchain --- rust-toolchain.toml | 2 +- src/plonk/eval.rs | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/rust-toolchain.toml b/rust-toolchain.toml index 2ceee0d0..b0e5f137 100644 --- a/rust-toolchain.toml +++ b/rust-toolchain.toml @@ -1 +1 @@ -toolchain.channel = "1.83.0" +toolchain.channel = "1.84.0" diff --git a/src/plonk/eval.rs b/src/plonk/eval.rs index c6f37d28..11e9840d 100644 --- a/src/plonk/eval.rs +++ b/src/plonk/eval.rs @@ -103,7 +103,7 @@ pub struct PlonkEvalDomain<'a, F: PrimeField> { pub(crate) W2s: &'a [Vec], } -impl<'a, F: PrimeField> GetDataForEval for LookupEvalDomain<'a, F> { +impl GetDataForEval for LookupEvalDomain<'_, F> { fn num_lookup(&self) -> usize { self.num_lookup } @@ -133,7 +133,7 @@ impl<'a, F: PrimeField> GetDataForEval for LookupEvalDomain<'a, F> { } } -impl<'a, F: PrimeField> GetDataForEval for PlonkEvalDomain<'a, F> { +impl GetDataForEval for PlonkEvalDomain<'_, F> { fn num_lookup(&self) -> usize { self.num_lookup } From 6484d3dac75f4ffabdc20eef08716f9d572a9acd Mon Sep 17 00:00:00 2001 From: cyphersnake Date: Thu, 6 Feb 2025 00:10:35 +0100 Subject: [PATCH 7/7] refactor(bench): impl cyclefold --- benches/cyclefold_poseidon/main.rs | 99 +++++------------------------- 1 file changed, 17 insertions(+), 82 deletions(-) diff --git a/benches/cyclefold_poseidon/main.rs b/benches/cyclefold_poseidon/main.rs index 8a322caa..e2b493df 100644 --- a/benches/cyclefold_poseidon/main.rs +++ b/benches/cyclefold_poseidon/main.rs @@ -1,24 +1,23 @@ -use std::{array, io, marker::PhantomData, num::NonZeroUsize, path::Path}; +use std::{array, io, marker::PhantomData, path::Path}; use bn256::G1 as C1; -use criterion::{black_box, criterion_group, Criterion}; -use grumpkin::G1 as C2; +use criterion::{criterion_group, Criterion}; use metadata::LevelFilter; use sirius::{ commitment::CommitmentKey, ff::{Field, FromUniformBytes, PrimeFieldBits}, - group::{prime::PrimeCurve, Group}, + group::Group, halo2_proofs::{ circuit::{AssignedCell, Layouter}, plonk::ConstraintSystem, }, - halo2curves::{bn256, grumpkin, CurveAffine, CurveExt}, + halo2curves::{bn256, grumpkin, CurveAffine}, ivc::{ cyclefold::{PublicParams, IVC}, - step_circuit, StepCircuit, SynthesisError, + StepCircuit, SynthesisError, }, main_gate::{MainGate, MainGateConfig, RegionCtx, WrapValue}, - poseidon::{self, poseidon_circuit::PoseidonChip, ROPair, Spec}, + poseidon::{poseidon_circuit::PoseidonChip, Spec}, }; use tracing::*; use tracing_subscriber::{fmt::format::FmtSpan, EnvFilter}; @@ -26,7 +25,6 @@ use tracing_subscriber::{fmt::format::FmtSpan, EnvFilter}; const ARITY: usize = 1; const CIRCUIT_TABLE_SIZE1: usize = 17; -const CIRCUIT_TABLE_SIZE2: usize = 17; const COMMITMENT_KEY_SIZE: usize = 21; // Spec for user defined poseidon circuit @@ -76,22 +74,7 @@ impl> StepCircuit for TestPos } } -// specs for IVC circuit -const T: usize = 5; -const RATE: usize = 4; - -type RandomOracle = poseidon::PoseidonRO; - -type RandomOracleConstant = >::Args; - -const LIMB_WIDTH: NonZeroUsize = unsafe { NonZeroUsize::new_unchecked(32) }; -const LIMBS_COUNT: NonZeroUsize = unsafe { NonZeroUsize::new_unchecked(10) }; - -type C1Affine = ::Affine; -type C2Affine = ::Affine; - type C1Scalar = ::Scalar; -type C2Scalar = ::Scalar; const FOLDER: &str = ".cache/examples"; @@ -109,11 +92,6 @@ pub fn criterion_benchmark(c: &mut Criterion) { // C1 let sc1 = TestPoseidonCircuit::default(); - // C2 - let sc2 = step_circuit::trivial::Circuit::::default(); - - let primary_spec = RandomOracleConstant::<::ScalarExt>::new(10, 10); - let secondary_spec = RandomOracleConstant::<::ScalarExt>::new(10, 10); let primary_commitment_key = get_or_create_commitment_key::(COMMITMENT_KEY_SIZE, "bn256") @@ -122,32 +100,11 @@ pub fn criterion_benchmark(c: &mut Criterion) { get_or_create_commitment_key::(COMMITMENT_KEY_SIZE, "grumpkin") .expect("Failed to get primary key"); - let pp = PublicParams::< - '_, - ARITY, - ARITY, - T, - C1Affine, - C2Affine, - TestPoseidonCircuit<_>, - step_circuit::trivial::Circuit, - RandomOracle, - RandomOracle, - >::new( - CircuitPublicParamsInput::new( - CIRCUIT_TABLE_SIZE1 as u32, - &primary_commitment_key, - primary_spec, - &sc1, - ), - CircuitPublicParamsInput::new( - CIRCUIT_TABLE_SIZE2 as u32, - &secondary_commitment_key, - secondary_spec, - &sc2, - ), - LIMB_WIDTH, - LIMBS_COUNT, + let mut pp = PublicParams::new( + &sc1, + primary_commitment_key, + secondary_commitment_key, + CIRCUIT_TABLE_SIZE1 as u32, ) .unwrap(); @@ -159,36 +116,14 @@ pub fn criterion_benchmark(c: &mut Criterion) { group.bench_function("fold_1_step", |b| { let mut rnd = rand::thread_rng(); let primary_z_0 = array::from_fn(|_| C1Scalar::random(&mut rnd)); - let secondary_z_0 = array::from_fn(|_| C2Scalar::random(&mut rnd)); b.iter(|| { - IVC::fold( - &pp, - &sc1, - black_box(primary_z_0), - &sc2, - black_box(secondary_z_0), - NonZeroUsize::new(1).unwrap(), - ) - .unwrap(); - }) - }); - - group.bench_function("fold_2_step", |b| { - let mut rnd = rand::thread_rng(); - let primary_z_0 = array::from_fn(|_| C1Scalar::random(&mut rnd)); - let secondary_z_0 = array::from_fn(|_| C2Scalar::random(&mut rnd)); - - b.iter(|| { - IVC::fold( - &pp, - &sc1, - black_box(primary_z_0), - &sc2, - black_box(secondary_z_0), - NonZeroUsize::new(2).unwrap(), - ) - .unwrap(); + IVC::new(&mut pp, &sc1, primary_z_0) + .expect("while step=0") + .next(&pp, &sc1) + .expect("while step=1") + .verify(&pp) + .expect("while verify"); }) });