Ver Fonte

Removed KeysDatabase Trait from MintDatabase

All Keys operations should be done through the signatory
Cesar Rodas há 2 semanas atrás
pai
commit
a94febf043

+ 2 - 4
crates/cdk-common/src/database/mint/mod.rs

@@ -39,6 +39,7 @@ pub trait KeysDatabase {
     /// Get [`MintKeySetInfo`]s
     async fn get_keyset_infos(&self) -> Result<Vec<MintKeySetInfo>, Self::Err>;
 }
+
 /// Mint Quote Database trait
 #[async_trait]
 pub trait QuotesDatabase {
@@ -169,10 +170,7 @@ pub trait SignaturesDatabase {
 /// Mint Database trait
 #[async_trait]
 pub trait Database<Error>:
-    KeysDatabase<Err = Error>
-    + QuotesDatabase<Err = Error>
-    + ProofsDatabase<Err = Error>
-    + SignaturesDatabase<Err = Error>
+    QuotesDatabase<Err = Error> + ProofsDatabase<Err = Error> + SignaturesDatabase<Err = Error>
 {
     /// Set [`MintInfo`]
     async fn set_mint_info(&self, mint_info: MintInfo) -> Result<(), Error>;

+ 2 - 4
crates/cdk-integration-tests/tests/mint.rs

@@ -59,14 +59,13 @@ async fn test_correct_keyset() -> Result<()> {
     mint.rotate_next_keyset(CurrencyUnit::Sat, 32, 0).await?;
     mint.rotate_next_keyset(CurrencyUnit::Sat, 32, 0).await?;
 
-    let active = mint.localstore.get_active_keysets().await?;
+    let active = mint.get_active_keysets().await?;
 
     let active = active
         .get(&CurrencyUnit::Sat)
         .expect("There is a keyset for unit");
 
     let keyset_info = mint
-        .localstore
         .get_keyset_info(active)
         .await?
         .expect("There is keyset");
@@ -75,14 +74,13 @@ async fn test_correct_keyset() -> Result<()> {
 
     let mint = mint_builder.build().await?;
 
-    let active = mint.localstore.get_active_keysets().await?;
+    let active = mint.get_active_keysets().await?;
 
     let active = active
         .get(&CurrencyUnit::Sat)
         .expect("There is a keyset for unit");
 
     let keyset_info = mint
-        .localstore
         .get_keyset_info(active)
         .await?
         .expect("There is keyset");

+ 2 - 2
crates/cdk-signatory/src/common.rs

@@ -3,7 +3,7 @@ use std::sync::Arc;
 
 use bitcoin::bip32::{ChildNumber, DerivationPath, Xpriv};
 use bitcoin::secp256k1::{self, All, Secp256k1};
-use cdk_common::database::{self, MintDatabase};
+use cdk_common::database;
 use cdk_common::error::Error;
 use cdk_common::mint::MintKeySetInfo;
 use cdk_common::nuts::{CurrencyUnit, Id, MintKeySet};
@@ -15,7 +15,7 @@ use cdk_common::util::unix_time;
 pub async fn init_keysets(
     xpriv: Xpriv,
     secp_ctx: &Secp256k1<All>,
-    localstore: &Arc<dyn MintDatabase<database::Error> + Send + Sync>,
+    localstore: &Arc<dyn database::MintKeysDatabase<Err = database::Error> + Send + Sync>,
     supported_units: &HashMap<CurrencyUnit, (u64, u8)>,
     custom_paths: &HashMap<CurrencyUnit, DerivationPath>,
 ) -> Result<(HashMap<Id, MintKeySet>, Vec<CurrencyUnit>), Error> {

+ 3 - 3
crates/cdk-signatory/src/memory.rs

@@ -4,7 +4,7 @@ use std::sync::Arc;
 use bitcoin::bip32::{DerivationPath, Xpriv};
 use bitcoin::secp256k1::{self, Secp256k1};
 use cdk_common::amount::Amount;
-use cdk_common::database::{self, MintDatabase};
+use cdk_common::database;
 use cdk_common::dhke::{sign_message, verify_message};
 use cdk_common::error::Error;
 use cdk_common::mint::MintKeySetInfo;
@@ -26,7 +26,7 @@ use crate::signatory::{RotateKeyArguments, Signatory, SignatoryKeySet};
 /// is not accessible from the outside.
 pub struct Memory {
     keysets: RwLock<HashMap<Id, (MintKeySetInfo, MintKeySet)>>,
-    localstore: Arc<dyn MintDatabase<database::Error> + Send + Sync>,
+    localstore: Arc<dyn database::MintKeysDatabase<Err = database::Error> + Send + Sync>,
     auth_localstore:
         Option<Arc<dyn database::MintAuthDatabase<Err = database::Error> + Send + Sync>>,
     secp_ctx: Secp256k1<secp256k1::All>,
@@ -37,7 +37,7 @@ pub struct Memory {
 impl Memory {
     /// Creates a new MemorySignatory instance
     pub async fn new(
-        localstore: Arc<dyn MintDatabase<database::Error> + Send + Sync>,
+        localstore: Arc<dyn database::MintKeysDatabase<Err = database::Error> + Send + Sync>,
         auth_localstore: Option<
             Arc<dyn database::MintAuthDatabase<Err = database::Error> + Send + Sync>,
         >,

+ 13 - 2
crates/cdk/src/mint/builder.rs

@@ -5,7 +5,7 @@ use std::sync::Arc;
 
 use anyhow::anyhow;
 use bitcoin::bip32::DerivationPath;
-use cdk_common::database::{self, MintDatabase};
+use cdk_common::database::{self, MintDatabase, MintKeysDatabase};
 use cdk_common::error::Error;
 use cdk_common::payment::Bolt11Settings;
 use cdk_common::{nut21, nut22};
@@ -34,6 +34,8 @@ pub struct MintBuilder {
     pub mint_info: MintInfo,
     /// Mint Storage backend
     localstore: Option<Arc<dyn MintDatabase<database::Error> + Send + Sync>>,
+    ///
+    keystore: Option<Arc<dyn MintKeysDatabase<Err = database::Error> + Send + Sync>>,
     /// Mint Storage backend
     #[cfg(feature = "auth")]
     auth_localstore: Option<Arc<dyn MintAuthDatabase<Err = cdk_database::Error> + Send + Sync>>,
@@ -90,6 +92,15 @@ impl MintBuilder {
         self
     }
 
+    /// Set keystore database
+    pub fn with_keystore(
+        mut self,
+        keystore: Arc<dyn MintKeysDatabase<Err = database::Error> + Send + Sync>,
+    ) -> MintBuilder {
+        self.keystore = Some(keystore);
+        self
+    }
+
     /// Set auth localstore
     #[cfg(feature = "auth")]
     pub fn with_auth_localstore(
@@ -328,7 +339,7 @@ impl MintBuilder {
         } else {
             let seed = self.seed.as_ref().ok_or(anyhow!("Mint seed not set"))?;
             let in_memory_signatory = cdk_signatory::memory::Memory::new(
-                localstore.clone(),
+                self.keystore.clone().ok_or(anyhow!("keystore not set"))?,
                 None,
                 seed,
                 self.supported_units.clone(),

+ 36 - 4
crates/cdk/src/mint/mod.rs

@@ -286,9 +286,7 @@ impl Mint {
             if let std::collections::hash_map::Entry::Vacant(e) =
                 fee_per_keyset.entry(proof.keyset_id)
             {
-                // TODO: Get this from signatory
                 let mint_keyset_info = self
-                    .localstore
                     .get_keyset_info(&proof.keyset_id)
                     .await?
                     .ok_or(Error::UnknownKeySet)?;
@@ -306,6 +304,40 @@ impl Mint {
         Ok(fee)
     }
 
+    /// Get active keysets
+    pub async fn get_active_keysets(&self) -> Result<HashMap<CurrencyUnit, Id>, Error> {
+        Ok(self
+            .signatory
+            .keysets()
+            .await?
+            .into_iter()
+            .filter_map(|keyset| {
+                if keyset.info.active {
+                    Some((keyset.info.unit.clone(), keyset.info.id))
+                } else {
+                    None
+                }
+            })
+            .collect())
+    }
+
+    /// Get keyset info
+    pub async fn get_keyset_info(&self, id: &Id) -> Result<Option<MintKeySetInfo>, Error> {
+        Ok(self
+            .signatory
+            .keysets()
+            .await?
+            .into_iter()
+            .filter_map(|keyset| {
+                if keyset.info.id == *id {
+                    Some(keyset.info)
+                } else {
+                    None
+                }
+            })
+            .next())
+    }
+
     /// Blind Sign
     #[instrument(skip_all)]
     pub async fn blind_sign(
@@ -412,7 +444,7 @@ impl Mint {
     /// Get the total amount issed by keyset
     #[instrument(skip_all)]
     pub async fn total_issued(&self) -> Result<HashMap<Id, Amount>, Error> {
-        let keysets = self.localstore.get_keyset_infos().await?;
+        let keysets = self.keysets().await?.keysets;
 
         let mut total_issued = HashMap::new();
 
@@ -433,7 +465,7 @@ impl Mint {
     /// Total redeemed for keyset
     #[instrument(skip_all)]
     pub async fn total_redeemed(&self) -> Result<HashMap<Id, Amount>, Error> {
-        let keysets = self.localstore.get_keyset_infos().await?;
+        let keysets = self.keysets().await?.keysets;
 
         let mut total_redeemed = HashMap::new();
 

+ 2 - 2
crates/cdk/src/mint/verification.rs

@@ -66,7 +66,7 @@ impl Mint {
         let output_keyset_ids: HashSet<Id> = outputs.iter().map(|p| p.keyset_id).collect();
 
         for id in &output_keyset_ids {
-            match self.localstore.get_keyset_info(id).await? {
+            match self.get_keyset_info(id).await? {
                 Some(keyset) => {
                     if !keyset.active {
                         tracing::debug!(
@@ -115,7 +115,7 @@ impl Mint {
 
         for id in &inputs_keyset_ids {
             // TODO: Should ping the signatory instead of DB
-            match self.localstore.get_keyset_info(id).await? {
+            match self.get_keyset_info(id).await? {
                 Some(keyset) => {
                     keyset_units.insert(keyset.unit);
                 }