kitchen_sink/
kitchen_sink.rs

1use std::{path::PathBuf, str::FromStr, sync::Arc};
2
3use clap::Parser;
4use eyre::Result;
5use num_bigint::BigUint;
6use openvm_algebra_circuit::{Fp2Extension, ModularExtension};
7use openvm_benchmarks_prove::util::BenchmarkCli;
8use openvm_circuit::arch::{instructions::exe::VmExe, SystemConfig};
9use openvm_ecc_circuit::{WeierstrassExtension, P256_CONFIG, SECP256K1_CONFIG};
10use openvm_native_recursion::halo2::utils::{CacheHalo2ParamsReader, DEFAULT_PARAMS_DIR};
11use openvm_pairing_circuit::{PairingCurve, PairingExtension};
12use openvm_sdk::{
13    commit::commit_app_exe, config::SdkVmConfig, prover::ContinuationProver,
14    DefaultStaticVerifierPvHandler, Sdk, StdIn,
15};
16use openvm_stark_sdk::{
17    bench::run_with_metric_collection, config::baby_bear_poseidon2::BabyBearPoseidon2Engine,
18};
19use openvm_transpiler::FromElf;
20
21fn main() -> Result<()> {
22    let args = BenchmarkCli::parse();
23
24    let elf = args.build_bench_program("kitchen-sink")?;
25    let bn_config = PairingCurve::Bn254.curve_config();
26    let bls_config = PairingCurve::Bls12_381.curve_config();
27    let vm_config = SdkVmConfig::builder()
28        .system(SystemConfig::default().with_continuations().into())
29        .rv32i(Default::default())
30        .rv32m(Default::default())
31        .io(Default::default())
32        .keccak(Default::default())
33        .sha256(Default::default())
34        .bigint(Default::default())
35        .modular(ModularExtension::new(vec![
36            BigUint::from_str("1000000000000000003").unwrap(),
37            SECP256K1_CONFIG.modulus.clone(),
38            SECP256K1_CONFIG.scalar.clone(),
39            P256_CONFIG.modulus.clone(),
40            P256_CONFIG.scalar.clone(),
41            bn_config.modulus.clone(),
42            bn_config.scalar.clone(),
43            bls_config.modulus.clone(),
44            bls_config.scalar.clone(),
45            BigUint::from(2u32).pow(61) - BigUint::from(1u32),
46            BigUint::from(7u32),
47        ]))
48        .fp2(Fp2Extension::new(vec![
49            bn_config.modulus.clone(),
50            bls_config.modulus.clone(),
51        ]))
52        .ecc(WeierstrassExtension::new(vec![
53            SECP256K1_CONFIG.clone(),
54            P256_CONFIG.clone(),
55            bn_config.clone(),
56            bls_config.clone(),
57        ]))
58        .pairing(PairingExtension::new(vec![
59            PairingCurve::Bn254,
60            PairingCurve::Bls12_381,
61        ]))
62        .build();
63    let exe = VmExe::from_elf(elf, vm_config.transpiler())?;
64
65    let sdk = Sdk::new();
66    let app_config = args.app_config(vm_config.clone());
67    let app_pk = Arc::new(sdk.app_keygen(app_config)?);
68    let app_committed_exe = commit_app_exe(app_pk.app_fri_params(), exe);
69
70    let agg_config = args.agg_config();
71    let halo2_params_reader = CacheHalo2ParamsReader::new(
72        args.kzg_params_dir
73            .clone()
74            .unwrap_or(PathBuf::from(DEFAULT_PARAMS_DIR)),
75    );
76    let full_agg_pk = sdk.agg_keygen(
77        agg_config,
78        &halo2_params_reader,
79        &DefaultStaticVerifierPvHandler,
80    )?;
81
82    run_with_metric_collection("OUTPUT_PATH", || -> Result<()> {
83        let mut prover = ContinuationProver::<_, BabyBearPoseidon2Engine>::new(
84            &halo2_params_reader,
85            app_pk,
86            app_committed_exe,
87            full_agg_pk,
88        );
89        prover.set_program_name("kitchen_sink");
90        let stdin = StdIn::default();
91        let _proof = prover.generate_proof_for_evm(stdin);
92        Ok(())
93    })
94}