miden_tx/prover/
mast_store.rs1use alloc::collections::BTreeMap;
2use alloc::sync::Arc;
3
4use miden_lib::transaction::TransactionKernel;
5use miden_lib::{MidenLib, StdLibrary};
6use miden_objects::Word;
7use miden_objects::account::AccountCode;
8use miden_objects::assembly::mast::MastForest;
9use miden_objects::utils::sync::RwLock;
10use miden_processor::MastForestStore;
11
12pub struct TransactionMastStore {
23 mast_forests: RwLock<BTreeMap<Word, Arc<MastForest>>>,
24}
25
26#[allow(clippy::new_without_default)]
27impl TransactionMastStore {
28 pub fn new() -> Self {
35 let mast_forests = RwLock::new(BTreeMap::new());
36 let store = Self { mast_forests };
37
38 let kernels_forest = TransactionKernel::kernel().mast_forest().clone();
40 store.insert(kernels_forest);
41
42 let miden_stdlib_forest = StdLibrary::default().mast_forest().clone();
44 store.insert(miden_stdlib_forest);
45
46 let miden_lib_forest = MidenLib::default().mast_forest().clone();
48 store.insert(miden_lib_forest);
49
50 store
51 }
52
53 pub fn insert(&self, mast_forest: Arc<MastForest>) {
55 let mut mast_forests = self.mast_forests.write();
56
57 for proc_digest in mast_forest.local_procedure_digests() {
59 mast_forests.insert(proc_digest, mast_forest.clone());
60 }
61 }
62
63 pub fn load_account_code(&self, code: &AccountCode) {
65 self.insert(code.mast().clone());
66 }
67}
68
69impl MastForestStore for TransactionMastStore {
73 fn get(&self, procedure_root: &Word) -> Option<Arc<MastForest>> {
74 self.mast_forests.read().get(procedure_root).cloned()
75 }
76}