Skip to content

Commit 4009e55

Browse files
lispcroynalnaruto
andauthored
(v0.13.1) Move params out of prover/verifier & Additional sanity check (#1405)
* refactor(prover): move params out of prover/verifier * clean * remove redundant function 'degrees' * add sanity check (decoded blob == batch bytes) --------- Co-authored-by: Rohit Narurkar <[email protected]>
1 parent cf71a0e commit 4009e55

23 files changed

+249
-189
lines changed

aggregator/src/eip4844.rs

+33
Original file line numberDiff line numberDiff line change
@@ -54,3 +54,36 @@ pub fn get_blob_bytes(batch_bytes: &[u8]) -> Vec<u8> {
5454

5555
blob_bytes
5656
}
57+
58+
/// Given the blob's bytes, take into account the first byte, i.e. enable_encoding? and either spit
59+
/// out the raw bytes or zstd decode them.
60+
pub fn decode_blob(blob_bytes: &[u8]) -> std::io::Result<Vec<u8>> {
61+
let enable_encoding = blob_bytes[0].eq(&1);
62+
63+
// If not encoded, spit out the rest of the bytes, as it is.
64+
if !enable_encoding {
65+
return Ok(blob_bytes[1..].to_vec());
66+
}
67+
68+
// The bytes following the first byte represent the zstd-encoded bytes.
69+
let mut encoded_bytes = blob_bytes[1..].to_vec();
70+
let mut encoded_len = encoded_bytes.len();
71+
let mut decoded_bytes = Vec::with_capacity(5 * 4096 * 32);
72+
loop {
73+
let mut decoder = zstd_encoder::zstd::stream::read::Decoder::new(encoded_bytes.as_slice())?;
74+
decoder.include_magicbytes(false)?;
75+
decoder.window_log_max(30)?;
76+
77+
decoded_bytes.clear();
78+
79+
if std::io::copy(&mut decoder, &mut decoded_bytes).is_ok() {
80+
break;
81+
}
82+
83+
// The error above means we need to truncate the suffix 0-byte.
84+
encoded_len -= 1;
85+
encoded_bytes.truncate(encoded_len);
86+
}
87+
88+
Ok(decoded_bytes)
89+
}

prover/src/aggregator/prover.rs

+24-8
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,17 @@
1-
use std::{env, iter::repeat};
1+
use std::{collections::BTreeMap, env, iter::repeat};
22

3-
use aggregator::{BatchHash, BatchHeader, ChunkInfo, MAX_AGG_SNARKS};
3+
use aggregator::{
4+
eip4844::decode_blob, BatchData, BatchHash, BatchHeader, ChunkInfo, MAX_AGG_SNARKS,
5+
};
46
use anyhow::{bail, Result};
57
use eth_types::H256;
8+
use halo2_proofs::{halo2curves::bn256::Bn256, poly::kzg::commitment::ParamsKZG};
69
use sha2::{Digest, Sha256};
710
use snark_verifier_sdk::Snark;
811

912
use crate::{
1013
common,
11-
config::{LayerId, AGG_DEGREES},
14+
config::LayerId,
1215
consts::{BATCH_KECCAK_ROW, BATCH_VK_FILENAME, BUNDLE_VK_FILENAME, CHUNK_PROTOCOL_FILENAME},
1316
io::{force_to_read, try_to_read},
1417
proof::BundleProof,
@@ -17,20 +20,23 @@ use crate::{
1720
};
1821

1922
#[derive(Debug)]
20-
pub struct Prover {
23+
pub struct Prover<'params> {
2124
// Make it public for testing with inner functions (unnecessary for FFI).
22-
pub prover_impl: common::Prover,
25+
pub prover_impl: common::Prover<'params>,
2326
pub chunk_protocol: Vec<u8>,
2427
raw_vk_batch: Option<Vec<u8>>,
2528
raw_vk_bundle: Option<Vec<u8>>,
2629
}
2730

28-
impl Prover {
29-
pub fn from_dirs(params_dir: &str, assets_dir: &str) -> Self {
31+
impl<'params> Prover<'params> {
32+
pub fn from_params_and_assets(
33+
params_map: &'params BTreeMap<u32, ParamsKZG<Bn256>>,
34+
assets_dir: &str,
35+
) -> Self {
3036
log::debug!("set env KECCAK_ROWS={}", BATCH_KECCAK_ROW.to_string());
3137
env::set_var("KECCAK_ROWS", BATCH_KECCAK_ROW.to_string());
3238

33-
let prover_impl = common::Prover::from_params_dir(params_dir, &AGG_DEGREES);
39+
let prover_impl = common::Prover::from_params_map(params_map);
3440
let chunk_protocol = force_to_read(assets_dir, &CHUNK_PROTOCOL_FILENAME);
3541

3642
let raw_vk_batch = try_to_read(assets_dir, &BATCH_VK_FILENAME);
@@ -208,6 +214,16 @@ impl Prover {
208214
let batch_hash = batch_header.batch_hash();
209215
let batch_info: BatchHash<N_SNARKS> =
210216
BatchHash::construct(&chunk_hashes, batch_header, &batch.blob_bytes);
217+
let batch_data: BatchData<N_SNARKS> = BatchData::from(&batch_info);
218+
219+
// sanity check:
220+
// - conditionally decoded blob should match batch data.
221+
let batch_bytes = batch_data.get_batch_data_bytes();
222+
let decoded_blob_bytes = decode_blob(&batch.blob_bytes)?;
223+
assert_eq!(
224+
batch_bytes, decoded_blob_bytes,
225+
"BatchProvingTask(sanity) mismatch batch bytes and decoded blob bytes",
226+
);
211227

212228
let layer3_snark = self.prover_impl.load_or_gen_agg_snark(
213229
name,

prover/src/aggregator/verifier.rs

+11-7
Original file line numberDiff line numberDiff line change
@@ -13,18 +13,18 @@ use halo2_proofs::{
1313
};
1414
use snark_verifier_sdk::verify_evm_calldata;
1515
use snark_verifier_sdk::Snark;
16-
use std::env;
16+
use std::{collections::BTreeMap, env};
1717

1818
#[derive(Debug)]
19-
pub struct Verifier {
19+
pub struct Verifier<'params> {
2020
// Make it public for testing with inner functions (unnecessary for FFI).
21-
pub inner: common::Verifier<CompressionCircuit>,
21+
pub inner: common::Verifier<'params, CompressionCircuit>,
2222
deployment_code: Option<Vec<u8>>,
2323
}
2424

25-
impl Verifier {
25+
impl<'params> Verifier<'params> {
2626
pub fn new(
27-
params: ParamsKZG<Bn256>,
27+
params: &'params ParamsKZG<Bn256>,
2828
vk: VerifyingKey<G1Affine>,
2929
deployment_code: Vec<u8>,
3030
) -> Self {
@@ -36,12 +36,16 @@ impl Verifier {
3636
}
3737
}
3838

39-
pub fn from_dirs(params_dir: &str, assets_dir: &str) -> Self {
39+
pub fn from_params_and_assets(
40+
params_map: &'params BTreeMap<u32, ParamsKZG<Bn256>>,
41+
assets_dir: &str,
42+
) -> Self {
4043
let raw_vk = force_to_read(assets_dir, &batch_vk_filename());
4144
let deployment_code = try_to_read(assets_dir, &DEPLOYMENT_CODE_FILENAME);
4245

4346
env::set_var("COMPRESSION_CONFIG", &*LAYER4_CONFIG_PATH);
44-
let inner = common::Verifier::from_params_dir(params_dir, *LAYER4_DEGREE, &raw_vk);
47+
let params = params_map.get(&*LAYER4_DEGREE).expect("should be loaded");
48+
let inner = common::Verifier::from_params(params, &raw_vk);
4549

4650
Self {
4751
inner,

prover/src/common/prover.rs

+6-9
Original file line numberDiff line numberDiff line change
@@ -16,22 +16,22 @@ mod recursion;
1616
mod utils;
1717

1818
#[derive(Debug)]
19-
pub struct Prover {
19+
pub struct Prover<'params> {
2020
// degree -> params (use BTreeMap to find proper degree for params downsize)
21-
params_map: BTreeMap<u32, ParamsKZG<Bn256>>,
21+
pub params_map: &'params BTreeMap<u32, ParamsKZG<Bn256>>,
2222
// Cached id -> pk
2323
pk_map: HashMap<String, ProvingKey<G1Affine>>,
2424
}
2525

26-
impl Prover {
27-
pub fn from_params(params_map: BTreeMap<u32, ParamsKZG<Bn256>>) -> Self {
26+
impl<'params> Prover<'params> {
27+
pub fn from_params_map(params_map: &'params BTreeMap<u32, ParamsKZG<Bn256>>) -> Self {
2828
Self {
2929
params_map,
3030
pk_map: HashMap::new(),
3131
}
3232
}
3333

34-
pub fn from_params_dir(params_dir: &str, degrees: &[u32]) -> Self {
34+
pub fn load_params_map(params_dir: &str, degrees: &[u32]) -> BTreeMap<u32, ParamsKZG<Bn256>> {
3535
let degrees = BTreeSet::from_iter(degrees);
3636
let max_degree = **degrees.last().unwrap();
3737

@@ -63,9 +63,6 @@ impl Prover {
6363
params_map.insert(*d, params);
6464
}
6565

66-
Self {
67-
params_map,
68-
pk_map: HashMap::new(),
69-
}
66+
params_map
7067
}
7168
}

prover/src/common/prover/aggregation.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ use rand::Rng;
1010
use snark_verifier_sdk::Snark;
1111
use std::env;
1212

13-
impl Prover {
13+
impl<'params> Prover<'params> {
1414
pub fn gen_agg_snark<const N_SNARKS: usize>(
1515
&mut self,
1616
id: &str,

prover/src/common/prover/chunk.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use anyhow::{anyhow, Result};
55
use snark_verifier_sdk::Snark;
66
use zkevm_circuits::evm_circuit::witness::Block;
77

8-
impl Prover {
8+
impl<'params> Prover<'params> {
99
pub fn load_or_gen_final_chunk_snark(
1010
&mut self,
1111
name: &str,

prover/src/common/prover/compression.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ use rand::Rng;
1010
use snark_verifier_sdk::Snark;
1111
use std::env;
1212

13-
impl Prover {
13+
impl<'params> Prover<'params> {
1414
pub fn gen_comp_snark(
1515
&mut self,
1616
id: &str,

prover/src/common/prover/evm.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ use rand::Rng;
1111
use snark_verifier_sdk::{gen_evm_proof_shplonk, CircuitExt, Snark};
1212
use std::env;
1313

14-
impl Prover {
14+
impl<'params> Prover<'params> {
1515
pub fn load_or_gen_comp_evm_proof(
1616
&mut self,
1717
name: &str,

prover/src/common/prover/inner.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ use rand::Rng;
1010
use snark_verifier_sdk::{gen_snark_shplonk, Snark};
1111
use zkevm_circuits::evm_circuit::witness::Block;
1212

13-
impl Prover {
13+
impl<'params> Prover<'params> {
1414
pub fn gen_inner_snark<C: TargetCircuit>(
1515
&mut self,
1616
id: &str,

prover/src/common/prover/mock.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ use std::sync::LazyLock;
66

77
pub static MOCK_PROVE: LazyLock<bool> = LazyLock::new(|| read_env_var("MOCK_PROVE", false));
88

9-
impl Prover {
9+
impl<'params> Prover<'params> {
1010
pub fn assert_if_mock_prover<C: CircuitExt<Fr>>(id: &str, degree: u32, circuit: &C) {
1111
if !*MOCK_PROVE {
1212
return;

prover/src/common/prover/recursion.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ use crate::{
1414

1515
use super::Prover;
1616

17-
impl Prover {
17+
impl<'params> Prover<'params> {
1818
pub fn gen_recursion_snark(
1919
&mut self,
2020
id: &str,

prover/src/common/prover/utils.rs

+3-21
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,12 @@ use anyhow::Result;
44
use halo2_proofs::{
55
halo2curves::bn256::{Bn256, Fr, G1Affine},
66
plonk::{keygen_pk2, Circuit, ProvingKey},
7-
poly::{commitment::Params, kzg::commitment::ParamsKZG},
7+
poly::kzg::commitment::ParamsKZG,
88
};
99
use rand::Rng;
1010
use snark_verifier_sdk::{gen_snark_shplonk, CircuitExt, Snark};
1111

12-
impl Prover {
12+
impl<'params> Prover<'params> {
1313
pub fn gen_snark<C: CircuitExt<Fr>>(
1414
&mut self,
1515
id: &str,
@@ -32,25 +32,7 @@ impl Prover {
3232
Ok(snark)
3333
}
3434

35-
pub fn params(&mut self, degree: u32) -> &ParamsKZG<Bn256> {
36-
if self.params_map.contains_key(&degree) {
37-
return &self.params_map[&degree];
38-
}
39-
40-
log::warn!("Optimization: download params{degree} to params dir");
41-
42-
log::info!("Before generate params of {degree}");
43-
let mut new_params = self
44-
.params_map
45-
.range(degree..)
46-
.next()
47-
.unwrap_or_else(|| panic!("Must have params of degree-{degree}"))
48-
.1
49-
.clone();
50-
new_params.downsize(degree);
51-
log::info!("After generate params of {degree}");
52-
53-
self.params_map.insert(degree, new_params);
35+
pub fn params(&self, degree: u32) -> &ParamsKZG<Bn256> {
5436
&self.params_map[&degree]
5537
}
5638

prover/src/common/verifier.rs

+6-13
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use crate::{io::deserialize_vk, utils::load_params};
1+
use crate::io::deserialize_vk;
22
use halo2_proofs::{
33
halo2curves::bn256::{Bn256, Fr, G1Affine},
44
plonk::VerifyingKey,
@@ -11,33 +11,26 @@ mod evm;
1111
mod utils;
1212

1313
#[derive(Debug)]
14-
pub struct Verifier<C: CircuitExt<Fr>> {
15-
params: ParamsKZG<Bn256>,
14+
pub struct Verifier<'params, C: CircuitExt<Fr>> {
15+
params: &'params ParamsKZG<Bn256>,
1616
vk: VerifyingKey<G1Affine>,
1717
phantom: PhantomData<C>,
1818
}
1919

20-
impl<C: CircuitExt<Fr>> Verifier<C> {
21-
pub fn new(params: ParamsKZG<Bn256>, vk: VerifyingKey<G1Affine>) -> Self {
20+
impl<'params, C: CircuitExt<Fr>> Verifier<'params, C> {
21+
pub fn new(params: &'params ParamsKZG<Bn256>, vk: VerifyingKey<G1Affine>) -> Self {
2222
Self {
2323
params,
2424
vk,
2525
phantom: PhantomData,
2626
}
2727
}
2828

29-
pub fn from_params(params: ParamsKZG<Bn256>, raw_vk: &[u8]) -> Self {
29+
pub fn from_params(params: &'params ParamsKZG<Bn256>, raw_vk: &[u8]) -> Self {
3030
let vk = deserialize_vk::<C>(raw_vk);
31-
3231
Self::new(params, vk)
3332
}
3433

35-
pub fn from_params_dir(params_dir: &str, degree: u32, vk: &[u8]) -> Self {
36-
let params = load_params(params_dir, degree, None).expect("load params failed");
37-
38-
Self::from_params(params, vk)
39-
}
40-
4134
pub fn verify_snark(&self, snark: Snark) -> bool {
4235
verify_snark_shplonk::<C>(self.params.verifier_params(), snark, &self.vk)
4336
}

prover/src/common/verifier/evm.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@ use crate::EvmProof;
33
use halo2_proofs::halo2curves::bn256::Fr;
44
use snark_verifier_sdk::CircuitExt;
55

6-
impl<C: CircuitExt<Fr>> Verifier<C> {
6+
impl<'params, C: CircuitExt<Fr>> Verifier<'params, C> {
77
pub fn gen_evm_verifier(&self, evm_proof: &EvmProof, output_dir: Option<&str>) {
8-
crate::evm::gen_evm_verifier::<C>(&self.params, &self.vk, evm_proof, output_dir)
8+
crate::evm::gen_evm_verifier::<C>(self.params, &self.vk, evm_proof, output_dir)
99
}
1010
}

prover/src/common/verifier/utils.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,9 @@ use halo2_proofs::{
66
};
77
use snark_verifier_sdk::CircuitExt;
88

9-
impl<C: CircuitExt<Fr>> Verifier<C> {
9+
impl<'params, C: CircuitExt<Fr>> Verifier<'params, C> {
1010
pub fn params(&self) -> &ParamsKZG<Bn256> {
11-
&self.params
11+
self.params
1212
}
1313

1414
pub fn vk(&self) -> &VerifyingKey<G1Affine> {

prover/src/inner/prover.rs

+7-7
Original file line numberDiff line numberDiff line change
@@ -14,24 +14,24 @@ use std::marker::PhantomData;
1414
mod mock;
1515

1616
#[derive(Debug)]
17-
pub struct Prover<C: TargetCircuit> {
17+
pub struct Prover<'params, C: TargetCircuit> {
1818
// Make it public for testing with inner functions (unnecessary for FFI).
19-
pub prover_impl: common::Prover,
19+
pub prover_impl: common::Prover<'params>,
2020
phantom: PhantomData<C>,
2121
}
2222

23-
impl<C: TargetCircuit> From<common::Prover> for Prover<C> {
24-
fn from(prover_impl: common::Prover) -> Self {
23+
impl<'params, C: TargetCircuit> From<common::Prover<'params>> for Prover<'params, C> {
24+
fn from(prover_impl: common::Prover<'params>) -> Self {
2525
Self {
2626
prover_impl,
2727
phantom: PhantomData,
2828
}
2929
}
3030
}
3131

32-
impl<C: TargetCircuit> Prover<C> {
33-
pub fn from_params_dir(params_dir: &str) -> Self {
34-
common::Prover::from_params_dir(params_dir, &[*INNER_DEGREE]).into()
32+
impl<'params, C: TargetCircuit> Prover<'params, C> {
33+
pub fn degrees() -> Vec<u32> {
34+
vec![*INNER_DEGREE]
3535
}
3636

3737
pub fn gen_inner_snark(&mut self, id: &str, block_traces: Vec<BlockTrace>) -> Result<Snark> {

prover/src/inner/prover/mock.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ use halo2_proofs::{dev::MockProver, halo2curves::bn256::Fr};
1010
use snark_verifier_sdk::CircuitExt;
1111
use zkevm_circuits::witness::Block;
1212

13-
impl<C: TargetCircuit> Prover<C> {
13+
impl<'params, C: TargetCircuit> Prover<'params, C> {
1414
pub fn mock_prove_target_circuit(block_trace: BlockTrace) -> anyhow::Result<()> {
1515
Self::mock_prove_target_circuit_chunk(vec![block_trace])
1616
}

0 commit comments

Comments
 (0)