Skip to content

Commit

Permalink
super circuit prover can return snark
Browse files Browse the repository at this point in the history
  • Loading branch information
lispc committed Jun 1, 2024
1 parent 8416d65 commit e354291
Showing 1 changed file with 16 additions and 14 deletions.
30 changes: 16 additions & 14 deletions prover/src/inner/prover.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,21 +8,22 @@ use crate::{
};
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<C: TargetCircuit> {
// Make it public for testing with inner functions (unnecessary for FFI).
pub inner: common::Prover,
pub prover_impl: common::Prover,
phantom: PhantomData<C>,
}

impl<C: TargetCircuit> From<common::Prover> for Prover<C> {
fn from(inner: common::Prover) -> Self {
fn from(prover_impl: common::Prover) -> Self {
Self {
inner,
prover_impl,
phantom: PhantomData,
}
}
Expand All @@ -33,6 +34,14 @@ impl<C: TargetCircuit> Prover<C> {
common::Prover::from_params_dir(params_dir, &[*INNER_DEGREE]).into()
}

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,
Expand All @@ -44,17 +53,10 @@ impl<C: TargetCircuit> Prover<C> {
match output_dir.and_then(|output_dir| Proof::from_json_file(output_dir, &filename).ok()) {
Some(proof) => Ok(proof),
None => {
assert!(!block_traces.is_empty());

let rng = gen_rng();
let witness_block = chunk_trace_to_witness_block(block_traces)?;
let result = self
.inner
.gen_inner_snark::<C>(id, rng, &witness_block)
.map(|snark| {
let raw_vk = serialize_vk(self.inner.pk(id).unwrap().get_vk());
Proof::from_snark(snark, raw_vk)
});
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)?;
Expand Down

0 comments on commit e354291

Please sign in to comment.