diff --git a/config/src/comments.rs b/config/src/comments.rs index 6622b5f91..7eaad916c 100644 --- a/config/src/comments.rs +++ b/config/src/comments.rs @@ -230,6 +230,10 @@ fn comments() -> HashMap { # 15 = Bit flags for FULL_NODE #This structure needs to be changed internally, to make it more configurable + +# A prefered dandelion_peer, mainly used for testing dandelion +# dandelion_peer = \"10.0.0.1:13144\" + " .to_string(), ); diff --git a/p2p/src/peers.rs b/p2p/src/peers.rs index 96402ac29..8e0817d40 100644 --- a/p2p/src/peers.rs +++ b/p2p/src/peers.rs @@ -83,24 +83,38 @@ impl Peers { // Update the dandelion relay pub fn update_dandelion_relay(&self) { let peers = self.outgoing_connected_peers(); - - match thread_rng().choose(&peers) { - Some(peer) => { - // Clear the map and add new relay - let dandelion_relay = &self.dandelion_relay; - dandelion_relay.write().clear(); - dandelion_relay - .write() - .insert(Utc::now().timestamp(), peer.clone()); - debug!( - "Successfully updated Dandelion relay to: {}", - peer.info.addr - ); + match &self.config.dandelion_peer { + Some(ip) => { + for peer in &peers { + if peer.info.addr == *ip { + debug!("Found predefined dandelion peer, setting as relay"); + self.set_dandelion_relay(peer); + return; + } + } + debug!("Could not find predefined dandelion peer among connected peers, choosing random") } + None => {} + } + match thread_rng().choose(&peers) { + Some(peer) => self.set_dandelion_relay(peer), None => debug!("Could not update dandelion relay"), }; } + fn set_dandelion_relay(&self, peer: &Arc) { + // Clear the map and add new relay + let dandelion_relay = &self.dandelion_relay; + dandelion_relay.write().clear(); + dandelion_relay + .write() + .insert(Utc::now().timestamp(), peer.clone()); + debug!( + "Successfully updated Dandelion relay to: {}", + peer.info.addr + ); + } + // Get the dandelion relay pub fn get_dandelion_relay(&self) -> HashMap> { self.dandelion_relay.read().clone() diff --git a/p2p/src/types.rs b/p2p/src/types.rs index c9cbc2690..98c146789 100644 --- a/p2p/src/types.rs +++ b/p2p/src/types.rs @@ -124,6 +124,8 @@ pub struct P2PConfig { pub peer_max_count: Option, pub peer_min_preferred_count: Option, + + pub dandelion_peer: Option, } /// Default address for peer-to-peer connections. @@ -142,6 +144,7 @@ impl Default for P2PConfig { ban_window: None, peer_max_count: None, peer_min_preferred_count: None, + dandelion_peer: None } } }