openvm_static_verifier/
config.rs

1use halo2_base::gates::circuit::BaseCircuitParams;
2use serde::{Deserialize, Serialize};
3
4pub const STATIC_VERIFIER_NUM_ADVICE_COLS: usize = 1;
5pub const STATIC_VERIFIER_LOOKUP_ADVICE_COLS: usize = 1;
6
7pub const DEFAULT_HALO2_VERIFIER_K: usize = 23;
8pub const ONCHAIN_VERIFIER_NUM_INSTANCE_COLS: usize = 1;
9
10#[derive(Clone, Copy, Debug, Serialize, Deserialize)]
11pub struct StaticVerifierShape {
12    pub k: usize,
13    pub lookup_bits: usize,
14    pub minimum_rows: usize,
15    pub instance_columns: usize,
16}
17
18impl Default for StaticVerifierShape {
19    fn default() -> Self {
20        Self {
21            k: DEFAULT_HALO2_VERIFIER_K,
22            lookup_bits: DEFAULT_HALO2_VERIFIER_K - 1,
23            minimum_rows: 20,
24            instance_columns: 1,
25        }
26    }
27}
28
29impl StaticVerifierShape {
30    /// OpenVM's EVM/on-chain proof format exposes all public values in one instance column.
31    /// Other static verifier uses may choose a different instance-column shape.
32    pub fn assert_onchain_verifier_supported(&self) {
33        assert_eq!(
34            self.instance_columns, ONCHAIN_VERIFIER_NUM_INSTANCE_COLS,
35            "OpenVM on-chain verifier supports exactly {ONCHAIN_VERIFIER_NUM_INSTANCE_COLS} instance column, got {}",
36            self.instance_columns
37        );
38    }
39
40    pub fn expected_phase0_params(&self) -> BaseCircuitParams {
41        BaseCircuitParams {
42            k: self.k,
43            num_advice_per_phase: vec![STATIC_VERIFIER_NUM_ADVICE_COLS],
44            num_fixed: 1,
45            num_lookup_advice_per_phase: vec![STATIC_VERIFIER_LOOKUP_ADVICE_COLS],
46            lookup_bits: Some(self.lookup_bits),
47            num_instance_columns: self.instance_columns,
48        }
49    }
50}