forked from privacy-scaling-explorations/snark-verifier
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Minor compatibility updates (privacy-scaling-explorations#5)
* feat: add bench for zkEVM EVM + State circuit aggregation * chore: minor update with new `print_stats` * chore: update Cargo * chore: change `AggregationConfigParams` to allow multi-phase advice columns * chore: update Cargo * sdk: remove `ExtraCircuitParams` from `CircuitExt` and just allow `num_instance` to depend on circuit itself * feat: change `EvmSingleVerifierCircuit` to `PublicAggregationCircuit` * aggregation circuit that passes through instances from multiple snarks * assumes snarks are either all aggregation circuits or all non-aggregation circuits when determining passthrough logic * chore: update pk serialization to new halo2_proofs API
- Loading branch information
1 parent
6bc8ac2
commit a1c07a5
Showing
17 changed files
with
356 additions
and
110 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,187 @@ | ||
use ark_std::{end_timer, start_timer}; | ||
use halo2_base::halo2_proofs; | ||
use halo2_base::utils::fs::gen_srs; | ||
use halo2_proofs::halo2curves::bn256::Fr; | ||
use rand::SeedableRng; | ||
use rand_chacha::ChaCha20Rng; | ||
use snark_verifier::loader::native::NativeLoader; | ||
use snark_verifier_sdk::{ | ||
self, | ||
evm::{ | ||
evm_verify, gen_evm_proof_gwc, gen_evm_proof_shplonk, gen_evm_verifier_gwc, | ||
gen_evm_verifier_shplonk, | ||
}, | ||
gen_pk, | ||
halo2::{ | ||
aggregation::load_verify_circuit_degree, aggregation::AggregationCircuit, gen_proof_gwc, | ||
gen_proof_shplonk, gen_snark_gwc, gen_snark_shplonk, PoseidonTranscript, POSEIDON_SPEC, | ||
}, | ||
CircuitExt, | ||
}; | ||
use std::env::{set_var, var}; | ||
use std::path::Path; | ||
|
||
use criterion::{criterion_group, criterion_main}; | ||
use criterion::{BenchmarkId, Criterion}; | ||
use pprof::criterion::{Output, PProfProfiler}; | ||
|
||
pub mod zkevm { | ||
use super::Fr; | ||
use bus_mapping::{circuit_input_builder::CircuitsParams, mock::BlockData}; | ||
use eth_types::geth_types::GethData; | ||
use mock::TestContext; | ||
use zkevm_circuits::{ | ||
evm_circuit::{witness::block_convert, EvmCircuit}, | ||
state_circuit::StateCircuit, | ||
witness::RwMap, | ||
}; | ||
|
||
pub fn test_evm_circuit() -> EvmCircuit<Fr> { | ||
let empty_data: GethData = | ||
TestContext::<0, 0>::new(None, |_| {}, |_, _| {}, |b, _| b).unwrap().into(); | ||
|
||
let mut builder = BlockData::new_from_geth_data_with_params( | ||
empty_data.clone(), | ||
CircuitsParams::default(), | ||
) | ||
.new_circuit_input_builder(); | ||
|
||
builder.handle_block(&empty_data.eth_block, &empty_data.geth_traces).unwrap(); | ||
|
||
let block = block_convert(&builder.block, &builder.code_db).unwrap(); | ||
|
||
EvmCircuit::<Fr>::new(block) | ||
} | ||
|
||
pub fn test_state_circuit() -> StateCircuit<Fr> { | ||
StateCircuit::new(RwMap::default(), 1 << 16) | ||
} | ||
} | ||
|
||
fn bench(c: &mut Criterion) { | ||
let mut rng = ChaCha20Rng::from_entropy(); | ||
let mut transcript = | ||
PoseidonTranscript::<NativeLoader, _>::from_spec(vec![], POSEIDON_SPEC.clone()); | ||
|
||
// === create zkevm evm circuit snark === | ||
let k: u32 = var("DEGREE") | ||
.unwrap_or_else(|_| { | ||
set_var("DEGREE", "18"); | ||
"18".to_owned() | ||
}) | ||
.parse() | ||
.unwrap(); | ||
let evm_circuit = zkevm::test_evm_circuit(); | ||
let state_circuit = zkevm::test_state_circuit(); | ||
let params_app = gen_srs(k); | ||
let evm_snark = { | ||
let pk = gen_pk(¶ms_app, &evm_circuit, Some(Path::new("data/zkevm_evm.pkey"))); | ||
gen_snark_gwc( | ||
¶ms_app, | ||
&pk, | ||
evm_circuit, | ||
&mut transcript, | ||
&mut rng, | ||
Some(Path::new("data/zkevm_evm.snark")), | ||
) | ||
}; | ||
let state_snark = { | ||
let pk = gen_pk(¶ms_app, &state_circuit, Some(Path::new("data/zkevm_state.pkey"))); | ||
gen_snark_shplonk( | ||
¶ms_app, | ||
&pk, | ||
state_circuit, | ||
&mut transcript, | ||
&mut rng, | ||
Some(Path::new("data/zkevm_state.snark")), | ||
) | ||
}; | ||
let snarks = [evm_snark, state_snark]; | ||
// === finished zkevm evm circuit === | ||
|
||
// === now to do aggregation === | ||
set_var("VERIFY_CONFIG", "./configs/bench_zkevm_plus_state.config"); | ||
let k = load_verify_circuit_degree(); | ||
let params = gen_srs(k); | ||
|
||
let start1 = start_timer!(|| "Create aggregation circuit"); | ||
let agg_circuit = AggregationCircuit::new(¶ms, snarks, &mut transcript, &mut rng); | ||
end_timer!(start1); | ||
|
||
let pk = gen_pk(¶ms, &agg_circuit, None); | ||
|
||
let mut group = c.benchmark_group("shplonk-proof"); | ||
group.sample_size(10); | ||
group.bench_with_input( | ||
BenchmarkId::new("zkevm-evm-state-agg", k), | ||
&(¶ms, &pk, &agg_circuit), | ||
|b, &(params, pk, agg_circuit)| { | ||
b.iter(|| { | ||
let instances = agg_circuit.instances(); | ||
gen_proof_shplonk( | ||
params, | ||
pk, | ||
agg_circuit.clone(), | ||
instances, | ||
&mut transcript, | ||
&mut rng, | ||
None, | ||
); | ||
}) | ||
}, | ||
); | ||
group.finish(); | ||
|
||
let mut group = c.benchmark_group("gwc-proof"); | ||
group.sample_size(10); | ||
group.bench_with_input( | ||
BenchmarkId::new("zkevm-evm-state-agg", k), | ||
&(¶ms, &pk, &agg_circuit), | ||
|b, &(params, pk, agg_circuit)| { | ||
b.iter(|| { | ||
let instances = agg_circuit.instances(); | ||
gen_proof_gwc( | ||
params, | ||
pk, | ||
agg_circuit.clone(), | ||
instances, | ||
&mut transcript, | ||
&mut rng, | ||
None, | ||
); | ||
}) | ||
}, | ||
); | ||
group.finish(); | ||
|
||
#[cfg(feature = "loader_evm")] | ||
{ | ||
let deployment_code = | ||
gen_evm_verifier_shplonk::<AggregationCircuit>(¶ms, pk.get_vk(), &(), None::<&str>); | ||
|
||
let start2 = start_timer!(|| "Create EVM SHPLONK proof"); | ||
let proof = gen_evm_proof_shplonk( | ||
¶ms, | ||
&pk, | ||
agg_circuit.clone(), | ||
agg_circuit.instances(), | ||
&mut rng, | ||
); | ||
end_timer!(start2); | ||
|
||
evm_verify(deployment_code, agg_circuit.instances(), proof); | ||
|
||
let deployment_code = | ||
gen_evm_verifier_shplonk::<AggregationCircuit>(¶ms, pk.get_vk(), &(), None::<&str>); | ||
|
||
let start2 = start_timer!(|| "Create EVM GWC proof"); | ||
let proof = | ||
gen_evm_proof_gwc(¶ms, &pk, agg_circuit.clone(), agg_circuit.instances(), &mut rng); | ||
end_timer!(start2); | ||
|
||
evm_verify(deployment_code, agg_circuit.instances(), proof); | ||
} | ||
} | ||
|
||
criterion_group!(benches, bench); | ||
criterion_main!(benches); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1 +1 @@ | ||
{"strategy":"Simple","degree":23,"num_advice":5,"num_lookup_advice":1,"num_fixed":1,"lookup_bits":22,"limb_bits":88,"num_limbs":3} | ||
{"strategy":"Simple","degree":23,"num_advice":[5],"num_lookup_advice":[1],"num_fixed":1,"lookup_bits":22,"limb_bits":88,"num_limbs":3} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1 +1 @@ | ||
{"strategy":"Simple","degree":21,"num_advice":5,"num_lookup_advice":1,"num_fixed":1,"lookup_bits":20,"limb_bits":88,"num_limbs":3} | ||
{"strategy":"Simple","degree":21,"num_advice":[5],"num_lookup_advice":[1],"num_fixed":1,"lookup_bits":20,"limb_bits":88,"num_limbs":3} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1 +1 @@ | ||
{"strategy":"Simple","degree":21,"num_advice":4,"num_lookup_advice":1,"num_fixed":1,"lookup_bits":20,"limb_bits":88,"num_limbs":3} | ||
{"strategy":"Simple","degree":21,"num_advice":[4],"num_lookup_advice":[1],"num_fixed":1,"lookup_bits":20,"limb_bits":88,"num_limbs":3} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.