Skip to content

Commit f6c8e06

Browse files
committed
fix: make use of stored peers
We currently only use the stored peers for the initial connection attempts. This PR: - Loads the stored peers into the `AddrV2Handler`. - Drops the initial connection attempts in `PeerNetworkManager.start` to let the maintenance loop handle it.
1 parent 7539c5f commit f6c8e06

File tree

3 files changed

+38
-18
lines changed

3 files changed

+38
-18
lines changed

dash-spv/src/network/manager.rs

Lines changed: 19 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ use crate::network::{
2626
};
2727
use crate::storage::{PeerStorage, PersistentPeerStorage, PersistentStorage};
2828
use async_trait::async_trait;
29+
use dashcore::network::address::AddrV2Message;
2930
use dashcore::network::constants::ServiceFlags;
3031
use dashcore::network::message::NetworkMessage;
3132
use dashcore::network::message_headers2::CompressionState;
@@ -152,7 +153,11 @@ impl PeerNetworkManager {
152153
pub async fn start(&self) -> Result<(), Error> {
153154
log::info!("Starting peer network manager for {:?}", self.network);
154155

155-
let mut peer_addresses = self.initial_peers.clone();
156+
let mut peer_addresses: Vec<AddrV2Message> = self
157+
.initial_peers
158+
.iter()
159+
.map(|addr| AddrV2Message::new(*addr, ServiceFlags::NETWORK))
160+
.collect();
156161

157162
if self.exclusive_mode {
158163
log::info!(
@@ -161,7 +166,10 @@ impl PeerNetworkManager {
161166
);
162167
} else {
163168
// Load saved peers from disk
164-
let saved_peers = self.peer_store.load_peers().await.unwrap_or_default();
169+
let saved_peers = self.peer_store.load_peers().await.unwrap_or_else(|e| {
170+
tracing::warn!("Failed to load peers: {}", e);
171+
Vec::new()
172+
});
165173
peer_addresses.extend(saved_peers);
166174

167175
// If we still have no peers, immediately discover via DNS
@@ -171,10 +179,16 @@ impl PeerNetworkManager {
171179
self.network
172180
);
173181
let dns_peers = self.discovery.discover_peers(self.network).await;
174-
peer_addresses.extend(dns_peers.iter().take(TARGET_PEERS));
182+
let dns_peers_found = dns_peers.len();
183+
peer_addresses.extend(
184+
dns_peers
185+
.into_iter()
186+
.take(TARGET_PEERS)
187+
.map(|addr| AddrV2Message::new(addr, ServiceFlags::NETWORK)),
188+
);
175189
log::info!(
176190
"DNS discovery found {} peers, using {} for startup",
177-
dns_peers.len(),
191+
dns_peers_found,
178192
peer_addresses.len()
179193
);
180194
} else {
@@ -185,15 +199,7 @@ impl PeerNetworkManager {
185199
}
186200
}
187201

188-
// Connect to peers (all in exclusive mode, or up to TARGET_PEERS in normal mode)
189-
let max_connections = if self.exclusive_mode {
190-
peer_addresses.len()
191-
} else {
192-
TARGET_PEERS
193-
};
194-
for addr in peer_addresses.iter().take(max_connections) {
195-
self.connect_to_peer(*addr).await;
196-
}
202+
self.addrv2_handler.handle_addrv2(peer_addresses.clone()).await;
197203

198204
// Start maintenance loop
199205
self.start_maintenance_loop().await;

dash-spv/src/storage/peers.rs

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ pub trait PeerStorage {
2222
peers: &[dashcore::network::address::AddrV2Message],
2323
) -> StorageResult<()>;
2424

25-
async fn load_peers(&self) -> StorageResult<Vec<SocketAddr>>;
25+
async fn load_peers(&self) -> StorageResult<Vec<AddrV2Message>>;
2626

2727
async fn save_peers_reputation(
2828
&self,
@@ -90,7 +90,7 @@ impl PeerStorage for PersistentPeerStorage {
9090
Ok(())
9191
}
9292

93-
async fn load_peers(&self) -> StorageResult<Vec<SocketAddr>> {
93+
async fn load_peers(&self) -> StorageResult<Vec<AddrV2Message>> {
9494
let peers_file = self.peers_data_file();
9595

9696
if !fs::try_exists(&peers_file).await? {
@@ -122,8 +122,6 @@ impl PeerStorage for PersistentPeerStorage {
122122
.await
123123
.map_err(|e| StorageError::ReadFailed(format!("Failed to load peers: {e}")))??;
124124

125-
let peers = peers.into_iter().filter_map(|p| p.socket_addr().ok()).collect();
126-
127125
Ok(peers)
128126
}
129127

@@ -190,7 +188,7 @@ mod tests {
190188

191189
let loaded = store.load_peers().await.expect("Failed to load peers in test");
192190
assert_eq!(loaded.len(), 1);
193-
assert_eq!(loaded[0], addr);
191+
assert_eq!(loaded[0].socket_addr().unwrap(), addr);
194192
}
195193

196194
#[tokio::test]

dash/src/network/address.rs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -276,6 +276,22 @@ pub struct AddrV2Message {
276276
}
277277

278278
impl AddrV2Message {
279+
pub fn new(socket_addr: SocketAddr, flags: ServiceFlags) -> Self {
280+
let time = std::time::SystemTime::now()
281+
.duration_since(std::time::UNIX_EPOCH)
282+
.unwrap_or_default()
283+
.as_secs() as u32;
284+
let addr_v2 = match socket_addr.ip() {
285+
std::net::IpAddr::V4(v4) => AddrV2::Ipv4(v4),
286+
std::net::IpAddr::V6(v6) => AddrV2::Ipv6(v6),
287+
};
288+
Self {
289+
time,
290+
services: flags,
291+
addr: addr_v2,
292+
port: socket_addr.port(),
293+
}
294+
}
279295
/// Extract socket address from an [AddrV2Message] message.
280296
/// This will return [io::Error] [io::ErrorKind::AddrNotAvailable]
281297
/// if the address type can't be converted into a [SocketAddr].

0 commit comments

Comments
 (0)