openvm_sdk/
halo2_params.rs

1use std::{
2    collections::HashMap,
3    io::BufReader,
4    path::{Path, PathBuf},
5    sync::{Arc, Mutex},
6};
7
8use openvm_static_verifier::{Halo2Params, Halo2ParamsReader};
9
10/// Caching reader for Halo2 KZG parameters.
11///
12/// Reads SRS files from a directory and caches them in memory for reuse.
13pub struct CacheHalo2ParamsReader {
14    params_dir: PathBuf,
15    cached: Mutex<HashMap<usize, Arc<Halo2Params>>>,
16}
17
18impl Halo2ParamsReader for CacheHalo2ParamsReader {
19    fn read_params(&self, k: usize) -> Arc<Halo2Params> {
20        self.read_params(k)
21    }
22}
23
24impl CacheHalo2ParamsReader {
25    pub fn new(params_dir: impl AsRef<Path>) -> Self {
26        Self {
27            params_dir: params_dir.as_ref().to_path_buf(),
28            cached: Mutex::new(HashMap::new()),
29        }
30    }
31
32    /// Create a reader using the default params directory: `~/.openvm/params/`.
33    pub fn new_with_default_params_dir() -> Self {
34        let home = std::env::var("HOME").unwrap_or_else(|_| ".".to_string());
35        let params_dir = PathBuf::from(home).join(".openvm").join("params");
36        Self::new(params_dir)
37    }
38
39    /// Read the KZG params for a given `k` value, caching the result.
40    pub fn read_params(&self, k: usize) -> Arc<Halo2Params> {
41        let mut cache = self.cached.lock().unwrap();
42        if let Some(params) = cache.get(&k) {
43            return params.clone();
44        }
45        let path = self.params_dir.join(format!("kzg_bn254_{k}.srs"));
46        let file = std::fs::File::open(&path)
47            .unwrap_or_else(|e| panic!("Failed to open params file {}: {e}", path.display()));
48        let mut reader = BufReader::new(file);
49
50        // read_custom with RawBytes format
51        let params =
52            Halo2Params::read_custom(&mut reader, halo2_base::halo2_proofs::SerdeFormat::RawBytes)
53                .unwrap_or_else(|e| panic!("Failed to read params from {}: {e}", path.display()));
54
55        let params = Arc::new(params);
56        cache.insert(k, params.clone());
57        params
58    }
59}