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}