ソースを参照

refactor: active keysets

thesimplekid 1 年間 前
コミット
aef3007afc

+ 8 - 0
crates/cashu-sdk/src/mint/localstore/memory.rs

@@ -31,6 +31,10 @@ impl LocalStore for MemoryLocalStore {
         Ok(self.active_keysets.lock().await.get(unit).cloned())
     }
 
+    async fn get_active_keysets(&self) -> Result<HashMap<CurrencyUnit, Id>, Error> {
+        Ok(self.active_keysets.lock().await.clone())
+    }
+
     async fn add_keyset(&self, keyset: KeySet) -> Result<(), Error> {
         self.keysets.lock().await.insert(keyset.id, keyset);
         Ok(())
@@ -40,6 +44,10 @@ impl LocalStore for MemoryLocalStore {
         Ok(self.keysets.lock().await.get(keyset_id).cloned())
     }
 
+    async fn get_keysets(&self) -> Result<Vec<KeySet>, Error> {
+        Ok(self.keysets.lock().await.values().cloned().collect())
+    }
+
     async fn add_mint_quote(&self, quote: MintQuote) -> Result<(), Error> {
         self.mint_quotes
             .lock()

+ 4 - 0
crates/cashu-sdk/src/mint/localstore/mod.rs

@@ -1,5 +1,7 @@
 mod memory;
 
+use std::collections::HashMap;
+
 use async_trait::async_trait;
 use cashu::nuts::nut02::mint::KeySet;
 use cashu::nuts::{CurrencyUnit, Id, Proof};
@@ -36,6 +38,7 @@ pub enum Error {
 pub trait LocalStore {
     async fn add_active_keyset(&self, unit: CurrencyUnit, id: Id) -> Result<(), Error>;
     async fn get_active_keyset_id(&self, unit: &CurrencyUnit) -> Result<Option<Id>, Error>;
+    async fn get_active_keysets(&self) -> Result<HashMap<CurrencyUnit, Id>, Error>;
 
     async fn add_mint_quote(&self, quote: MintQuote) -> Result<(), Error>;
     async fn get_mint_quote(&self, quote_id: &str) -> Result<Option<MintQuote>, Error>;
@@ -47,6 +50,7 @@ pub trait LocalStore {
 
     async fn add_keyset(&self, keyset: KeySet) -> Result<(), Error>;
     async fn get_keyset(&self, id: &Id) -> Result<Option<KeySet>, Error>;
+    async fn get_keysets(&self) -> Result<Vec<KeySet>, Error>;
 
     async fn add_spent_proof(&self, secret: Secret, proof: Proof) -> Result<(), Error>;
     async fn get_spent_proof(&self, secret: &Secret) -> Result<Option<Proof>, Error>;

+ 28 - 36
crates/cashu-sdk/src/mint/mod.rs

@@ -1,4 +1,4 @@
-use std::collections::{HashMap, HashSet};
+use std::collections::HashSet;
 
 use cashu::dhke::{sign_message, verify_message};
 use cashu::nuts::{
@@ -14,7 +14,6 @@ use serde::{Deserialize, Serialize};
 use thiserror::Error;
 use tracing::{debug, info};
 
-use crate::utils::unix_time;
 use crate::Mnemonic;
 
 mod localstore;
@@ -53,8 +52,6 @@ pub enum Error {
 
 pub struct Mint<L: LocalStore> {
     //    pub pubkey: PublicKey
-    pub keysets_info: HashMap<Id, MintKeySetInfo>,
-    //    pub pubkey: PublicKey,
     mnemonic: Mnemonic,
     pub fee_reserve: FeeReserve,
     localstore: L,
@@ -68,8 +65,6 @@ impl<L: LocalStore> Mint<L> {
         min_fee_reserve: Amount,
         percent_fee_reserve: f32,
     ) -> Result<Self, Error> {
-        let mut info = HashMap::default();
-
         let mut active_units: HashSet<CurrencyUnit> = HashSet::default();
 
         // Check that there is only one active keyset per unit
@@ -86,15 +81,12 @@ impl<L: LocalStore> Mint<L> {
                 keyset_info.max_order,
             );
 
-            info.insert(keyset_info.id, keyset_info);
-
             localstore.add_keyset(keyset).await?;
         }
 
         Ok(Self {
             localstore,
             mnemonic,
-            keysets_info: info,
             fee_reserve: FeeReserve {
                 min_fee_reserve,
                 percent_fee_reserve,
@@ -147,14 +139,26 @@ impl<L: LocalStore> Mint<L> {
     }
 
     /// Return a list of all supported keysets
-    pub fn keysets(&self) -> KeysetResponse {
-        let keysets = self
-            .keysets_info
+    pub async fn keysets(&self) -> Result<KeysetResponse, Error> {
+        let keysets = self.localstore.get_keysets().await?;
+        let active_keysets: HashSet<Id> = self
+            .localstore
+            .get_active_keysets()
+            .await?
             .values()
-            .map(|k| k.clone().into())
+            .cloned()
             .collect();
 
-        KeysetResponse { keysets }
+        let keysets = keysets
+            .into_iter()
+            .map(|k| KeySetInfo {
+                id: k.id,
+                unit: k.unit,
+                active: active_keysets.contains(&k.id),
+            })
+            .collect();
+
+        Ok(KeysetResponse { keysets })
     }
 
     pub async fn keyset(&self, id: &Id) -> Result<Option<KeySet>, Error> {
@@ -182,23 +186,10 @@ impl<L: LocalStore> Mint<L> {
 
         self.localstore.add_keyset(new_keyset.clone()).await?;
 
-        for mint_keyset_info in self.keysets_info.values_mut() {
-            if mint_keyset_info.active && mint_keyset_info.unit.eq(&unit) {
-                mint_keyset_info.active = false;
-            }
-        }
+        self.localstore
+            .add_active_keyset(unit, new_keyset.id)
+            .await?;
 
-        let mint_keyset_info = MintKeySetInfo {
-            id: new_keyset.id,
-            unit,
-            derivation_path: derivation_path.to_string(),
-            active: true,
-            valid_from: unix_time(),
-            valid_to: None,
-            max_order,
-        };
-
-        self.keysets_info.insert(new_keyset.id, mint_keyset_info);
         Ok(())
     }
 
@@ -233,13 +224,14 @@ impl<L: LocalStore> Mint<L> {
             .await?
             .ok_or(Error::UnknownKeySet)?;
 
+        let active = self
+            .localstore
+            .get_active_keyset_id(&keyset.unit)
+            .await?
+            .ok_or(Error::InactiveKeyset)?;
+
         // Check that the keyset is active and should be used to sign
-        if !self
-            .keysets_info
-            .get(keyset_id)
-            .ok_or(Error::UnknownKeySet)?
-            .active
-        {
+        if keyset.id.ne(&active) {
             return Err(Error::InactiveKeyset);
         }
 

+ 1 - 11
crates/cashu/src/types.rs

@@ -3,7 +3,7 @@
 use serde::{Deserialize, Serialize};
 use uuid::Uuid;
 
-use crate::nuts::{CurrencyUnit, Id, Proofs};
+use crate::nuts::{CurrencyUnit, Proofs};
 use crate::Amount;
 
 #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
@@ -88,13 +88,3 @@ impl MeltQuote {
         }
     }
 }
-
-/// Keyset id
-#[derive(Debug, Hash, Clone, PartialEq, Eq, Serialize, Deserialize)]
-pub struct KeysetInfo {
-    pub id: Id,
-    pub valid_from: u64,
-    pub valid_to: Option<u64>,
-    pub derivation_path: String,
-    pub max_order: u8,
-}