fib_e2e/
fib_e2e.rs
1use std::{path::PathBuf, sync::Arc};
2
3use clap::Parser;
4use eyre::Result;
5use openvm_benchmarks_prove::util::BenchmarkCli;
6use openvm_circuit::arch::instructions::{exe::VmExe, program::DEFAULT_MAX_NUM_PUBLIC_VALUES};
7use openvm_native_recursion::halo2::utils::{CacheHalo2ParamsReader, DEFAULT_PARAMS_DIR};
8use openvm_rv32im_circuit::Rv32ImConfig;
9use openvm_rv32im_transpiler::{
10 Rv32ITranspilerExtension, Rv32IoTranspilerExtension, Rv32MTranspilerExtension,
11};
12use openvm_sdk::{
13 commit::commit_app_exe, prover::EvmHalo2Prover, DefaultStaticVerifierPvHandler, Sdk, StdIn,
14};
15use openvm_stark_sdk::{
16 bench::run_with_metric_collection, config::baby_bear_poseidon2::BabyBearPoseidon2Engine,
17};
18use openvm_transpiler::{transpiler::Transpiler, FromElf};
19
20const NUM_PUBLIC_VALUES: usize = DEFAULT_MAX_NUM_PUBLIC_VALUES;
21
22#[tokio::main]
23async fn main() -> Result<()> {
24 let args = BenchmarkCli::parse();
25
26 let max_segment_length = args.max_segment_length.unwrap_or(1_000_000);
28
29 let app_config = args.app_config(Rv32ImConfig::with_public_values_and_segment_len(
30 NUM_PUBLIC_VALUES,
31 max_segment_length,
32 ));
33 let agg_config = args.agg_config();
34
35 let sdk = Sdk::new();
36 let halo2_params_reader = CacheHalo2ParamsReader::new(
37 args.kzg_params_dir
38 .clone()
39 .unwrap_or(PathBuf::from(DEFAULT_PARAMS_DIR)),
40 );
41 let app_pk = Arc::new(sdk.app_keygen(app_config)?);
42 let full_agg_pk = sdk.agg_keygen(
43 agg_config,
44 &halo2_params_reader,
45 &DefaultStaticVerifierPvHandler,
46 )?;
47 let elf = args.build_bench_program("fibonacci")?;
48 let exe = VmExe::from_elf(
49 elf,
50 Transpiler::default()
51 .with_extension(Rv32ITranspilerExtension)
52 .with_extension(Rv32MTranspilerExtension)
53 .with_extension(Rv32IoTranspilerExtension),
54 )?;
55 let app_committed_exe = commit_app_exe(app_pk.app_fri_params(), exe);
56
57 let n = 800_000u64;
58 let mut stdin = StdIn::default();
59 stdin.write(&n);
60 run_with_metric_collection("OUTPUT_PATH", || {
61 let mut e2e_prover = EvmHalo2Prover::<_, BabyBearPoseidon2Engine>::new(
62 &halo2_params_reader,
63 app_pk,
64 app_committed_exe,
65 full_agg_pk,
66 args.agg_tree_config,
67 );
68 e2e_prover.set_program_name("fib_e2e");
69 let _proof = e2e_prover.generate_proof_for_evm(stdin);
70 });
71
72 Ok(())
73}