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    // Must be larger than RangeTupleCheckerAir.height == 524288
27    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}