vls_proxy/
persist.rs

1use lightning_signer::persist::{ExternalPersistHelper, SimpleEntropy};
2use std::collections::BTreeMap;
3use std::sync::{Arc, Mutex};
4use tokio::sync::Mutex as AsyncMutex;
5use vls_frontend::external_persist::ExternalPersist;
6
7/// Wraps an ExternalPersist with an ExternalPersistHelper.
8/// For use with monolithic signers, such as the inplace signer mode.
9/// WARNING: this does not ensure atomicity if mutated from different threads,
10/// ensure that you lock the `persist_client` mutex to ensure mutual exclusion.
11#[derive(Clone)]
12pub struct ExternalPersistWithHelper {
13    pub persist_client: Arc<AsyncMutex<Box<dyn ExternalPersist>>>,
14    pub state: Arc<Mutex<BTreeMap<String, (u64, Vec<u8>)>>>,
15    pub helper: ExternalPersistHelper,
16}
17
18impl ExternalPersistWithHelper {
19    pub async fn init_state(&self) {
20        let client = self.persist_client.lock().await;
21        let entropy = SimpleEntropy::new();
22        let mut helper = self.helper.clone();
23        let nonce = helper.new_nonce(&entropy);
24        let (muts, server_hmac) = client.get("".to_string(), &nonce).await.unwrap();
25        let success = helper.check_hmac(&muts, server_hmac);
26        assert!(success, "server hmac mismatch on get");
27        let mut local = self.state.lock().unwrap();
28        for (key, version_value) in muts.into_iter() {
29            local.insert(key, version_value);
30        }
31    }
32}