Skip to content

Commit 40927aa

Browse files
authored
feat: make provers generic over engine (#1553)
This adds the ability to use different engines for proving.
1 parent 5868d83 commit 40927aa

File tree

10 files changed

+60
-51
lines changed

10 files changed

+60
-51
lines changed

benchmarks/src/bin/fib_e2e.rs

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,9 @@ use openvm_rv32im_transpiler::{
1212
use openvm_sdk::{
1313
commit::commit_app_exe, prover::ContinuationProver, DefaultStaticVerifierPvHandler, Sdk, StdIn,
1414
};
15-
use openvm_stark_sdk::bench::run_with_metric_collection;
15+
use openvm_stark_sdk::{
16+
bench::run_with_metric_collection, config::baby_bear_poseidon2::BabyBearPoseidon2Engine,
17+
};
1618
use openvm_transpiler::{transpiler::Transpiler, FromElf};
1719

1820
const NUM_PUBLIC_VALUES: usize = DEFAULT_MAX_NUM_PUBLIC_VALUES;
@@ -56,8 +58,12 @@ async fn main() -> Result<()> {
5658
let mut stdin = StdIn::default();
5759
stdin.write(&n);
5860
run_with_metric_collection("OUTPUT_PATH", || {
59-
let mut e2e_prover =
60-
ContinuationProver::new(&halo2_params_reader, app_pk, app_committed_exe, full_agg_pk);
61+
let mut e2e_prover = ContinuationProver::<_, BabyBearPoseidon2Engine>::new(
62+
&halo2_params_reader,
63+
app_pk,
64+
app_committed_exe,
65+
full_agg_pk,
66+
);
6167
e2e_prover.set_program_name("fib_e2e");
6268
let _proof = e2e_prover.generate_proof_for_evm(stdin);
6369
});

benchmarks/src/bin/kitchen_sink.rs

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,9 @@ use openvm_sdk::{
1313
commit::commit_app_exe, config::SdkVmConfig, prover::ContinuationProver,
1414
DefaultStaticVerifierPvHandler, Sdk, StdIn,
1515
};
16-
use openvm_stark_sdk::bench::run_with_metric_collection;
16+
use openvm_stark_sdk::{
17+
bench::run_with_metric_collection, config::baby_bear_poseidon2::BabyBearPoseidon2Engine,
18+
};
1719
use openvm_transpiler::FromElf;
1820

1921
fn main() -> Result<()> {
@@ -78,8 +80,12 @@ fn main() -> Result<()> {
7880
)?;
7981

8082
run_with_metric_collection("OUTPUT_PATH", || -> Result<()> {
81-
let mut prover =
82-
ContinuationProver::new(&halo2_params_reader, app_pk, app_committed_exe, full_agg_pk);
83+
let mut prover = ContinuationProver::<_, BabyBearPoseidon2Engine>::new(
84+
&halo2_params_reader,
85+
app_pk,
86+
app_committed_exe,
87+
full_agg_pk,
88+
);
8389
prover.set_program_name("kitchen_sink");
8490
let stdin = StdIn::default();
8591
let _proof = prover.generate_proof_for_evm(stdin);

benchmarks/src/bin/verify_fibair.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,8 +59,8 @@ fn main() -> Result<()> {
5959
let app_pk = sdk.app_keygen(app_config)?;
6060
let app_vk = app_pk.get_app_vk();
6161
let committed_exe = sdk.commit_app_exe(app_fri_params, program.into())?;
62-
let prover =
63-
AppProver::new(app_pk.app_vm_pk, committed_exe).with_program_name("verify_fibair");
62+
let prover = AppProver::<_, BabyBearPoseidon2Engine>::new(app_pk.app_vm_pk, committed_exe)
63+
.with_program_name("verify_fibair");
6464
let proof = prover.generate_app_proof_without_continuations(input_stream.into());
6565
sdk.verify_app_proof_without_continuations(&app_vk, &proof)?;
6666
Ok(())

benchmarks/src/utils.rs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ use openvm_stark_sdk::{
2424
baby_bear_poseidon2::{BabyBearPoseidon2Config, BabyBearPoseidon2Engine},
2525
FriParameters,
2626
},
27+
engine::StarkFriEngine,
2728
openvm_stark_backend::Chip,
2829
p3_baby_bear::BabyBear,
2930
};
@@ -157,7 +158,7 @@ impl BenchmarkCli {
157158
VC::Periphery: Chip<SC>,
158159
{
159160
let app_config = self.app_config(vm_config);
160-
bench_from_exe(
161+
bench_from_exe::<VC, BabyBearPoseidon2Engine>(
161162
bench_name,
162163
app_config,
163164
exe,
@@ -202,7 +203,7 @@ pub fn build_bench(manifest_dir: PathBuf, profile: impl ToString) -> Result<Elf>
202203
/// 6. Verify STARK proofs.
203204
///
204205
/// Returns the data necessary for proof aggregation.
205-
pub fn bench_from_exe<VC>(
206+
pub fn bench_from_exe<VC, E: StarkFriEngine<SC>>(
206207
bench_name: impl ToString,
207208
app_config: AppConfig<VC>,
208209
exe: impl Into<VmExe<F>>,
@@ -231,18 +232,17 @@ where
231232
// 4. Generate trace
232233
// 5. Generate STARK proofs for each segment (segmentation is determined by `config`), with timer.
233234
let app_vk = app_pk.get_app_vk();
234-
let prover = AppProver::new(app_pk.app_vm_pk, committed_exe).with_program_name(bench_name);
235+
let prover =
236+
AppProver::<VC, E>::new(app_pk.app_vm_pk, committed_exe).with_program_name(bench_name);
235237
let app_proof = prover.generate_app_proof(input_stream);
236238
// 6. Verify STARK proofs, including boundary conditions.
237239
let sdk = Sdk::new();
238240
sdk.verify_app_proof(&app_vk, &app_proof)
239241
.expect("Verification failed");
240242
if let Some(leaf_vm_config) = leaf_vm_config {
241243
let leaf_vm_pk = leaf_keygen(app_config.leaf_fri_params.fri_params, leaf_vm_config);
242-
let leaf_prover = VmLocalProver::<SC, NativeConfig, BabyBearPoseidon2Engine>::new(
243-
leaf_vm_pk,
244-
app_pk.leaf_committed_exe,
245-
);
244+
let leaf_prover =
245+
VmLocalProver::<SC, NativeConfig, E>::new(leaf_vm_pk, app_pk.leaf_committed_exe);
246246
let leaf_controller = LeafProvingController {
247247
num_children: DEFAULT_NUM_CHILDREN_LEAF,
248248
};

crates/sdk/examples/sdk_app.rs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ use openvm_sdk::{
99
prover::AppProver,
1010
Sdk, StdIn,
1111
};
12-
use openvm_stark_sdk::config::FriParameters;
12+
use openvm_stark_sdk::config::{baby_bear_poseidon2::BabyBearPoseidon2Engine, FriParameters};
1313
use openvm_transpiler::elf::Elf;
1414
use serde::{Deserialize, Serialize};
1515

@@ -90,8 +90,11 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
9090
// 9a. Generate a proof
9191
let proof = sdk.generate_app_proof(app_pk.clone(), app_committed_exe.clone(), stdin.clone())?;
9292
// 9b. Generate a proof with an AppProver with custom fields
93-
let app_prover = AppProver::new(app_pk.app_vm_pk.clone(), app_committed_exe.clone())
94-
.with_program_name("test_program");
93+
let app_prover = AppProver::<_, BabyBearPoseidon2Engine>::new(
94+
app_pk.app_vm_pk.clone(),
95+
app_committed_exe.clone(),
96+
)
97+
.with_program_name("test_program");
9598
let proof = app_prover.generate_app_proof(stdin.clone());
9699
// ANCHOR_END: proof_generation
97100

crates/sdk/src/lib.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -176,7 +176,7 @@ impl<E: StarkFriEngine<SC>> GenericSdk<E> {
176176
VC::Executor: Chip<SC>,
177177
VC::Periphery: Chip<SC>,
178178
{
179-
let app_prover = AppProver::new(app_pk.app_vm_pk.clone(), app_committed_exe);
179+
let app_prover = AppProver::<VC, E>::new(app_pk.app_vm_pk.clone(), app_committed_exe);
180180
let proof = app_prover.generate_app_proof(inputs);
181181
Ok(proof)
182182
}
@@ -241,7 +241,7 @@ impl<E: StarkFriEngine<SC>> GenericSdk<E> {
241241
VC::Executor: Chip<SC>,
242242
VC::Periphery: Chip<SC>,
243243
{
244-
let stark_prover = StarkProver::new(app_pk, app_exe, agg_stark_pk);
244+
let stark_prover = StarkProver::<VC, E>::new(app_pk, app_exe, agg_stark_pk);
245245
let proof = stark_prover.generate_root_verifier_input(inputs);
246246
Ok(proof)
247247
}
@@ -258,7 +258,7 @@ impl<E: StarkFriEngine<SC>> GenericSdk<E> {
258258
VC::Executor: Chip<SC>,
259259
VC::Periphery: Chip<SC>,
260260
{
261-
let e2e_prover = ContinuationProver::new(reader, app_pk, app_exe, agg_pk);
261+
let e2e_prover = ContinuationProver::<VC, E>::new(reader, app_pk, app_exe, agg_pk);
262262
let proof = e2e_prover.generate_proof_for_evm(inputs);
263263
Ok(proof)
264264
}

crates/sdk/src/prover/agg.rs

Lines changed: 10 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,7 @@ use openvm_continuations::verifier::{
77
};
88
use openvm_native_circuit::NativeConfig;
99
use openvm_native_recursion::hints::Hintable;
10-
use openvm_stark_sdk::{
11-
config::baby_bear_poseidon2::BabyBearPoseidon2Engine, openvm_stark_backend::proof::Proof,
12-
};
10+
use openvm_stark_sdk::{engine::StarkFriEngine, openvm_stark_backend::proof::Proof};
1311
use tracing::info_span;
1412

1513
use crate::{
@@ -25,11 +23,11 @@ pub const DEFAULT_NUM_CHILDREN_LEAF: usize = 1;
2523
const DEFAULT_NUM_CHILDREN_INTERNAL: usize = 2;
2624
const DEFAULT_MAX_INTERNAL_WRAPPER_LAYERS: usize = 4;
2725

28-
pub struct AggStarkProver {
29-
leaf_prover: VmLocalProver<SC, NativeConfig, BabyBearPoseidon2Engine>,
26+
pub struct AggStarkProver<E: StarkFriEngine<SC>> {
27+
leaf_prover: VmLocalProver<SC, NativeConfig, E>,
3028
leaf_controller: LeafProvingController,
3129

32-
internal_prover: VmLocalProver<SC, NativeConfig, BabyBearPoseidon2Engine>,
30+
internal_prover: VmLocalProver<SC, NativeConfig, E>,
3331
root_prover: RootVerifierLocalProver,
3432

3533
pub num_children_internal: usize,
@@ -41,19 +39,17 @@ pub struct LeafProvingController {
4139
pub num_children: usize,
4240
}
4341

44-
impl AggStarkProver {
42+
impl<E: StarkFriEngine<SC>> AggStarkProver<E> {
4543
pub fn new(
4644
agg_stark_pk: AggStarkProvingKey,
4745
leaf_committed_exe: Arc<NonRootCommittedExe>,
4846
) -> Self {
49-
let leaf_prover = VmLocalProver::<SC, NativeConfig, BabyBearPoseidon2Engine>::new(
50-
agg_stark_pk.leaf_vm_pk,
51-
leaf_committed_exe,
52-
);
47+
let leaf_prover =
48+
VmLocalProver::<SC, NativeConfig, E>::new(agg_stark_pk.leaf_vm_pk, leaf_committed_exe);
5349
let leaf_controller = LeafProvingController {
5450
num_children: DEFAULT_NUM_CHILDREN_LEAF,
5551
};
56-
let internal_prover = VmLocalProver::<SC, NativeConfig, BabyBearPoseidon2Engine>::new(
52+
let internal_prover = VmLocalProver::<SC, NativeConfig, E>::new(
5753
agg_stark_pk.internal_vm_pk,
5854
agg_stark_pk.internal_committed_exe,
5955
);
@@ -184,9 +180,9 @@ impl LeafProvingController {
184180
self
185181
}
186182

187-
pub fn generate_proof(
183+
pub fn generate_proof<E: StarkFriEngine<SC>>(
188184
&self,
189-
prover: &VmLocalProver<SC, NativeConfig, BabyBearPoseidon2Engine>,
185+
prover: &VmLocalProver<SC, NativeConfig, E>,
190186
app_proofs: &ContinuationVmProof<SC>,
191187
) -> Vec<Proof<SC>> {
192188
info_span!("agg_layer", group = "leaf").in_scope(|| {

crates/sdk/src/prover/app.rs

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ use std::sync::Arc;
33
use getset::Getters;
44
use openvm_circuit::arch::{ContinuationVmProof, VmConfig};
55
use openvm_stark_backend::{proof::Proof, Chip};
6-
use openvm_stark_sdk::config::baby_bear_poseidon2::BabyBearPoseidon2Engine;
6+
use openvm_stark_sdk::engine::StarkFriEngine;
77
use tracing::info_span;
88

99
use super::vm::SingleSegmentVmProver;
@@ -13,13 +13,13 @@ use crate::{
1313
};
1414

1515
#[derive(Getters)]
16-
pub struct AppProver<VC> {
16+
pub struct AppProver<VC, E: StarkFriEngine<SC>> {
1717
pub program_name: Option<String>,
1818
#[getset(get = "pub")]
19-
app_prover: VmLocalProver<SC, VC, BabyBearPoseidon2Engine>,
19+
app_prover: VmLocalProver<SC, VC, E>,
2020
}
2121

22-
impl<VC> AppProver<VC> {
22+
impl<VC, E: StarkFriEngine<SC>> AppProver<VC, E> {
2323
pub fn new(
2424
app_vm_pk: Arc<VmProvingKey<SC, VC>>,
2525
app_committed_exe: Arc<NonRootCommittedExe>,
@@ -29,10 +29,7 @@ impl<VC> AppProver<VC> {
2929
{
3030
Self {
3131
program_name: None,
32-
app_prover: VmLocalProver::<SC, VC, BabyBearPoseidon2Engine>::new(
33-
app_vm_pk,
34-
app_committed_exe,
35-
),
32+
app_prover: VmLocalProver::<SC, VC, E>::new(app_vm_pk, app_committed_exe),
3633
}
3734
}
3835
pub fn set_program_name(&mut self, program_name: impl AsRef<str>) -> &mut Self {

crates/sdk/src/prover/mod.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use std::sync::Arc;
22

33
use openvm_circuit::arch::VmConfig;
4-
use openvm_stark_sdk::openvm_stark_backend::Chip;
4+
use openvm_stark_sdk::{engine::StarkFriEngine, openvm_stark_backend::Chip};
55

66
use crate::{keygen::AppProvingKey, stdin::StdIn, NonRootCommittedExe, F, SC};
77

@@ -24,12 +24,12 @@ pub use stark::*;
2424

2525
use crate::{keygen::AggProvingKey, prover::halo2::Halo2Prover, types::EvmProof};
2626

27-
pub struct ContinuationProver<VC> {
28-
stark_prover: StarkProver<VC>,
27+
pub struct ContinuationProver<VC, E: StarkFriEngine<SC>> {
28+
stark_prover: StarkProver<VC, E>,
2929
halo2_prover: Halo2Prover,
3030
}
3131

32-
impl<VC> ContinuationProver<VC> {
32+
impl<VC, E: StarkFriEngine<SC>> ContinuationProver<VC, E> {
3333
pub fn new(
3434
reader: &impl Halo2ParamsReader,
3535
app_pk: Arc<AppProvingKey<VC>>,

crates/sdk/src/prover/stark.rs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,18 +3,19 @@ use std::sync::Arc;
33
use openvm_circuit::arch::VmConfig;
44
use openvm_continuations::verifier::root::types::RootVmVerifierInput;
55
use openvm_stark_backend::{proof::Proof, Chip};
6+
use openvm_stark_sdk::engine::StarkFriEngine;
67

78
use crate::{
89
keygen::{AggStarkProvingKey, AppProvingKey},
910
prover::{agg::AggStarkProver, app::AppProver},
1011
NonRootCommittedExe, RootSC, StdIn, F, SC,
1112
};
1213

13-
pub struct StarkProver<VC> {
14-
app_prover: AppProver<VC>,
15-
agg_prover: AggStarkProver,
14+
pub struct StarkProver<VC, E: StarkFriEngine<SC>> {
15+
app_prover: AppProver<VC, E>,
16+
agg_prover: AggStarkProver<E>,
1617
}
17-
impl<VC> StarkProver<VC> {
18+
impl<VC, E: StarkFriEngine<SC>> StarkProver<VC, E> {
1819
pub fn new(
1920
app_pk: Arc<AppProvingKey<VC>>,
2021
app_committed_exe: Arc<NonRootCommittedExe>,

0 commit comments

Comments
 (0)