mint_memory.rs 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416
  1. //! Mint in memory database
  2. use std::collections::HashMap;
  3. use std::sync::Arc;
  4. use async_trait::async_trait;
  5. use tokio::sync::{Mutex, RwLock};
  6. use uuid::Uuid;
  7. use super::{Error, MintDatabase};
  8. use crate::dhke::hash_to_curve;
  9. use crate::mint::{self, MintKeySetInfo, MintQuote};
  10. use crate::nuts::nut00::ProofsMethods;
  11. use crate::nuts::nut07::State;
  12. use crate::nuts::{
  13. nut07, BlindSignature, CurrencyUnit, Id, MeltBolt11Request, MeltQuoteState, MintQuoteState,
  14. Proof, Proofs, PublicKey,
  15. };
  16. use crate::types::LnKey;
  17. /// Mint Memory Database
  18. #[derive(Debug, Clone, Default)]
  19. #[allow(clippy::type_complexity)]
  20. pub struct MintMemoryDatabase {
  21. active_keysets: Arc<RwLock<HashMap<CurrencyUnit, Id>>>,
  22. keysets: Arc<RwLock<HashMap<Id, MintKeySetInfo>>>,
  23. mint_quotes: Arc<RwLock<HashMap<Uuid, MintQuote>>>,
  24. melt_quotes: Arc<RwLock<HashMap<Uuid, mint::MeltQuote>>>,
  25. proofs: Arc<RwLock<HashMap<[u8; 33], Proof>>>,
  26. proof_state: Arc<Mutex<HashMap<[u8; 33], nut07::State>>>,
  27. quote_proofs: Arc<Mutex<HashMap<Uuid, Vec<PublicKey>>>>,
  28. blinded_signatures: Arc<RwLock<HashMap<[u8; 33], BlindSignature>>>,
  29. quote_signatures: Arc<RwLock<HashMap<Uuid, Vec<BlindSignature>>>>,
  30. melt_requests: Arc<RwLock<HashMap<Uuid, (MeltBolt11Request<Uuid>, LnKey)>>>,
  31. }
  32. impl MintMemoryDatabase {
  33. /// Create new [`MintMemoryDatabase`]
  34. #[allow(clippy::too_many_arguments)]
  35. pub fn new(
  36. active_keysets: HashMap<CurrencyUnit, Id>,
  37. keysets: Vec<MintKeySetInfo>,
  38. mint_quotes: Vec<MintQuote>,
  39. melt_quotes: Vec<mint::MeltQuote>,
  40. pending_proofs: Proofs,
  41. spent_proofs: Proofs,
  42. quote_proofs: HashMap<Uuid, Vec<PublicKey>>,
  43. blinded_signatures: HashMap<[u8; 33], BlindSignature>,
  44. quote_signatures: HashMap<Uuid, Vec<BlindSignature>>,
  45. melt_request: Vec<(MeltBolt11Request<Uuid>, LnKey)>,
  46. ) -> Result<Self, Error> {
  47. let mut proofs = HashMap::new();
  48. let mut proof_states = HashMap::new();
  49. for proof in pending_proofs {
  50. let y = hash_to_curve(&proof.secret.to_bytes())?.to_bytes();
  51. proofs.insert(y, proof);
  52. proof_states.insert(y, State::Pending);
  53. }
  54. for proof in spent_proofs {
  55. let y = hash_to_curve(&proof.secret.to_bytes())?.to_bytes();
  56. proofs.insert(y, proof);
  57. proof_states.insert(y, State::Spent);
  58. }
  59. let melt_requests = melt_request
  60. .into_iter()
  61. .map(|(request, ln_key)| (request.quote, (request, ln_key)))
  62. .collect();
  63. Ok(Self {
  64. active_keysets: Arc::new(RwLock::new(active_keysets)),
  65. keysets: Arc::new(RwLock::new(
  66. keysets.into_iter().map(|k| (k.id, k)).collect(),
  67. )),
  68. mint_quotes: Arc::new(RwLock::new(
  69. mint_quotes.into_iter().map(|q| (q.id, q)).collect(),
  70. )),
  71. melt_quotes: Arc::new(RwLock::new(
  72. melt_quotes.into_iter().map(|q| (q.id, q)).collect(),
  73. )),
  74. proofs: Arc::new(RwLock::new(proofs)),
  75. proof_state: Arc::new(Mutex::new(proof_states)),
  76. blinded_signatures: Arc::new(RwLock::new(blinded_signatures)),
  77. quote_proofs: Arc::new(Mutex::new(quote_proofs)),
  78. quote_signatures: Arc::new(RwLock::new(quote_signatures)),
  79. melt_requests: Arc::new(RwLock::new(melt_requests)),
  80. })
  81. }
  82. }
  83. #[async_trait]
  84. impl MintDatabase for MintMemoryDatabase {
  85. type Err = Error;
  86. async fn set_active_keyset(&self, unit: CurrencyUnit, id: Id) -> Result<(), Self::Err> {
  87. self.active_keysets.write().await.insert(unit, id);
  88. Ok(())
  89. }
  90. async fn get_active_keyset_id(&self, unit: &CurrencyUnit) -> Result<Option<Id>, Self::Err> {
  91. Ok(self.active_keysets.read().await.get(unit).cloned())
  92. }
  93. async fn get_active_keysets(&self) -> Result<HashMap<CurrencyUnit, Id>, Self::Err> {
  94. Ok(self.active_keysets.read().await.clone())
  95. }
  96. async fn add_keyset_info(&self, keyset: MintKeySetInfo) -> Result<(), Self::Err> {
  97. self.keysets.write().await.insert(keyset.id, keyset);
  98. Ok(())
  99. }
  100. async fn get_keyset_info(&self, keyset_id: &Id) -> Result<Option<MintKeySetInfo>, Self::Err> {
  101. Ok(self.keysets.read().await.get(keyset_id).cloned())
  102. }
  103. async fn get_keyset_infos(&self) -> Result<Vec<MintKeySetInfo>, Self::Err> {
  104. Ok(self.keysets.read().await.values().cloned().collect())
  105. }
  106. async fn add_mint_quote(&self, quote: MintQuote) -> Result<(), Self::Err> {
  107. self.mint_quotes.write().await.insert(quote.id, quote);
  108. Ok(())
  109. }
  110. async fn get_mint_quote(&self, quote_id: &Uuid) -> Result<Option<MintQuote>, Self::Err> {
  111. Ok(self.mint_quotes.read().await.get(quote_id).cloned())
  112. }
  113. async fn update_mint_quote_state(
  114. &self,
  115. quote_id: &Uuid,
  116. state: MintQuoteState,
  117. ) -> Result<MintQuoteState, Self::Err> {
  118. let mut mint_quotes = self.mint_quotes.write().await;
  119. let mut quote = mint_quotes
  120. .get(quote_id)
  121. .cloned()
  122. .ok_or(Error::UnknownQuote)?;
  123. let current_state = quote.state;
  124. quote.state = state;
  125. mint_quotes.insert(*quote_id, quote.clone());
  126. Ok(current_state)
  127. }
  128. async fn get_mint_quote_by_request_lookup_id(
  129. &self,
  130. request: &str,
  131. ) -> Result<Option<MintQuote>, Self::Err> {
  132. let quotes = self.get_mint_quotes().await?;
  133. let quote = quotes
  134. .into_iter()
  135. .filter(|q| q.request_lookup_id.eq(request))
  136. .collect::<Vec<MintQuote>>()
  137. .first()
  138. .cloned();
  139. Ok(quote)
  140. }
  141. async fn get_mint_quote_by_request(
  142. &self,
  143. request: &str,
  144. ) -> Result<Option<MintQuote>, Self::Err> {
  145. let quotes = self.get_mint_quotes().await?;
  146. let quote = quotes
  147. .into_iter()
  148. .filter(|q| q.request.eq(request))
  149. .collect::<Vec<MintQuote>>()
  150. .first()
  151. .cloned();
  152. Ok(quote)
  153. }
  154. async fn get_mint_quotes(&self) -> Result<Vec<MintQuote>, Self::Err> {
  155. Ok(self.mint_quotes.read().await.values().cloned().collect())
  156. }
  157. async fn remove_mint_quote(&self, quote_id: &Uuid) -> Result<(), Self::Err> {
  158. self.mint_quotes.write().await.remove(quote_id);
  159. Ok(())
  160. }
  161. async fn add_melt_quote(&self, quote: mint::MeltQuote) -> Result<(), Self::Err> {
  162. self.melt_quotes.write().await.insert(quote.id, quote);
  163. Ok(())
  164. }
  165. async fn get_melt_quote(&self, quote_id: &Uuid) -> Result<Option<mint::MeltQuote>, Self::Err> {
  166. Ok(self.melt_quotes.read().await.get(quote_id).cloned())
  167. }
  168. async fn update_melt_quote_state(
  169. &self,
  170. quote_id: &Uuid,
  171. state: MeltQuoteState,
  172. ) -> Result<MeltQuoteState, Self::Err> {
  173. let mut melt_quotes = self.melt_quotes.write().await;
  174. let mut quote = melt_quotes
  175. .get(quote_id)
  176. .cloned()
  177. .ok_or(Error::UnknownQuote)?;
  178. let current_state = quote.state;
  179. quote.state = state;
  180. melt_quotes.insert(*quote_id, quote.clone());
  181. Ok(current_state)
  182. }
  183. async fn get_melt_quotes(&self) -> Result<Vec<mint::MeltQuote>, Self::Err> {
  184. Ok(self.melt_quotes.read().await.values().cloned().collect())
  185. }
  186. async fn remove_melt_quote(&self, quote_id: &Uuid) -> Result<(), Self::Err> {
  187. self.melt_quotes.write().await.remove(quote_id);
  188. Ok(())
  189. }
  190. async fn add_melt_request(
  191. &self,
  192. melt_request: MeltBolt11Request<Uuid>,
  193. ln_key: LnKey,
  194. ) -> Result<(), Self::Err> {
  195. let mut melt_requests = self.melt_requests.write().await;
  196. melt_requests.insert(melt_request.quote, (melt_request, ln_key));
  197. Ok(())
  198. }
  199. async fn get_melt_request(
  200. &self,
  201. quote_id: &Uuid,
  202. ) -> Result<Option<(MeltBolt11Request<Uuid>, LnKey)>, Self::Err> {
  203. let melt_requests = self.melt_requests.read().await;
  204. let melt_request = melt_requests.get(quote_id);
  205. Ok(melt_request.cloned())
  206. }
  207. async fn add_proofs(&self, proofs: Proofs, quote_id: Option<Uuid>) -> Result<(), Self::Err> {
  208. let mut db_proofs = self.proofs.write().await;
  209. let mut ys = Vec::with_capacity(proofs.capacity());
  210. for proof in proofs {
  211. let y = hash_to_curve(&proof.secret.to_bytes())?;
  212. ys.push(y);
  213. let y = y.to_bytes();
  214. db_proofs.insert(y, proof);
  215. }
  216. if let Some(quote_id) = quote_id {
  217. let mut db_quote_proofs = self.quote_proofs.lock().await;
  218. db_quote_proofs.insert(quote_id, ys);
  219. }
  220. Ok(())
  221. }
  222. async fn get_proofs_by_ys(&self, ys: &[PublicKey]) -> Result<Vec<Option<Proof>>, Self::Err> {
  223. let spent_proofs = self.proofs.read().await;
  224. let mut proofs = Vec::with_capacity(ys.len());
  225. for y in ys {
  226. let proof = spent_proofs.get(&y.to_bytes()).cloned();
  227. proofs.push(proof);
  228. }
  229. Ok(proofs)
  230. }
  231. async fn get_proof_ys_by_quote_id(&self, quote_id: &Uuid) -> Result<Vec<PublicKey>, Self::Err> {
  232. let quote_proofs = &__self.quote_proofs.lock().await;
  233. match quote_proofs.get(quote_id) {
  234. Some(ys) => Ok(ys.clone()),
  235. None => Ok(vec![]),
  236. }
  237. }
  238. async fn update_proofs_states(
  239. &self,
  240. ys: &[PublicKey],
  241. proof_state: State,
  242. ) -> Result<Vec<Option<State>>, Self::Err> {
  243. let mut proofs_states = self.proof_state.lock().await;
  244. let mut states = Vec::new();
  245. for y in ys {
  246. let state = proofs_states.insert(y.to_bytes(), proof_state);
  247. states.push(state);
  248. }
  249. Ok(states)
  250. }
  251. async fn get_proofs_states(&self, ys: &[PublicKey]) -> Result<Vec<Option<State>>, Self::Err> {
  252. let proofs_states = self.proof_state.lock().await;
  253. let mut states = Vec::new();
  254. for y in ys {
  255. let state = proofs_states.get(&y.to_bytes()).cloned();
  256. states.push(state);
  257. }
  258. Ok(states)
  259. }
  260. async fn get_proofs_by_keyset_id(
  261. &self,
  262. keyset_id: &Id,
  263. ) -> Result<(Proofs, Vec<Option<State>>), Self::Err> {
  264. let proofs = self.proofs.read().await;
  265. let proofs_for_id: Proofs = proofs
  266. .iter()
  267. .filter_map(|(_, p)| match &p.keyset_id == keyset_id {
  268. true => Some(p),
  269. false => None,
  270. })
  271. .cloned()
  272. .collect();
  273. let proof_ys = proofs_for_id.ys()?;
  274. assert_eq!(proofs_for_id.len(), proof_ys.len());
  275. let states = self.get_proofs_states(&proof_ys).await?;
  276. Ok((proofs_for_id, states))
  277. }
  278. async fn add_blind_signatures(
  279. &self,
  280. blinded_message: &[PublicKey],
  281. blind_signatures: &[BlindSignature],
  282. quote_id: Option<Uuid>,
  283. ) -> Result<(), Self::Err> {
  284. let mut current_blinded_signatures = self.blinded_signatures.write().await;
  285. for (blinded_message, blind_signature) in blinded_message.iter().zip(blind_signatures) {
  286. current_blinded_signatures.insert(blinded_message.to_bytes(), blind_signature.clone());
  287. }
  288. if let Some(quote_id) = quote_id {
  289. let mut current_quote_signatures = self.quote_signatures.write().await;
  290. current_quote_signatures.insert(quote_id, blind_signatures.to_vec());
  291. let t = current_quote_signatures.get(&quote_id);
  292. println!("after insert: {:?}", t);
  293. }
  294. Ok(())
  295. }
  296. async fn get_blind_signatures(
  297. &self,
  298. blinded_messages: &[PublicKey],
  299. ) -> Result<Vec<Option<BlindSignature>>, Self::Err> {
  300. let mut signatures = Vec::with_capacity(blinded_messages.len());
  301. let blinded_signatures = self.blinded_signatures.read().await;
  302. for blinded_message in blinded_messages {
  303. let signature = blinded_signatures.get(&blinded_message.to_bytes()).cloned();
  304. signatures.push(signature)
  305. }
  306. Ok(signatures)
  307. }
  308. async fn get_blind_signatures_for_keyset(
  309. &self,
  310. keyset_id: &Id,
  311. ) -> Result<Vec<BlindSignature>, Self::Err> {
  312. let blinded_signatures = self.blinded_signatures.read().await;
  313. Ok(blinded_signatures
  314. .values()
  315. .filter(|b| &b.keyset_id == keyset_id)
  316. .cloned()
  317. .collect())
  318. }
  319. /// Get [`BlindSignature`]s for quote
  320. async fn get_blind_signatures_for_quote(
  321. &self,
  322. quote_id: &Uuid,
  323. ) -> Result<Vec<BlindSignature>, Self::Err> {
  324. let ys = self.quote_signatures.read().await;
  325. Ok(ys.get(quote_id).cloned().unwrap_or_default())
  326. }
  327. }