From 55fd8148a00411345ff960712f8a41508fb3cd5c Mon Sep 17 00:00:00 2001 From: Machu Pikacchu <177660647+machuPikacchuBTC@users.noreply.github.com> Date: Wed, 4 Jun 2025 01:28:26 +0000 Subject: [PATCH] fetch quotes from mint with HTTP client --- protocols/v2/subprotocols/mining/Cargo.toml | 2 +- roles/Cargo.lock | 33 ++++++---- roles/mint/Cargo.toml | 12 ++-- roles/pool/Cargo.toml | 2 +- roles/translator/Cargo.toml | 2 +- roles/translator/src/lib/mod.rs | 71 +++++++++++++-------- 6 files changed, 72 insertions(+), 50 deletions(-) diff --git a/protocols/v2/subprotocols/mining/Cargo.toml b/protocols/v2/subprotocols/mining/Cargo.toml index 381692628..7a7029199 100644 --- a/protocols/v2/subprotocols/mining/Cargo.toml +++ b/protocols/v2/subprotocols/mining/Cargo.toml @@ -19,7 +19,7 @@ serde = { version = "1.0.89", default-features = false, optional= true } binary_sv2 = {version = "^1.0.0", path = "../../binary-sv2/binary-sv2" } const_sv2 = {version = "^3.0.0", path = "../../const-sv2"} derive_codec_sv2 = {version = "^1.0.0", path = "../../../../protocols/v2/binary-sv2/no-serde-sv2/derive_codec"} -cdk = { git = "https://github.com/vnprc/cdk", rev = "773af52b" } +cdk = { git = "https://github.com/vnprc/cdk", rev = "64ec7f6f" } serde_json = "1.0" tracing = { version = "0.1" } diff --git a/roles/Cargo.lock b/roles/Cargo.lock index 8a98410b8..589e65def 100644 --- a/roles/Cargo.lock +++ b/roles/Cargo.lock @@ -902,7 +902,7 @@ dependencies = [ [[package]] name = "cashu" version = "0.7.1" -source = "git+https://github.com/vnprc/cdk?rev=773af52b#773af52b5977efa53fa4d094134425270497e422" +source = "git+https://github.com/vnprc/cdk?rev=64ec7f6f#64ec7f6f8681fc3707a0f5e023fcdb2fa0a60a5e" dependencies = [ "bitcoin 0.32.6", "bitcoin_hashes 0.16.0", @@ -953,7 +953,7 @@ dependencies = [ [[package]] name = "cdk" version = "0.7.1" -source = "git+https://github.com/vnprc/cdk?rev=773af52b#773af52b5977efa53fa4d094134425270497e422" +source = "git+https://github.com/vnprc/cdk?rev=64ec7f6f#64ec7f6f8681fc3707a0f5e023fcdb2fa0a60a5e" dependencies = [ "anyhow", "async-trait", @@ -982,15 +982,17 @@ dependencies = [ [[package]] name = "cdk-axum" version = "0.7.1" -source = "git+https://github.com/vnprc/cdk?rev=773af52b#773af52b5977efa53fa4d094134425270497e422" +source = "git+https://github.com/vnprc/cdk?rev=64ec7f6f#64ec7f6f8681fc3707a0f5e023fcdb2fa0a60a5e" dependencies = [ "anyhow", "async-trait", "axum", "cdk", + "cdk-common", "futures", "moka", "paste", + "redis 0.23.3", "serde", "serde_json", "sha2 0.10.9", @@ -1002,7 +1004,7 @@ dependencies = [ [[package]] name = "cdk-cln" version = "0.7.1" -source = "git+https://github.com/vnprc/cdk?rev=773af52b#773af52b5977efa53fa4d094134425270497e422" +source = "git+https://github.com/vnprc/cdk?rev=64ec7f6f#64ec7f6f8681fc3707a0f5e023fcdb2fa0a60a5e" dependencies = [ "async-trait", "bitcoin 0.32.6", @@ -1019,7 +1021,7 @@ dependencies = [ [[package]] name = "cdk-common" version = "0.7.1" -source = "git+https://github.com/vnprc/cdk?rev=773af52b#773af52b5977efa53fa4d094134425270497e422" +source = "git+https://github.com/vnprc/cdk?rev=64ec7f6f#64ec7f6f8681fc3707a0f5e023fcdb2fa0a60a5e" dependencies = [ "anyhow", "async-trait", @@ -1042,7 +1044,7 @@ dependencies = [ [[package]] name = "cdk-fake-wallet" version = "0.7.1" -source = "git+https://github.com/vnprc/cdk?rev=773af52b#773af52b5977efa53fa4d094134425270497e422" +source = "git+https://github.com/vnprc/cdk?rev=64ec7f6f#64ec7f6f8681fc3707a0f5e023fcdb2fa0a60a5e" dependencies = [ "async-trait", "bitcoin 0.32.6", @@ -1061,7 +1063,7 @@ dependencies = [ [[package]] name = "cdk-lnbits" version = "0.7.1" -source = "git+https://github.com/vnprc/cdk?rev=773af52b#773af52b5977efa53fa4d094134425270497e422" +source = "git+https://github.com/vnprc/cdk?rev=64ec7f6f#64ec7f6f8681fc3707a0f5e023fcdb2fa0a60a5e" dependencies = [ "anyhow", "async-trait", @@ -1079,7 +1081,7 @@ dependencies = [ [[package]] name = "cdk-lnd" version = "0.7.1" -source = "git+https://github.com/vnprc/cdk?rev=773af52b#773af52b5977efa53fa4d094134425270497e422" +source = "git+https://github.com/vnprc/cdk?rev=64ec7f6f#64ec7f6f8681fc3707a0f5e023fcdb2fa0a60a5e" dependencies = [ "anyhow", "async-trait", @@ -1095,7 +1097,7 @@ dependencies = [ [[package]] name = "cdk-mint-rpc" version = "0.7.1" -source = "git+https://github.com/vnprc/cdk?rev=773af52b#773af52b5977efa53fa4d094134425270497e422" +source = "git+https://github.com/vnprc/cdk?rev=64ec7f6f#64ec7f6f8681fc3707a0f5e023fcdb2fa0a60a5e" dependencies = [ "anyhow", "cdk", @@ -1115,7 +1117,7 @@ dependencies = [ [[package]] name = "cdk-mintd" version = "0.7.2" -source = "git+https://github.com/vnprc/cdk?rev=773af52b#773af52b5977efa53fa4d094134425270497e422" +source = "git+https://github.com/vnprc/cdk?rev=64ec7f6f#64ec7f6f8681fc3707a0f5e023fcdb2fa0a60a5e" dependencies = [ "anyhow", "axum", @@ -1148,7 +1150,7 @@ dependencies = [ [[package]] name = "cdk-phoenixd" version = "0.7.1" -source = "git+https://github.com/vnprc/cdk?rev=773af52b#773af52b5977efa53fa4d094134425270497e422" +source = "git+https://github.com/vnprc/cdk?rev=64ec7f6f#64ec7f6f8681fc3707a0f5e023fcdb2fa0a60a5e" dependencies = [ "anyhow", "async-trait", @@ -1167,7 +1169,7 @@ dependencies = [ [[package]] name = "cdk-redb" version = "0.7.1" -source = "git+https://github.com/vnprc/cdk?rev=773af52b#773af52b5977efa53fa4d094134425270497e422" +source = "git+https://github.com/vnprc/cdk?rev=64ec7f6f#64ec7f6f8681fc3707a0f5e023fcdb2fa0a60a5e" dependencies = [ "async-trait", "cdk-common", @@ -1183,7 +1185,7 @@ dependencies = [ [[package]] name = "cdk-sqlite" version = "0.7.1" -source = "git+https://github.com/vnprc/cdk?rev=773af52b#773af52b5977efa53fa4d094134425270497e422" +source = "git+https://github.com/vnprc/cdk?rev=64ec7f6f#64ec7f6f8681fc3707a0f5e023fcdb2fa0a60a5e" dependencies = [ "async-trait", "bitcoin 0.32.6", @@ -1200,7 +1202,7 @@ dependencies = [ [[package]] name = "cdk-strike" version = "0.7.1" -source = "git+https://github.com/vnprc/cdk?rev=773af52b#773af52b5977efa53fa4d094134425270497e422" +source = "git+https://github.com/vnprc/cdk?rev=64ec7f6f#64ec7f6f8681fc3707a0f5e023fcdb2fa0a60a5e" dependencies = [ "anyhow", "async-trait", @@ -3962,10 +3964,13 @@ dependencies = [ "itoa", "percent-encoding", "pin-project-lite", + "rustls 0.21.12", + "rustls-native-certs 0.6.3", "ryu", "sha1_smol", "socket2 0.4.10", "tokio", + "tokio-rustls 0.24.1", "tokio-util", "url", ] diff --git a/roles/mint/Cargo.toml b/roles/mint/Cargo.toml index 500515607..cb9c304e4 100644 --- a/roles/mint/Cargo.toml +++ b/roles/mint/Cargo.toml @@ -17,11 +17,11 @@ serde = { version = "1", features = ["derive"] } serde_json = "1" bitcoin = { version= "0.32.2" } -cdk = { git = "https://github.com/vnprc/cdk.git", package = "cdk", rev = "773af52b" } -cdk-axum = { git = "https://github.com/vnprc/cdk.git", package = "cdk-axum", rev = "773af52b" } -cdk-mintd = { git = "https://github.com/vnprc/cdk.git", package = "cdk-mintd", rev = "773af52b" } -cdk-sqlite = { git = "https://github.com/vnprc/cdk.git", package = "cdk-sqlite", rev = "773af52b" } -cdk-redb = { git = "https://github.com/vnprc/cdk.git", package = "cdk-redb", rev = "773af52b" } +cdk = { git = "https://github.com/vnprc/cdk.git", package = "cdk", rev = "64ec7f6f" } +cdk-axum = { git = "https://github.com/vnprc/cdk.git", package = "cdk-axum", rev = "64ec7f6f", features = ["redis"]} +cdk-mintd = { git = "https://github.com/vnprc/cdk.git", package = "cdk-mintd", rev = "64ec7f6f" } +cdk-sqlite = { git = "https://github.com/vnprc/cdk.git", package = "cdk-sqlite", rev = "64ec7f6f" } +cdk-redb = { git = "https://github.com/vnprc/cdk.git", package = "cdk-redb", rev = "64ec7f6f" } toml = "0.8.22" -shared_config = { path = "../roles-utils/config" } \ No newline at end of file +shared_config = { path = "../roles-utils/config" } diff --git a/roles/pool/Cargo.toml b/roles/pool/Cargo.toml index 97d4d1245..b7f08b714 100644 --- a/roles/pool/Cargo.toml +++ b/roles/pool/Cargo.toml @@ -39,7 +39,7 @@ key-utils = { version = "^1.0.0", path = "../../utils/key-utils" } bip39 = { version = "2.0", features = ["rand"] } mining_sv2 = { version = "^1.0.0", path = "../../protocols/v2/subprotocols/mining" } bitcoin = { version= "0.32.2" } -cdk = { git = "https://github.com/vnprc/cdk", rev = "773af52b" } +cdk = { git = "https://github.com/vnprc/cdk", rev = "64ec7f6f" } bitcoin_hashes = { version = "0.16", features = ["serde"] } redis = { version = "0.25", features = ["tokio-comp"] } shared_config = { path = "../roles-utils/config" } diff --git a/roles/translator/Cargo.toml b/roles/translator/Cargo.toml index 212b18eb2..4964f60f2 100644 --- a/roles/translator/Cargo.toml +++ b/roles/translator/Cargo.toml @@ -46,7 +46,7 @@ async-compat = "0.2.1" rand = "0.8.4" bitcoin = "0.30" mining_sv2 = { version = "^1.0.0", path = "../../protocols/v2/subprotocols/mining" } -cdk = { git = "https://github.com/vnprc/cdk", rev = "773af52b" } +cdk = { git = "https://github.com/vnprc/cdk", rev = "64ec7f6f" } uuid = { version = "1", features = ["v4"] } ureq = { version = "2", features = ["tls"] } # TODO delete after implementing the cdk HTTP API to retrieve quote id from header hash diff --git a/roles/translator/src/lib/mod.rs b/roles/translator/src/lib/mod.rs index 2dc66ba19..e7578e377 100644 --- a/roles/translator/src/lib/mod.rs +++ b/roles/translator/src/lib/mod.rs @@ -1,7 +1,9 @@ use async_channel::{bounded, unbounded}; -use cdk::wallet::{Wallet, MintQuote}; +use cdk::wallet::{client::MintConnector, MintQuote, Wallet}; use cdk::cdk_database::WalletMemoryDatabase; use cdk::nuts::CurrencyUnit; +use cdk::{HttpClient, mint_url::MintUrl}; + use futures::FutureExt; use rand::Rng; pub use roles_logic_sv2::utils::Mutex; @@ -10,6 +12,7 @@ use std::{ net::{IpAddr, SocketAddr}, str::FromStr, sync::Arc, + collections::HashMap, }; use tokio::{ @@ -43,6 +46,7 @@ pub struct TranslatorSv2 { config: ProxyConfig, reconnect_wait_time: u64, wallet: Arc, + mint_client: HttpClient, } fn create_wallet(mint_url: String) -> Arc { @@ -72,14 +76,16 @@ fn extract_mint_url(config: &ProxyConfig) -> String { impl TranslatorSv2 { pub fn new(config: ProxyConfig) -> Self { - let mint_url = extract_mint_url(&config); - let mut rng = rand::thread_rng(); + let mint_url = extract_mint_url(&config); let wait_time = rng.gen_range(0..=3000); + let mint_client = HttpClient::new(MintUrl::from_str(&mint_url).unwrap()); + Self { config, reconnect_wait_time: wait_time, wallet: create_wallet(mint_url), + mint_client: mint_client, } } @@ -326,6 +332,8 @@ impl TranslatorSv2 { fn spawn_proof_sweeper(&self) { let wallet = self.wallet.clone(); + let mint_client = self.mint_client.clone(); + let redis_url = match self.redis_url() { Some(url) => url.to_string(), None => { @@ -335,7 +343,6 @@ impl TranslatorSv2 { }; task::spawn_blocking(move || { - let mut conn = match Self::connect_to_redis(&redis_url) { Some(c) => c, None => return, @@ -353,9 +360,7 @@ impl TranslatorSv2 { } }; - for quote in "es { - Self::process_quote(&wallet, &mut conn, &rt, quote); - } + Self::process_quotes_batch(&wallet, &mut conn, &rt, "es, &mint_client); thread::sleep(Duration::from_secs(60)); } @@ -376,32 +381,44 @@ impl TranslatorSv2 { } } - fn lookup_uuid(conn: &mut Connection, redis_key: &str) -> Option { - loop { - match conn.get(redis_key) { - Ok(val) => break Some(val), - Err(e) if e.kind() == redis::ErrorKind::TypeError => break None, - Err(e) => { - tracing::warn!("Retrying Redis lookup for key {}: {}", redis_key, e); - thread::sleep(Duration::from_secs(1)); - } + fn lookup_uuids_batch(rt: &Handle, mint_client: &HttpClient, share_hashes: &[String]) -> std::collections::HashMap { + if share_hashes.is_empty() { + return HashMap::new(); + } + + let quotes_shares_future = mint_client.get_quotes_shares(share_hashes.to_vec()); + + match rt.block_on(quotes_shares_future) { + Ok(response) => { + response.quote_ids.iter().map(|(id, uuid)| (id.clone(), uuid.clone())).collect::>() + }, + Err(e) => { + tracing::error!("Failed to lookup batch UUIDs from mint: {}", e); + HashMap::new() } } } - fn process_quote(wallet: &Arc, conn: &mut Connection, rt: &Handle, quote: &MintQuote) { - let redis_key = format!("mint:quotes:hash:{}", quote.id); - let Some(uuid) = Self::lookup_uuid(conn, &redis_key) else { + fn process_quotes_batch(wallet: &Arc, conn: &mut Connection, rt: &Handle, quotes: &[MintQuote], mint_client: &HttpClient) { + if quotes.is_empty() { return; - }; + } - // TODO get latest keyset - match rt.block_on(wallet.get_mining_share_proofs(&uuid, "e.id)) { - Ok(_proofs) => { - Self::log_success_and_cleanup(wallet, conn, rt, quote, &redis_key); - } - Err(e) => { - tracing::info!("Failed to mint ehash tokens for share {} error: {}", quote.id, e); + let quote_ids: Vec = quotes.iter().map(|q| q.id.clone()).collect(); + let uuid_mapping = Self::lookup_uuids_batch(rt, mint_client, "e_ids); + + for quote in quotes { + if let Some(uuid) = uuid_mapping.get("e.id) { + // TODO get latest keyset + match rt.block_on(wallet.get_mining_share_proofs(uuid, "e.id)) { + Ok(_proofs) => { + let redis_key = format!("mint:quotes:hash:{}", quote.id); + Self::log_success_and_cleanup(wallet, conn, rt, quote, &redis_key); + } + Err(e) => { + tracing::error!("Failed to mint ehash tokens for share {} error: {}", quote.id, e); + } + } } } }