Skip to content

Commit ae708c7

Browse files
feat(network): Add support for Headers2 in peer selection logic
This commit enhances the PeerNetworkManager to include support for the Headers2 protocol. It introduces logic to prefer peers that advertise Headers2 support when selecting a sync peer. The changes ensure that the current sync peer is updated accordingly, improving compatibility and efficiency in header synchronization. - Added logic to check for Headers2 support in peer selection. - Updated existing sync peer selection to prioritize peers with Headers2 capabilities. - Ensured proper logging when a new sync peer is selected for Headers2. This update aligns with ongoing efforts to improve protocol compatibility and performance in the network manager.
1 parent fd42619 commit ae708c7

File tree

1 file changed

+33
-0
lines changed

1 file changed

+33
-0
lines changed

dash-spv/src/network/manager.rs

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -780,6 +780,7 @@ impl PeerNetworkManager {
780780
// For filter-related messages, we need a peer that supports compact filters
781781
let requires_compact_filters =
782782
matches!(&message, NetworkMessage::GetCFHeaders(_) | NetworkMessage::GetCFilters(_));
783+
let requires_headers2 = matches!(&message, NetworkMessage::GetHeaders2(_));
783784

784785
let selected_peer = if requires_compact_filters {
785786
// Find a peer that supports compact filters
@@ -807,6 +808,37 @@ impl PeerNetworkManager {
807808
));
808809
}
809810
}
811+
} else if requires_headers2 {
812+
// Prefer a peer that advertises headers2 support
813+
let mut current_sync_peer = self.current_sync_peer.lock().await;
814+
let mut selected: Option<SocketAddr> = None;
815+
816+
if let Some(current_addr) = *current_sync_peer {
817+
if let Some((_, peer)) = peers.iter().find(|(addr, _)| *addr == current_addr) {
818+
let peer_guard = peer.read().await;
819+
if peer_guard.peer_info().supports_headers2() {
820+
selected = Some(current_addr);
821+
}
822+
}
823+
}
824+
825+
if selected.is_none() {
826+
for (addr, peer) in &peers {
827+
let peer_guard = peer.read().await;
828+
if peer_guard.peer_info().supports_headers2() {
829+
selected = Some(*addr);
830+
break;
831+
}
832+
}
833+
}
834+
835+
let chosen = selected.unwrap_or(peers[0].0);
836+
if Some(chosen) != *current_sync_peer {
837+
log::info!("Sync peer selected for Headers2: {}", chosen);
838+
*current_sync_peer = Some(chosen);
839+
}
840+
drop(current_sync_peer);
841+
chosen
810842
} else {
811843
// For non-filter messages, use the sticky sync peer
812844
let mut current_sync_peer = self.current_sync_peer.lock().await;
@@ -1061,6 +1093,7 @@ impl NetworkManager for PeerNetworkManager {
10611093
// For sync messages that require consistent responses, send to only one peer
10621094
match &message {
10631095
NetworkMessage::GetHeaders(_)
1096+
| NetworkMessage::GetHeaders2(_)
10641097
| NetworkMessage::GetCFHeaders(_)
10651098
| NetworkMessage::GetCFilters(_)
10661099
| NetworkMessage::GetData(_)

0 commit comments

Comments
 (0)