openvm_sdk/
halo2_params.rs1use std::{
2 collections::HashMap,
3 io::BufReader,
4 path::{Path, PathBuf},
5 sync::{Arc, Mutex},
6};
7
8use openvm_static_verifier::{Halo2Params, Halo2ParamsReader};
9
10pub 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 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 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 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}