Skip to content
This repository was archived by the owner on Apr 18, 2025. It is now read-only.

Commit 38d0330

Browse files
committed
Update Prover functions.
1 parent bb5033f commit 38d0330

File tree

6 files changed

+102
-34
lines changed

6 files changed

+102
-34
lines changed

prover/src/aggregator/prover.rs

+3-2
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,12 @@ use std::collections::HashMap;
77

88
mod aggregation;
99
mod chunk;
10+
mod common;
1011
mod compression;
1112
mod utils;
1213

1314
#[derive(Debug)]
1415
pub struct Prover {
15-
inner_params: ParamsKZG<Bn256>,
16-
inner_pks: HashMap<String, ProvingKey<G1Affine>>,
16+
params: ParamsKZG<Bn256>,
17+
pks: HashMap<String, ProvingKey<G1Affine>>,
1718
}
+1-6
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,10 @@
11
use super::Prover;
2-
use crate::proof::Proof;
32
use aggregator::AggregationCircuit;
43
use anyhow::Result;
54
use snark_verifier_sdk::Snark;
65

76
impl Prover {
8-
pub fn build_agg_circuit(&self, _snarks: Vec<Snark>) -> Result<AggregationCircuit> {
9-
todo!()
10-
}
11-
12-
pub fn gen_agg_proof(&self, _snarks: Vec<Snark>) -> Result<Proof> {
7+
pub fn gen_agg_proof(&self, _snarks: Vec<Snark>) -> Result<(AggregationCircuit, Snark)> {
138
todo!()
149
}
1510
}

prover/src/aggregator/prover/chunk.rs

+9-22
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,11 @@
1-
use super::{utils::tick, Prover};
1+
use super::{utils::gen_rng, Prover};
22
use crate::{
33
utils::{metric_of_witness_block, read_env_var},
44
zkevm::circuit::{block_traces_to_witness_block, check_batch_capacity, TargetCircuit, DEGREE},
55
};
66
use anyhow::{bail, Result};
7-
use halo2_proofs::{dev::MockProver, halo2curves::bn256::Fr, plonk::keygen_pk2};
7+
use halo2_proofs::{dev::MockProver, halo2curves::bn256::Fr};
88
use once_cell::sync::Lazy;
9-
use rand::SeedableRng;
10-
use rand_xorshift::XorShiftRng;
119
use snark_verifier_sdk::{gen_snark_shplonk, Snark};
1210
use types::eth::BlockTrace;
1311

@@ -34,7 +32,7 @@ impl Prover {
3432

3533
let (circuit, instance) = C::from_witness_block(&witness_block)?;
3634

37-
// generate the proof for the inner circuit
35+
// Generate the proof for the inner circuit.
3836
log::info!(
3937
"Create {} proof of block {} ... block {}, batch len {}",
4038
C::name(),
@@ -43,9 +41,6 @@ impl Prover {
4341
chunk_trace.len()
4442
);
4543

46-
let seed = [0u8; 16];
47-
let mut rng = XorShiftRng::from_seed(seed);
48-
4944
if *MOCK_PROVE {
5045
log::info!("Mock prove {} start", C::name());
5146
let prover = MockProver::<Fr>::run(*DEGREE as u32, &circuit, instance)?;
@@ -59,25 +54,17 @@ impl Prover {
5954
log::info!("Mock prove {} done", C::name());
6055
}
6156

62-
if !self.inner_pks.contains_key(&C::name()) {
63-
self.gen_inner_pk::<C>(&C::dummy_inner_circuit());
57+
// Reuse pk.
58+
let id = C::name();
59+
if !self.pks.contains_key(&id) {
60+
self.gen_inner_pk::<C>(&circuit)?;
6461
}
65-
let pk = &self.inner_pks[&C::name()];
62+
let pk = &self.pks[&id];
6663

6764
// Generate the SNARK proof for inner circuit.
6865
let snark_proof =
69-
gen_snark_shplonk(&self.inner_params, pk, circuit, &mut rng, None::<String>);
66+
gen_snark_shplonk(&self.params, pk, circuit, &mut gen_rng(), None::<String>);
7067

7168
Ok(snark_proof)
7269
}
73-
74-
fn gen_inner_pk<C: TargetCircuit>(&mut self, circuit: &<C as TargetCircuit>::Inner) {
75-
tick(&format!("Before init pk of {}", C::name()));
76-
77-
let pk = keygen_pk2(&self.inner_params, circuit)
78-
.unwrap_or_else(|e| panic!("Failed to generate {} pk: {:?}", C::name(), e));
79-
self.inner_pks.insert(C::name(), pk);
80-
81-
tick(&format!("After init pk of {}", C::name()));
82-
}
8370
}
+63
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
use super::{utils::tick, Prover};
2+
use crate::zkevm::circuit::TargetCircuit;
3+
use anyhow::Result;
4+
use halo2_proofs::{
5+
halo2curves::bn256::{Bn256, Fr},
6+
plonk::keygen_pk2,
7+
poly::kzg::commitment::ParamsKZG,
8+
};
9+
use rand::Rng;
10+
use snark_verifier_sdk::{gen_pk, gen_snark_shplonk, verify_snark_shplonk, CircuitExt, Snark};
11+
12+
impl Prover {
13+
pub(crate) fn gen_snark(
14+
&mut self,
15+
id: &str,
16+
rng: &mut (impl Rng + Send),
17+
params: &ParamsKZG<Bn256>,
18+
circuit: impl CircuitExt<Fr> + Clone,
19+
) -> Snark {
20+
// Reuse pk.
21+
if !self.pks.contains_key(id) {
22+
self.gen_outer_pk(id, params, circuit.clone());
23+
}
24+
let pk = &self.pks[id];
25+
26+
gen_snark_shplonk(params, pk, circuit, rng, None::<&str>)
27+
}
28+
29+
pub(crate) fn verify_snark<C: CircuitExt<Fr>>(
30+
&self,
31+
id: &str,
32+
params: &ParamsKZG<Bn256>,
33+
snark: Snark,
34+
) -> bool {
35+
// Must have cached pk.
36+
let pk = &self.pks[id];
37+
38+
verify_snark_shplonk::<C>(params, snark, pk.get_vk())
39+
}
40+
41+
pub(crate) fn gen_inner_pk<C: TargetCircuit>(
42+
&mut self,
43+
circuit: &<C as TargetCircuit>::Inner,
44+
) -> Result<()> {
45+
let id = C::name();
46+
47+
tick(&format!("Before generate inner pk of {}", &id));
48+
let pk = keygen_pk2(&self.params, circuit)?;
49+
tick(&format!("After generate inner pk of {}", &id));
50+
51+
self.pks.insert(id, pk);
52+
53+
Ok(())
54+
}
55+
56+
fn gen_outer_pk(&mut self, id: &str, params: &ParamsKZG<Bn256>, circuit: impl CircuitExt<Fr>) {
57+
tick(&format!("Before generate outer pk of {}", &id));
58+
let pk = gen_pk(params, &circuit, None);
59+
tick(&format!("After generate outer pk of {}", &id));
60+
61+
self.pks.insert(id.to_string(), pk);
62+
}
63+
}
+17-4
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,23 @@
11
use super::Prover;
2-
use crate::proof::Proof;
3-
use anyhow::Result;
2+
use aggregator::CompressionCircuit;
3+
use halo2_proofs::poly::commitment::Params;
4+
use rand::Rng;
45
use snark_verifier_sdk::Snark;
56

67
impl Prover {
7-
pub fn gen_comp_proof(&self, _snarks: Vec<Snark>) -> Result<Proof> {
8-
todo!()
8+
pub fn gen_comp_proof(
9+
&mut self,
10+
id: &str,
11+
is_fresh: bool,
12+
degree: u32,
13+
mut rng: impl Rng + Send,
14+
prev_snark: Snark,
15+
) -> Snark {
16+
let mut params = self.params.clone();
17+
params.downsize(degree);
18+
19+
let circuit = CompressionCircuit::new(&params, prev_snark, is_fresh, &mut rng);
20+
21+
self.gen_snark(id, &mut rng, &params, circuit)
922
}
1023
}

prover/src/aggregator/prover/utils.rs

+9
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,12 @@
1+
use rand::Rng;
2+
use rand::SeedableRng;
3+
use rand_xorshift::XorShiftRng;
4+
5+
pub(crate) fn gen_rng() -> impl Rng + Send {
6+
let seed = [0u8; 16];
7+
XorShiftRng::from_seed(seed)
8+
}
9+
110
pub(crate) fn tick(desc: &str) {
211
#[cfg(target_os = "linux")]
312
let memory = match procfs::Meminfo::new() {

0 commit comments

Comments
 (0)