diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index a3647a1b..f829d5a1 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -30,7 +30,16 @@ jobs: toolchain: nightly-2022-10-28 override: true components: rustfmt - - name: Check - run: cargo check --all - - name: Check - run: RUST_LOG="lightclient-circuits=debug" cargo test --release test_eth2_spec_mock + + - name: Install just + uses: extractions/setup-just@v1 + + - name: Download consensus spec + run: just download-spec-tests + + # skip this in favour of compiling in the `Test` action. + # - name: Check + # run: cargo check --all + + - name: Test + run: RUST_LOG="lightclient-circuits=debug" PARAMS_DIR="./test_data" cargo test --release test_eth2_spec_mock_1 -- --nocapture diff --git a/lightclient-circuits/src/aggregation.rs b/lightclient-circuits/src/aggregation.rs index c6e39ff3..c95e89f6 100644 --- a/lightclient-circuits/src/aggregation.rs +++ b/lightclient-circuits/src/aggregation.rs @@ -36,15 +36,16 @@ impl AppCircuit for AggregationCircuit { fn create_circuit( stage: CircuitBuilderStage, pinning: Option, - params: &ParamsKZG, snark: &Self::Witness, + k: u32, ) -> Result, halo2_proofs::plonk::Error> { - let lookup_bits = params.k() as usize - 1; + let lookup_bits = k as usize - 1; + let params = gen_srs(k); let mut circuit = AggregationCircuit::new::( stage, pinning.map(|p| p.break_points), lookup_bits, - params, + ¶ms, snark.clone(), ); @@ -53,7 +54,7 @@ impl AppCircuit for AggregationCircuit { circuit.expose_previous_instances(false); } _ => { - circuit.config(params.k(), Some(10)); + circuit.config(k, Some(10)); set_var("LOOKUP_BITS", lookup_bits.to_string()); } }; diff --git a/lightclient-circuits/src/committee_update_circuit.rs b/lightclient-circuits/src/committee_update_circuit.rs index 3faec832..1c6f3cb7 100644 --- a/lightclient-circuits/src/committee_update_circuit.rs +++ b/lightclient-circuits/src/committee_update_circuit.rs @@ -186,8 +186,8 @@ impl AppCircuit for CommitteeUpdateCircuit { fn create_circuit( stage: CircuitBuilderStage, pinning: Option, - params: &ParamsKZG, witness: &witness::CommitteeRotationArgs, + k: u32, ) -> Result, Error> { let mut thread_pool = ShaBitThreadBuilder::from_stage(stage); let range = RangeChip::::new(RangeStrategy::Vertical, 8); @@ -198,7 +198,7 @@ impl AppCircuit for CommitteeUpdateCircuit { CircuitBuilderStage::Prover => {} _ => { thread_pool.config( - params.k() as usize, + k as usize, Some( var("MINIMUM_ROWS") .unwrap_or_else(|_| "0".to_string()) @@ -305,8 +305,8 @@ mod tests { let circuit = CommitteeUpdateCircuit::::create_circuit( CircuitBuilderStage::Mock, Some(pinning), - ¶ms, &witness, + params.k(), ) .unwrap(); @@ -336,8 +336,8 @@ mod tests { let circuit = CommitteeUpdateCircuit::::create_circuit( CircuitBuilderStage::Prover, Some(pinning), - ¶ms, &witness, + K, ) .unwrap(); @@ -381,8 +381,8 @@ mod tests { let agg_circuit = AggregationCircuit::create_circuit( CircuitBuilderStage::Prover, Some(agg_config), - ¶ms, &vec![snark.clone()], + AGG_K, ) .unwrap(); diff --git a/lightclient-circuits/src/sync_step_circuit.rs b/lightclient-circuits/src/sync_step_circuit.rs index 61730a9a..580bff09 100644 --- a/lightclient-circuits/src/sync_step_circuit.rs +++ b/lightclient-circuits/src/sync_step_circuit.rs @@ -461,8 +461,8 @@ impl AppCircuit for SyncStepCircuit { fn create_circuit( stage: CircuitBuilderStage, pinning: Option, - params: &ParamsKZG, args: &Self::Witness, + k: u32, ) -> Result, Error> { let mut thread_pool = ShaThreadBuilder::from_stage(stage); let range = RangeChip::::new(RangeStrategy::Vertical, 8); @@ -473,7 +473,7 @@ impl AppCircuit for SyncStepCircuit { CircuitBuilderStage::Prover => {} _ => { thread_pool.config( - params.k() as usize, + k as usize, Some( var("MINIMUM_ROWS") .unwrap_or_else(|_| "0".to_string()) @@ -553,8 +553,8 @@ mod tests { let circuit = SyncStepCircuit::::create_circuit( CircuitBuilderStage::Mock, Some(pinning), - ¶ms, &witness, + K, ) .unwrap(); @@ -586,8 +586,8 @@ mod tests { let circuit = SyncStepCircuit::::create_circuit( CircuitBuilderStage::Prover, Some(pinning), - ¶ms, &witness, + K, ) .unwrap(); @@ -617,8 +617,8 @@ mod tests { let circuit = SyncStepCircuit::::create_circuit( CircuitBuilderStage::Prover, Some(pinning), - ¶ms, &witness, + K, ) .unwrap(); diff --git a/lightclient-circuits/src/util/circuit.rs b/lightclient-circuits/src/util/circuit.rs index 211579f1..c7b2e32f 100644 --- a/lightclient-circuits/src/util/circuit.rs +++ b/lightclient-circuits/src/util/circuit.rs @@ -6,6 +6,7 @@ use halo2_base::gates::builder::{ CircuitBuilderStage, FlexGateConfigParams, MultiPhaseThreadBreakPoints, }; use halo2_proofs::plonk::{Circuit, Error, VerifyingKey}; +use halo2_proofs::poly::commitment::Params; use halo2_proofs::{plonk::ProvingKey, poly::kzg::commitment::ParamsKZG}; use halo2curves::bn256::{Bn256, Fr, G1Affine}; use serde::{Deserialize, Serialize}; @@ -99,8 +100,8 @@ pub trait AppCircuit: Sized { fn create_circuit( stage: CircuitBuilderStage, pinning: Option, - params: &ParamsKZG, args: &Self::Witness, + k: u32, ) -> Result, Error>; /// Reads the proving key for the pre-circuit. @@ -111,7 +112,7 @@ pub trait AppCircuit: Sized { args: &Self::Witness, ) -> ProvingKey { let circuit = - Self::create_circuit(CircuitBuilderStage::Keygen, None, params, args).unwrap(); + Self::create_circuit(CircuitBuilderStage::Keygen, None, args, params.k()).unwrap(); custom_read_pk(path, &circuit) } @@ -124,7 +125,7 @@ pub trait AppCircuit: Sized { witness: &Self::Witness, ) -> ProvingKey { let circuit = - Self::create_circuit(CircuitBuilderStage::Keygen, None, params, witness).unwrap(); + Self::create_circuit(CircuitBuilderStage::Keygen, None, witness, params.k()).unwrap(); let pk_exists = pk_path.as_ref().exists(); let pk = gen_pk(params, &circuit, Some(pk_path.as_ref())); @@ -162,8 +163,12 @@ pub trait AppCircuit: Sized { witness: &Self::Witness, ) -> Result { let pinning = Self::Pinning::from_path(pinning_path); - let circuit = - Self::create_circuit(CircuitBuilderStage::Prover, Some(pinning), params, witness)?; + let circuit = Self::create_circuit( + CircuitBuilderStage::Prover, + Some(pinning), + witness, + params.k(), + )?; let snark = gen_snark_shplonk(params, pk, circuit, path); Ok(snark) @@ -175,7 +180,7 @@ pub trait AppCircuit: Sized { yul_path: Option>, witness: &Self::Witness, ) -> Result, Error> { - let circuit = Self::create_circuit(CircuitBuilderStage::Keygen, None, params, witness)?; + let circuit = Self::create_circuit(CircuitBuilderStage::Keygen, None, witness, params.k())?; let deployment_code = custom_gen_evm_verifier_shplonk(params, pk.get_vk(), &circuit, yul_path); @@ -191,8 +196,12 @@ pub trait AppCircuit: Sized { witness: &Self::Witness, ) -> Result<(Vec, Vec>), Error> { let pinning = Self::Pinning::from_path(pinning_path); - let circuit = - Self::create_circuit(CircuitBuilderStage::Prover, Some(pinning), params, witness)?; + let circuit = Self::create_circuit( + CircuitBuilderStage::Prover, + Some(pinning), + witness, + params.k(), + )?; let instances = circuit.instances(); let proof = gen_evm_proof_shplonk(params, pk, circuit, instances.clone()); @@ -208,8 +217,12 @@ pub trait AppCircuit: Sized { witness: &Self::Witness, ) -> Result { let pinning = Self::Pinning::from_path(pinning_path); - let circuit = - Self::create_circuit(CircuitBuilderStage::Prover, Some(pinning), params, witness)?; + let circuit = Self::create_circuit( + CircuitBuilderStage::Prover, + Some(pinning), + witness, + params.k(), + )?; let calldata = write_calldata_generic(params, pk, circuit, path, deployment_code); Ok(calldata) diff --git a/lightclient-circuits/tests/step.rs b/lightclient-circuits/tests/step.rs index 28884c48..1e4d8c05 100644 --- a/lightclient-circuits/tests/step.rs +++ b/lightclient-circuits/tests/step.rs @@ -366,15 +366,24 @@ fn read_test_files_and_gen_witness( } #[rstest] -fn test_eth2_spec_mock( +fn test_eth2_spec_mock_1( + #[files("../consensus-spec-tests/tests/minimal/capella/light_client/sync/pyspec_tests/light_client_sync")] + #[exclude("deneb*")] + path: PathBuf, +) { + run_test_eth2_spec_mock::<16, 20>(path) +} + +#[rstest] +fn test_eth2_spec_mock_3( #[files("../consensus-spec-tests/tests/minimal/capella/light_client/sync/pyspec_tests/**")] #[exclude("deneb*")] path: PathBuf, ) { - const K_ROTATION: u32 = 18; - const K_SYNC: u32 = 21; - let params = gen_srs(K_ROTATION); + run_test_eth2_spec_mock::<17, 20>(path) +} +fn run_test_eth2_spec_mock(path: PathBuf) { let (sync_witness, rotation_witness) = read_test_files_and_gen_witness(path); let rotation_circuit = { @@ -384,8 +393,8 @@ fn test_eth2_spec_mock( CommitteeUpdateCircuit::::create_circuit( CircuitBuilderStage::Mock, Some(pinning), - ¶ms, &rotation_witness, + K_ROTATION, ) .unwrap() }; @@ -400,16 +409,14 @@ fn test_eth2_spec_mock( prover.assert_satisfied_par(); end_timer!(timer); - let params = gen_srs(K_SYNC); - let sync_circuit = { let pinning: Eth2ConfigPinning = Eth2ConfigPinning::from_path("./config/sync_step.json"); SyncStepCircuit::::create_circuit( CircuitBuilderStage::Mock, Some(pinning), - ¶ms, &sync_witness, + K_SYNC, ) .unwrap() }; @@ -446,8 +453,8 @@ fn test_eth2_spec_proofgen( let circuit = SyncStepCircuit::::create_circuit( CircuitBuilderStage::Prover, Some(pinning), - ¶ms, &witness, + K, ) .unwrap(); @@ -481,8 +488,8 @@ fn test_eth2_spec_evm_verify( let circuit = SyncStepCircuit::::create_circuit( CircuitBuilderStage::Prover, Some(pinning), - ¶ms, &witness, + K, ) .unwrap(); diff --git a/preprocessor/src/sync.rs b/preprocessor/src/sync.rs index 1c98c36f..16f55931 100644 --- a/preprocessor/src/sync.rs +++ b/preprocessor/src/sync.rs @@ -195,7 +195,6 @@ mod tests { async fn test_sync_circuit_sepolia() { const CONFIG_PATH: &str = "../lightclient-circuits/config/sync_step.json"; const K: u32 = 21; - let params = gen_srs(K); let witness = fetch_step_args::("http://3.128.78.74:5052".to_string()) .await @@ -205,8 +204,8 @@ mod tests { let circuit = SyncStepCircuit::::create_circuit( CircuitBuilderStage::Mock, Some(pinning), - ¶ms, &witness, + K ) .unwrap();