verify_fibair/
verify_fibair.rs1use std::sync::Arc;
2
3use clap::Parser;
4use eyre::Result;
5use openvm_benchmarks_prove::util::BenchmarkCli;
6#[cfg(feature = "cuda")]
7use openvm_circuit::utils::cpu_proving_ctx_to_gpu;
8use openvm_circuit::{
9 arch::{
10 instructions::exe::VmExe, verify_single, SingleSegmentVmProver,
11 DEFAULT_MAX_NUM_PUBLIC_VALUES,
12 },
13 utils::TestStarkEngine as Poseidon2Engine,
14};
15use openvm_native_circuit::{NativeBuilder, NativeConfig, NATIVE_MAX_TRACE_HEIGHTS};
16use openvm_native_compiler::conversion::CompilerOptions;
17use openvm_native_recursion::testing_utils::inner::build_verification_program;
18use openvm_sdk::{
19 config::{AppConfig, DEFAULT_APP_LOG_BLOWUP, DEFAULT_LEAF_LOG_BLOWUP},
20 keygen::AppProvingKey,
21 prover::vm::new_local_prover,
22};
23use openvm_stark_sdk::{
24 bench::run_with_metric_collection, config::FriParameters,
25 dummy_airs::fib_air::chip::FibonacciChip, engine::StarkFriEngine, openvm_stark_backend::Chip,
26};
27use tracing::info_span;
28
29fn main() -> Result<()> {
34 let args = BenchmarkCli::parse();
35 let app_log_blowup = args.app_log_blowup.unwrap_or(DEFAULT_APP_LOG_BLOWUP);
36 let leaf_log_blowup = args.leaf_log_blowup.unwrap_or(DEFAULT_LEAF_LOG_BLOWUP);
37
38 let n = 1 << 15; let fib_chip = FibonacciChip::new(0, 1, n);
40 let engine = Poseidon2Engine::new(FriParameters::standard_with_100_bits_conjectured_security(
41 app_log_blowup,
42 ));
43
44 run_with_metric_collection("OUTPUT_PATH", || -> Result<()> {
45 let (fib_air, fib_ctx) = (
48 vec![fib_chip.air()],
49 vec![fib_chip.generate_proving_ctx(())],
50 );
51 #[cfg(feature = "cuda")]
52 let fib_ctx = fib_ctx.into_iter().map(cpu_proving_ctx_to_gpu).collect();
53 let vdata = engine.run_test(fib_air, fib_ctx).unwrap();
54 let app_fri_params =
56 FriParameters::standard_with_100_bits_conjectured_security(leaf_log_blowup);
57 let mut app_vm_config = NativeConfig::aggregation(
58 DEFAULT_MAX_NUM_PUBLIC_VALUES,
59 app_fri_params.max_constraint_degree().min(7),
60 );
61 app_vm_config.system.profiling = args.profiling;
62 app_vm_config.system.max_constraint_degree = (1 << app_log_blowup) + 1;
63
64 let compiler_options = CompilerOptions::default();
65 let app_config = AppConfig {
66 app_fri_params: app_fri_params.into(),
67 app_vm_config,
68 leaf_fri_params: app_fri_params.into(),
69 compiler_options,
70 };
71 let (program, input_stream) = build_verification_program(vdata, compiler_options);
72 let app_pk = AppProvingKey::keygen(app_config)?;
73 let app_vk = app_pk.get_app_vk();
74 let exe = Arc::new(VmExe::new(program));
75 let mut prover = new_local_prover::<Poseidon2Engine, _>(
76 NativeBuilder::default(),
77 &app_pk.app_vm_pk,
78 exe,
79 )?;
80 let proof = info_span!("verify_fibair", group = "verify_fibair").in_scope(|| {
81 #[cfg(feature = "metrics")]
82 metrics::counter!("fri.log_blowup")
83 .absolute(prover.vm.engine.fri_params().log_blowup as u64);
84 SingleSegmentVmProver::prove(&mut prover, input_stream, NATIVE_MAX_TRACE_HEIGHTS)
85 })?;
86 verify_single(&prover.vm.engine, &app_vk.vk, &proof)?;
87 Ok(())
88 })?;
89 Ok(())
90}