forked from privacy-scaling-explorations/zkevm-circuits
-
Notifications
You must be signed in to change notification settings - Fork 391
/
Copy pathprover.rs
69 lines (61 loc) · 2.03 KB
/
prover.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
use crate::{
common,
config::INNER_DEGREE,
io::serialize_vk,
utils::{chunk_trace_to_witness_block, gen_rng},
zkevm::circuit::TargetCircuit,
Proof,
};
use anyhow::Result;
use eth_types::l2_types::BlockTrace;
use snark_verifier_sdk::Snark;
use std::marker::PhantomData;
mod mock;
#[derive(Debug)]
pub struct Prover<'params, C: TargetCircuit> {
// Make it public for testing with inner functions (unnecessary for FFI).
pub prover_impl: common::Prover<'params>,
phantom: PhantomData<C>,
}
impl<'params, C: TargetCircuit> From<common::Prover<'params>> for Prover<'params, C> {
fn from(prover_impl: common::Prover<'params>) -> Self {
Self {
prover_impl,
phantom: PhantomData,
}
}
}
impl<'params, C: TargetCircuit> Prover<'params, C> {
pub fn degrees() -> Vec<u32> {
vec![*INNER_DEGREE]
}
pub fn gen_inner_snark(&mut self, id: &str, block_traces: Vec<BlockTrace>) -> Result<Snark> {
assert!(!block_traces.is_empty());
let rng = gen_rng();
let witness_block = chunk_trace_to_witness_block(block_traces)?;
self.prover_impl
.gen_inner_snark::<C>(id, rng, &witness_block)
}
pub fn load_or_gen_inner_proof(
&mut self,
name: &str,
id: &str,
block_traces: Vec<BlockTrace>,
output_dir: Option<&str>,
) -> Result<Proof> {
let filename = format!("{id}_{name}");
match output_dir.and_then(|output_dir| Proof::from_json_file(output_dir, &filename).ok()) {
Some(proof) => Ok(proof),
None => {
let result = self.gen_inner_snark(id, block_traces).map(|snark| {
let raw_vk = serialize_vk(self.prover_impl.pk(id).unwrap().get_vk());
Proof::from_snark(snark, raw_vk)
});
if let (Some(output_dir), Ok(proof)) = (output_dir, &result) {
proof.dump(output_dir, &filename)?;
}
result
}
}
}
}