From 49964231d752625607b6a4bb716369e8a3c5091d Mon Sep 17 00:00:00 2001 From: Jonathan Wang <31040440+jonathanpwang@users.noreply.github.com> Date: Mon, 10 Jul 2023 20:41:44 -0400 Subject: [PATCH 1/2] feat: remove use of env vars for circuit configuration This is a companion to https://github.com/axiom-crypto/halo2-lib/pull/92 --- snark-verifier-sdk/Cargo.toml | 2 +- snark-verifier-sdk/benches/standard_plonk.rs | 13 +- snark-verifier-sdk/src/halo2/aggregation.rs | 52 ++++--- snark-verifier/Cargo.toml | 4 +- .../examples/evm-verifier-with-accumulator.rs | 145 +++++------------- snark-verifier/examples/recursion.rs | 127 +++++---------- 6 files changed, 110 insertions(+), 233 deletions(-) diff --git a/snark-verifier-sdk/Cargo.toml b/snark-verifier-sdk/Cargo.toml index 986f30eb..896dbccf 100644 --- a/snark-verifier-sdk/Cargo.toml +++ b/snark-verifier-sdk/Cargo.toml @@ -17,7 +17,7 @@ serde_json = "1.0" serde_with = { version = "2.2", optional = true } bincode = "1.3.3" ark-std = { version = "0.3.0", features = ["print-trace"], optional = true } -halo2-base = { git = "https://github.com/axiom-crypto/halo2-lib.git", branch = "develop", default-features = false } +halo2-base = { git = "https://github.com/axiom-crypto/halo2-lib.git", branch = "feat/test_suite", default-features = false } snark-verifier = { path = "../snark-verifier", default-features = false } # loader_evm diff --git a/snark-verifier-sdk/benches/standard_plonk.rs b/snark-verifier-sdk/benches/standard_plonk.rs index 70d600ea..f696f822 100644 --- a/snark-verifier-sdk/benches/standard_plonk.rs +++ b/snark-verifier-sdk/benches/standard_plonk.rs @@ -1,17 +1,16 @@ +use ark_std::{end_timer, start_timer}; use criterion::{criterion_group, criterion_main}; use criterion::{BenchmarkId, Criterion}; -use halo2_base::gates::builder::CircuitBuilderStage; -use halo2_base::utils::fs::gen_srs; -use pprof::criterion::{Output, PProfProfiler}; -use rand::rngs::OsRng; -use std::path::Path; -use ark_std::{end_timer, start_timer}; +use halo2_base::gates::builder::{CircuitBuilderStage, BASE_CONFIG_PARAMS}; use halo2_base::halo2_proofs; +use halo2_base::utils::fs::gen_srs; use halo2_proofs::halo2curves as halo2_curves; use halo2_proofs::{ halo2curves::bn256::Bn256, poly::{commitment::Params, kzg::commitment::ParamsKZG}, }; +use pprof::criterion::{Output, PProfProfiler}; +use rand::rngs::OsRng; use snark_verifier_sdk::evm::{evm_verify, gen_evm_proof_shplonk, gen_evm_verifier_shplonk}; use snark_verifier_sdk::halo2::aggregation::AggregationConfigParams; use snark_verifier_sdk::{ @@ -20,6 +19,7 @@ use snark_verifier_sdk::{ Snark, }; use snark_verifier_sdk::{CircuitExt, SHPLONK}; +use std::path::Path; mod application { use super::halo2_curves::bn256::Fr; @@ -185,6 +185,7 @@ fn bench(c: &mut Criterion) { let snarks = [(); 3].map(|_| gen_application_snark(¶ms_app)); let agg_config = AggregationConfigParams::from_path(path); + BASE_CONFIG_PARAMS.with(|params| *params.borrow_mut() = agg_config.into()); let params = gen_srs(agg_config.degree); let lookup_bits = params.k() as usize - 1; diff --git a/snark-verifier-sdk/src/halo2/aggregation.rs b/snark-verifier-sdk/src/halo2/aggregation.rs index b5dc148d..9f9ac64a 100644 --- a/snark-verifier-sdk/src/halo2/aggregation.rs +++ b/snark-verifier-sdk/src/halo2/aggregation.rs @@ -3,10 +3,11 @@ use crate::{BITS, LIMBS}; use halo2_base::{ gates::{ builder::{ - CircuitBuilderStage, FlexGateConfigParams, GateThreadBuilder, - MultiPhaseThreadBreakPoints, RangeCircuitBuilder, RangeWithInstanceCircuitBuilder, - RangeWithInstanceConfig, + BaseConfigParams, CircuitBuilderStage, GateThreadBuilder, MultiPhaseThreadBreakPoints, + PublicBaseConfig, RangeCircuitBuilder, RangeWithInstanceCircuitBuilder, + BASE_CONFIG_PARAMS, }, + flex_gate::GateStrategy, RangeChip, }, halo2_proofs::{ @@ -38,12 +39,7 @@ use snark_verifier::{ }, verifier::SnarkVerifier, }; -use std::{ - env::{set_var, var}, - fs::File, - path::Path, - rc::Rc, -}; +use std::{fs::File, path::Path, rc::Rc}; use super::{CircuitExt, PoseidonTranscript, Snark, POSEIDON_SPEC}; @@ -143,7 +139,7 @@ where /// Same as `FlexGateConfigParams` except we assume a single Phase and default 'Vertical' strategy. /// Also adds `lookup_bits` field. -#[derive(Clone, Debug, Serialize, Deserialize)] +#[derive(Clone, Copy, Debug, Serialize, Deserialize)] pub struct AggregationConfigParams { pub degree: u32, pub num_advice: usize, @@ -159,6 +155,19 @@ impl AggregationConfigParams { } } +impl From for BaseConfigParams { + fn from(params: AggregationConfigParams) -> Self { + BaseConfigParams { + strategy: GateStrategy::Vertical, + k: params.degree as usize, + num_advice_per_phase: vec![params.num_advice], + num_lookup_advice_per_phase: vec![params.num_lookup_advice], + num_fixed: params.num_fixed, + lookup_bits: Some(params.lookup_bits), + } + } +} + #[derive(Clone, Debug)] pub struct AggregationCircuit { pub inner: RangeWithInstanceCircuitBuilder, @@ -314,11 +323,12 @@ impl AggregationCircuit { where AS: for<'a> Halo2KzgAccumulationScheme<'a>, { - let lookup_bits = params.k() as usize - 1; // almost always we just use the max lookup bits possible, which is k - 1 because of blinding factors + let lookup_bits = BASE_CONFIG_PARAMS + .with(|conf| conf.borrow().lookup_bits) + .unwrap_or(params.k() as usize - 1); let circuit = Self::new::(CircuitBuilderStage::Keygen, None, lookup_bits, params, snarks); circuit.config(params.k(), Some(10)); - set_var("LOOKUP_BITS", lookup_bits.to_string()); circuit } @@ -331,18 +341,16 @@ impl AggregationCircuit { where AS: for<'a> Halo2KzgAccumulationScheme<'a>, { - let lookup_bits: usize = var("LOOKUP_BITS").expect("LOOKUP_BITS not set").parse().unwrap(); - let circuit = Self::new::( + let lookup_bits = BASE_CONFIG_PARAMS + .with(|conf| conf.borrow().lookup_bits) + .unwrap_or(params.k() as usize - 1); + Self::new::( CircuitBuilderStage::Prover, Some(break_points), lookup_bits, params, snarks, - ); - let minimum_rows = var("MINIMUM_ROWS").map(|s| s.parse().unwrap_or(10)).unwrap_or(10); - circuit.config(params.k(), Some(minimum_rows)); - set_var("LOOKUP_BITS", lookup_bits.to_string()); - circuit + ) } /// Re-expose the previous public instances of aggregated snarks again. @@ -359,7 +367,7 @@ impl AggregationCircuit { &self.as_proof[..] } - pub fn config(&self, k: u32, minimum_rows: Option) -> FlexGateConfigParams { + pub fn config(&self, k: u32, minimum_rows: Option) -> BaseConfigParams { self.inner.config(k, minimum_rows) } @@ -386,12 +394,12 @@ impl CircuitExt for RangeWithInstanceCircuitBuilder { } fn selectors(config: &Self::Config) -> Vec { - config.range.gate.basic_gates[0].iter().map(|gate| gate.q_enable).collect() + config.base.gate().basic_gates[0].iter().map(|gate| gate.q_enable).collect() } } impl Circuit for AggregationCircuit { - type Config = RangeWithInstanceConfig; + type Config = PublicBaseConfig; type FloorPlanner = SimpleFloorPlanner; fn without_witnesses(&self) -> Self { diff --git a/snark-verifier/Cargo.toml b/snark-verifier/Cargo.toml index 313fd038..bf8b7fd5 100644 --- a/snark-verifier/Cargo.toml +++ b/snark-verifier/Cargo.toml @@ -14,7 +14,7 @@ rand = "0.8" serde = { version = "1.0", features = ["derive"] } # Use halo2-base as non-optional dependency because it re-exports halo2_proofs, halo2curves, and poseidon, using different repos based on feature flag "halo2-axiom" or "halo2-pse" -halo2-base = { git = "https://github.com/axiom-crypto/halo2-lib.git", branch = "develop", default-features = false } +halo2-base = { git = "https://github.com/axiom-crypto/halo2-lib.git", branch = "feat/test_suite", default-features = false } # This is Scroll's audited poseidon circuit. We only use it for the Native Poseidon spec. We do not use the halo2 circuit at all (and it wouldn't even work because the halo2_proofs tag is not compatbile). poseidon-circuit = { git = "https://github.com/scroll-tech/poseidon-circuit.git", rev = "50015b7" } @@ -29,7 +29,7 @@ rlp = { version = "0.5.2", default-features = false, features = ["std"], optiona revm = { version = "2.3.1", optional = true } # loader_halo2 -halo2-ecc = { git = "https://github.com/axiom-crypto/halo2-lib.git", branch = "develop", default-features = false, optional = true } +halo2-ecc = { git = "https://github.com/axiom-crypto/halo2-lib.git", branch = "feat/test_suite", default-features = false, optional = true } [dev-dependencies] ark-std = { version = "0.3.0", features = ["print-trace"] } diff --git a/snark-verifier/examples/evm-verifier-with-accumulator.rs b/snark-verifier/examples/evm-verifier-with-accumulator.rs index dd537880..4ffa6459 100644 --- a/snark-verifier/examples/evm-verifier-with-accumulator.rs +++ b/snark-verifier/examples/evm-verifier-with-accumulator.rs @@ -1,5 +1,9 @@ use aggregation::{AggregationCircuit, AggregationConfigParams}; -use halo2_base::{gates::builder::CircuitBuilderStage, halo2_proofs, utils::fs::gen_srs}; +use halo2_base::{ + gates::builder::{set_lookup_bits, CircuitBuilderStage}, + halo2_proofs, + utils::fs::gen_srs, +}; use halo2_proofs::{ dev::MockProver, halo2curves::bn256::{Bn256, Fq, Fr, G1Affine}, @@ -26,7 +30,7 @@ use snark_verifier::{ system::halo2::{compile, transcript::evm::EvmTranscript, Config}, verifier::{self, SnarkVerifier}, }; -use std::{env::set_var, fs::File, io::Cursor, rc::Rc}; +use std::{fs::File, io::Cursor, rc::Rc}; const LIMBS: usize = 3; const BITS: usize = 88; @@ -200,20 +204,16 @@ mod aggregation { use super::halo2_proofs::{ circuit::{Layouter, SimpleFloorPlanner}, - plonk::{self, Circuit, Column, Instance}, + plonk::{self, Circuit}, }; use super::{As, BITS, LIMBS}; use super::{Fr, G1Affine}; - use halo2_base::{ - gates::{ - builder::{ - assign_threads_in, CircuitBuilderStage, FlexGateConfigParams, GateThreadBuilder, - MultiPhaseThreadBreakPoints, RangeCircuitBuilder, - }, - range::RangeConfig, - RangeChip, + use halo2_base::gates::{ + builder::{ + BaseConfigParams, CircuitBuilderStage, GateThreadBuilder, MultiPhaseThreadBreakPoints, + PublicBaseConfig, RangeWithInstanceCircuitBuilder, }, - AssignedValue, SKIP_FIRST_PASS, + RangeChip, }; use halo2_ecc::bn254::FpChip; use itertools::Itertools; @@ -228,7 +228,7 @@ mod aggregation { util::arithmetic::fe_to_limbs, verifier::{plonk::PlonkProtocol, SnarkVerifier}, }; - use std::{collections::HashMap, rc::Rc}; + use std::rc::Rc; const T: usize = 3; const RATE: usize = 2; @@ -309,17 +309,10 @@ mod aggregation { pub lookup_bits: usize, } - #[derive(Clone)] - pub struct AggregationConfig { - pub range: RangeConfig, - pub instance: Column, - } - #[derive(Clone, Debug)] pub struct AggregationCircuit { - pub circuit: RangeCircuitBuilder, + pub inner: RangeWithInstanceCircuitBuilder, pub as_proof: Vec, - pub assigned_instances: Vec>, } impl AggregationCircuit { @@ -398,22 +391,28 @@ mod aggregation { } let builder = loader.take_ctx(); - let circuit = match stage { - CircuitBuilderStage::Mock => RangeCircuitBuilder::mock(builder), - CircuitBuilderStage::Keygen => RangeCircuitBuilder::keygen(builder), - CircuitBuilderStage::Prover => { - RangeCircuitBuilder::prover(builder, break_points.unwrap()) + let inner = match stage { + CircuitBuilderStage::Mock => { + RangeWithInstanceCircuitBuilder::mock(builder, assigned_instances) + } + CircuitBuilderStage::Keygen => { + RangeWithInstanceCircuitBuilder::keygen(builder, assigned_instances) } + CircuitBuilderStage::Prover => RangeWithInstanceCircuitBuilder::prover( + builder, + assigned_instances, + break_points.unwrap(), + ), }; - Self { circuit, as_proof, assigned_instances } + Self { inner, as_proof } } - pub fn config(&self, k: u32, minimum_rows: Option) -> FlexGateConfigParams { - self.circuit.0.builder.borrow().config(k as usize, minimum_rows) + pub fn config(&self, k: u32, minimum_rows: Option) -> BaseConfigParams { + self.inner.circuit.0.builder.borrow().config(k as usize, minimum_rows) } pub fn break_points(&self) -> MultiPhaseThreadBreakPoints { - self.circuit.0.break_points.borrow().clone() + self.inner.circuit.0.break_points.borrow().clone() } pub fn num_instance() -> Vec { @@ -422,7 +421,7 @@ mod aggregation { } pub fn instances(&self) -> Vec> { - vec![self.assigned_instances.iter().map(|v| *v.value()).collect_vec()] + vec![self.inner.assigned_instances.iter().map(|v| *v.value()).collect_vec()] } pub fn accumulator_indices() -> Vec<(usize, usize)> { @@ -431,7 +430,7 @@ mod aggregation { } impl Circuit for AggregationCircuit { - type Config = AggregationConfig; + type Config = PublicBaseConfig; type FloorPlanner = SimpleFloorPlanner; fn without_witnesses(&self) -> Self { @@ -439,89 +438,15 @@ mod aggregation { } fn configure(meta: &mut plonk::ConstraintSystem) -> Self::Config { - let range = RangeCircuitBuilder::configure(meta); - let instance = meta.instance_column(); - meta.enable_equality(instance); - AggregationConfig { range, instance } + RangeWithInstanceCircuitBuilder::configure(meta) } fn synthesize( &self, config: Self::Config, - mut layouter: impl Layouter, + layouter: impl Layouter, ) -> Result<(), plonk::Error> { - // copied from RangeCircuitBuilder::synthesize but with extra logic to expose public instances - let range = config.range; - let circuit = &self.circuit.0; - range.load_lookup_table(&mut layouter).expect("load lookup table should not fail"); - - // we later `take` the builder, so we need to save this value - let witness_gen_only = circuit.builder.borrow().witness_gen_only(); - let mut assigned_advices = HashMap::new(); - - let mut first_pass = SKIP_FIRST_PASS; - layouter - .assign_region( - || "AggregationCircuit", - |mut region| { - if first_pass { - first_pass = false; - return Ok(()); - } - // only support FirstPhase in this Builder because getting challenge value requires more specialized witness generation during synthesize - if !witness_gen_only { - // clone the builder so we can re-use the circuit for both vk and pk gen - let builder = circuit.builder.borrow(); - let assignments = builder.assign_all( - &range.gate, - &range.lookup_advice, - &range.q_lookup, - &mut region, - Default::default(), - ); - *circuit.break_points.borrow_mut() = assignments.break_points; - assigned_advices = assignments.assigned_advices; - } else { - #[cfg(feature = "display")] - let start0 = std::time::Instant::now(); - let builder = circuit.builder.take(); - let break_points = circuit.break_points.take(); - for (phase, (threads, break_points)) in builder - .threads - .into_iter() - .zip(break_points.into_iter()) - .enumerate() - .take(1) - { - assign_threads_in( - phase, - threads, - &range.gate, - &range.lookup_advice[phase], - &mut region, - break_points, - ); - } - #[cfg(feature = "display")] - println!("assign threads in {:?}", start0.elapsed()); - } - Ok(()) - }, - ) - .unwrap(); - - if !witness_gen_only { - // expose public instances - let mut layouter = layouter.namespace(|| "expose"); - for (i, instance) in self.assigned_instances.iter().enumerate() { - let cell = instance.cell.unwrap(); - let (cell, _) = assigned_advices - .get(&(cell.context_id, cell.offset)) - .expect("instance not assigned"); - layouter.constrain_instance(*cell, config.instance, i); - } - } - Ok(()) + self.inner.synthesize(config, layouter) } } } @@ -649,6 +574,7 @@ fn main() { File::open(path).unwrap_or_else(|e| panic!("{path} does not exist: {e:?}")), ) .unwrap(); + set_lookup_bits(agg_config.lookup_bits); let agg_circuit = AggregationCircuit::new( CircuitBuilderStage::Mock, None, @@ -657,7 +583,6 @@ fn main() { snarks.clone(), ); agg_circuit.config(agg_config.degree, Some(6)); - set_var("LOOKUP_BITS", agg_config.lookup_bits.to_string()); #[cfg(debug_assertions)] { MockProver::run(agg_config.degree, &agg_circuit, agg_circuit.instances()) diff --git a/snark-verifier/examples/recursion.rs b/snark-verifier/examples/recursion.rs index 5829e1b7..7415e1ab 100644 --- a/snark-verifier/examples/recursion.rs +++ b/snark-verifier/examples/recursion.rs @@ -2,9 +2,10 @@ use ark_std::{end_timer, start_timer}; use common::*; -use halo2_base::gates::flex_gate::GateStrategy; +use halo2_base::gates::builder::BaseConfigParams; +use halo2_base::gates::{builder::BASE_CONFIG_PARAMS, flex_gate::GateStrategy}; +use halo2_base::halo2_proofs; use halo2_base::utils::fs::gen_srs; -use halo2_base::{gates::builder::FlexGateConfigParams, halo2_proofs}; use halo2_proofs::{ circuit::{Layouter, SimpleFloorPlanner}, dev::MockProver, @@ -46,7 +47,7 @@ use snark_verifier::{ SnarkVerifier, }, }; -use std::{env::set_var, fs, iter, marker::PhantomData, rc::Rc}; +use std::{fs, iter, marker::PhantomData, rc::Rc}; use crate::recursion::AggregationConfigParams; @@ -323,18 +324,17 @@ mod application { } mod recursion { - use std::{collections::HashMap, env::var}; - use halo2_base::{ gates::{ - builder::{GateThreadBuilder, RangeCircuitBuilder}, - range::RangeConfig, + builder::{ + GateThreadBuilder, PublicBaseConfig, RangeWithInstanceCircuitBuilder, + BASE_CONFIG_PARAMS, + }, GateInstructions, RangeChip, RangeInstructions, }, AssignedValue, }; use halo2_ecc::{bn254::FpChip, ecc::EcPoint}; - use halo2_proofs::plonk::{Column, Instance}; use snark_verifier::loader::halo2::{EccInstructions, IntegerInstructions}; use super::*; @@ -412,8 +412,8 @@ mod recursion { .map(|(lhs, rhs)| { loader.ecc_chip().select( loader.ctx_mut().main(0), - EcPoint::clone(&lhs), - EcPoint::clone(&rhs), + EcPoint::clone(lhs), + EcPoint::clone(rhs), *condition, ) }) @@ -446,24 +446,18 @@ mod recursion { pub lookup_bits: usize, } - #[derive(Clone)] - pub struct RecursionConfig { - pub range: RangeConfig, - pub instance: Column, - } - #[derive(Clone)] pub struct RecursionCircuit { svk: Svk, default_accumulator: KzgAccumulator, app: Snark, previous: Snark, + #[allow(dead_code)] round: usize, instances: Vec, as_proof: Vec, - inner: RangeCircuitBuilder, - assigned_instances: Vec>, + inner: RangeWithInstanceCircuitBuilder, } impl RecursionCircuit { @@ -534,24 +528,16 @@ mod recursion { .collect(); let builder = GateThreadBuilder::mock(); - let inner = RangeCircuitBuilder::mock(builder); - let mut circuit = Self { - svk, - default_accumulator, - app: app, - previous: previous, - round, - instances, - as_proof, - inner, - assigned_instances: vec![], - }; + let inner = RangeWithInstanceCircuitBuilder::mock(builder, vec![]); + let mut circuit = + Self { svk, default_accumulator, app, previous, round, instances, as_proof, inner }; circuit.build(); circuit } fn build(&mut self) { - let lookup_bits = var("LOOKUP_BITS").unwrap().parse().unwrap(); + let lookup_bits = + BASE_CONFIG_PARAMS.with(|params| params.borrow().lookup_bits.unwrap()); let range = RangeChip::::default(lookup_bits); let main_gate = range.gate(); let mut builder = GateThreadBuilder::mock(); @@ -629,9 +615,9 @@ mod recursion { ] { ctx.constrain_equal(lhs, rhs); } - *self.inner.0.builder.borrow_mut() = builder; + *self.inner.circuit.0.builder.borrow_mut() = builder; - self.assigned_instances.extend( + self.inner.assigned_instances.extend( [lhs.x(), lhs.y(), rhs.x(), rhs.y()] .into_iter() .flat_map(|coordinate| coordinate.limbs()) @@ -670,7 +656,7 @@ mod recursion { } impl Circuit for RecursionCircuit { - type Config = RecursionConfig; + type Config = PublicBaseConfig; type FloorPlanner = SimpleFloorPlanner; fn without_witnesses(&self) -> Self { @@ -678,59 +664,15 @@ mod recursion { } fn configure(meta: &mut plonk::ConstraintSystem) -> Self::Config { - let range = RangeCircuitBuilder::configure(meta); - let instance = meta.instance_column(); - meta.enable_equality(instance); - RecursionConfig { range, instance } + RangeWithInstanceCircuitBuilder::configure(meta) } fn synthesize( &self, config: Self::Config, - mut layouter: impl Layouter, + layouter: impl Layouter, ) -> Result<(), Error> { - let range = config.range; - range.load_lookup_table(&mut layouter).expect("load lookup table should not fail"); - let circuit = &self.inner.0; - - let mut assigned_advices = HashMap::new(); - // POC so will only do mock prover and not real prover - let mut first_pass = halo2_base::SKIP_FIRST_PASS; // assume using simple floor planner - layouter - .assign_region( - || "Recursion Circuit", - |mut region| { - if first_pass { - first_pass = false; - return Ok(()); - } - // clone the builder so we can re-use the circuit for both vk and pk gen - let builder = circuit.builder.borrow(); - let assignments = builder.assign_all( - &range.gate, - &range.lookup_advice, - &range.q_lookup, - &mut region, - Default::default(), - ); - *circuit.break_points.borrow_mut() = assignments.break_points; - assigned_advices = assignments.assigned_advices; - Ok(()) - }, - ) - .unwrap(); - - // expose public instances - let mut layouter = layouter.namespace(|| "expose"); - for (i, instance) in self.assigned_instances.iter().enumerate() { - let cell = instance.cell.unwrap(); - let (cell, _) = assigned_advices - .get(&(cell.context_id, cell.offset)) - .expect("instance not assigned"); - layouter.constrain_instance(*cell, config.instance, i); - } - - Ok(()) + self.inner.synthesize(config, layouter) } } @@ -749,7 +691,7 @@ mod recursion { } fn selectors(config: &Self::Config) -> Vec { - config.range.gate.basic_gates[0].iter().map(|gate| gate.q_enable).collect() + config.base.gate().basic_gates[0].iter().map(|gate| gate.q_enable).collect() } } @@ -805,20 +747,21 @@ mod recursion { } fn main() { - let app_params = gen_srs(3); + let app_params = gen_srs(5); let recursion_config: AggregationConfigParams = serde_json::from_reader(fs::File::open("configs/example_recursion.json").unwrap()).unwrap(); let k = recursion_config.degree; let recursion_params = gen_srs(k); - let flex_gate_config = FlexGateConfigParams { - strategy: GateStrategy::Vertical, - k: k as usize, - num_advice_per_phase: vec![recursion_config.num_advice], - num_lookup_advice_per_phase: vec![recursion_config.num_lookup_advice], - num_fixed: recursion_config.num_fixed, - }; - set_var("FLEX_GATE_CONFIG_PARAMS", serde_json::to_string(&flex_gate_config).unwrap()); - set_var("LOOKUP_BITS", recursion_config.lookup_bits.to_string()); + BASE_CONFIG_PARAMS.with(|params| { + *params.borrow_mut() = BaseConfigParams { + strategy: GateStrategy::Vertical, + k: k as usize, + num_advice_per_phase: vec![recursion_config.num_advice], + num_lookup_advice_per_phase: vec![recursion_config.num_lookup_advice], + num_fixed: recursion_config.num_fixed, + lookup_bits: Some(recursion_config.lookup_bits), + } + }); let app_pk = gen_pk(&app_params, &application::Square::default()); From b1b38e3f554b07c88d4a76e0ee84b004c73fa681 Mon Sep 17 00:00:00 2001 From: Jonathan Wang <31040440+jonathanpwang@users.noreply.github.com> Date: Mon, 10 Jul 2023 22:03:27 -0400 Subject: [PATCH 2/2] chore: remove rustfmt CI check PSE upstream uses different rustfmt configuration than us, so some files disagree in formatting --- .github/workflows/ci.yaml | 4 ---- snark-verifier/src/loader/evm/code.rs | 4 +--- 2 files changed, 1 insertion(+), 7 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 634eed77..e057f89d 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -29,7 +29,6 @@ jobs: - name: Run test run: cargo test --all -- --nocapture - lint: name: Lint runs-on: ubuntu-latest @@ -47,8 +46,5 @@ jobs: with: cache-on-failure: true - - name: Run fmt - run: cargo fmt --all -- --check - - name: Run clippy run: cargo clippy --all --all-targets -- -D warnings diff --git a/snark-verifier/src/loader/evm/code.rs b/snark-verifier/src/loader/evm/code.rs index 2fec71d2..236684d6 100644 --- a/snark-verifier/src/loader/evm/code.rs +++ b/snark-verifier/src/loader/evm/code.rs @@ -13,9 +13,7 @@ pub struct YulCode { impl YulCode { pub fn new() -> Self { - YulCode { - runtime: String::new(), - } + YulCode { runtime: String::new() } } pub fn code(&self, base_modulus: String, scalar_modulus: String) -> String {