From 14f56723f22ee3f6b60d3e770f799c377c23f3a9 Mon Sep 17 00:00:00 2001 From: xdustinface Date: Thu, 29 Jan 2026 02:31:35 +0100 Subject: [PATCH] refactor: move `get_peer_best_height` into `PeerPool` --- dash-spv/src/client/sync_coordinator.rs | 18 ++------ dash-spv/src/network/manager.rs | 42 ++----------------- dash-spv/src/network/mod.rs | 3 +- dash-spv/src/network/peer.rs | 4 ++ dash-spv/src/network/pool.rs | 56 +++++++++++++++++++++++-- dash-spv/src/test_utils/network.rs | 7 +++- 6 files changed, 70 insertions(+), 60 deletions(-) diff --git a/dash-spv/src/client/sync_coordinator.rs b/dash-spv/src/client/sync_coordinator.rs index 9b60dfa1e..34229a5bf 100644 --- a/dash-spv/src/client/sync_coordinator.rs +++ b/dash-spv/src/client/sync_coordinator.rs @@ -219,13 +219,8 @@ impl DashSpvClient last_height { @@ -298,13 +293,8 @@ impl DashSpvClient NetworkResult> { - let peers = self.pool.get_all_peers().await; - - if peers.is_empty() { - log::debug!("get_peer_best_height: No peers available"); - return Ok(None); - } - - let mut best_height = 0u32; - let mut peer_count = 0; - - for (addr, peer) in peers.iter() { - let peer_guard = peer.read().await; - - peer_count += 1; - - if let Some(peer_height) = peer_guard.best_height() { - if peer_height > 0 { - best_height = best_height.max(peer_height); - log::debug!( - "get_peer_best_height: Updated best_height to {} from peer {}", - best_height, - addr - ); - } - } - } - - log::debug!( - "get_peer_best_height: Checked {} peers, best_height: {}", - peer_count, - best_height - ); - - if best_height > 0 { - Ok(Some(best_height)) - } else { - Ok(None) - } + async fn get_peer_best_height(&self) -> Option { + self.pool.get_best_height().await } async fn has_peer_with_service(&self, service_flags: ServiceFlags) -> bool { diff --git a/dash-spv/src/network/mod.rs b/dash-spv/src/network/mod.rs index 6746a165b..dbcea98b8 100644 --- a/dash-spv/src/network/mod.rs +++ b/dash-spv/src/network/mod.rs @@ -17,6 +17,7 @@ mod tests; use crate::error::NetworkResult; use async_trait::async_trait; use dashcore::network::message::NetworkMessage; +use dashcore::prelude::CoreBlockHeight; use dashcore::BlockHash; pub use handshake::{HandshakeManager, HandshakeState}; pub use manager::PeerNetworkManager; @@ -51,7 +52,7 @@ pub trait NetworkManager: Send + Sync + 'static { fn peer_count(&self) -> usize; /// Get the best block height reported by connected peers. - async fn get_peer_best_height(&self) -> NetworkResult>; + async fn get_peer_best_height(&self) -> Option; /// Check if any connected peer supports a specific service. async fn has_peer_with_service( diff --git a/dash-spv/src/network/peer.rs b/dash-spv/src/network/peer.rs index 5247ff738..f12db9456 100644 --- a/dash-spv/src/network/peer.rs +++ b/dash-spv/src/network/peer.rs @@ -125,6 +125,10 @@ impl Peer { }) } + pub fn version(&self) -> Option { + self.version + } + pub fn best_height(&self) -> Option { self.best_height } diff --git a/dash-spv/src/network/pool.rs b/dash-spv/src/network/pool.rs index b66777859..db690a3a2 100644 --- a/dash-spv/src/network/pool.rs +++ b/dash-spv/src/network/pool.rs @@ -1,14 +1,14 @@ //! Peer pool for managing multiple peer connections +use crate::error::{NetworkError, SpvError as Error}; +use crate::network::constants::{MAX_PEERS, MIN_PEERS}; +use crate::network::peer::Peer; +use dashcore::prelude::CoreBlockHeight; use std::collections::{HashMap, HashSet}; use std::net::SocketAddr; use std::sync::Arc; use tokio::sync::RwLock; -use crate::error::{NetworkError, SpvError as Error}; -use crate::network::constants::{MAX_PEERS, MIN_PEERS}; -use crate::network::peer::Peer; - /// Pool for managing multiple peer instances pub struct PeerPool { /// Active peers mapped by address @@ -100,6 +100,54 @@ impl PeerPool { self.peers.read().await.keys().copied().collect() } + pub async fn get_best_height(&self) -> Option { + let peers = self.get_all_peers().await; + + if peers.is_empty() { + log::debug!("get_peer_best_height: No peers available"); + return None; + } + + let mut best_height = 0u32; + let mut peer_count = 0; + + for (addr, peer) in peers.iter() { + let peer_guard = peer.read().await; + peer_count += 1; + + log::debug!( + "get_peer_best_height: Peer {} - best_height: {:?}, version: {:?}, connected: {}", + addr, + peer_guard.best_height(), + peer_guard.version(), + peer_guard.is_connected(), + ); + + if let Some(peer_height) = peer_guard.best_height() { + if peer_height > 0 { + best_height = best_height.max(peer_height); + log::debug!( + "get_peer_best_height: Updated best_height to {} from peer {}", + best_height, + addr + ); + } + } + } + + log::debug!( + "get_peer_best_height: Checked {} peers, best_height: {}", + peer_count, + best_height + ); + + if best_height > 0 { + Some(best_height) + } else { + None + } + } + /// Check if we need more peers pub async fn needs_more_peers(&self) -> bool { self.peer_count().await < MIN_PEERS diff --git a/dash-spv/src/test_utils/network.rs b/dash-spv/src/test_utils/network.rs index fd39c9651..b237baab1 100644 --- a/dash-spv/src/test_utils/network.rs +++ b/dash-spv/src/test_utils/network.rs @@ -1,6 +1,7 @@ use crate::error::{NetworkError, NetworkResult}; use crate::network::{Message, MessageDispatcher, MessageType, NetworkManager}; use async_trait::async_trait; +use dashcore::prelude::CoreBlockHeight; use dashcore::{ block::Header as BlockHeader, network::constants::ServiceFlags, network::message::NetworkMessage, network::message_blockdata::GetHeadersMessage, BlockHash, @@ -19,6 +20,7 @@ pub struct MockNetworkManager { connected: bool, connected_peer: SocketAddr, headers_chain: Vec, + peer_best_height: Option, message_dispatcher: MessageDispatcher, sent_messages: Vec, } @@ -30,6 +32,7 @@ impl MockNetworkManager { connected: true, connected_peer: SocketAddr::new(std::net::Ipv4Addr::LOCALHOST.into(), 9999), headers_chain: Vec::new(), + peer_best_height: None, message_dispatcher: MessageDispatcher::default(), sent_messages: Vec::new(), } @@ -152,8 +155,8 @@ impl NetworkManager for MockNetworkManager { } } - async fn get_peer_best_height(&self) -> NetworkResult> { - Ok(Some(self.headers_chain.len() as u32)) + async fn get_peer_best_height(&self) -> Option { + self.peer_best_height } async fn has_peer_with_service(&self, _service_flags: ServiceFlags) -> bool {