diff --git a/config/src/comments.rs b/config/src/comments.rs index 490ff2e2..f67871ae 100644 --- a/config/src/comments.rs +++ b/config/src/comments.rs @@ -277,6 +277,11 @@ seeds = [\"95.217.197.180:3517\",\"5.161.127.56:3414\",\"5.75.242.4:3414\",\"5.7 # A preferred dandelion_peer, mainly used for testing dandelion # dandelion_peer = \"10.0.0.1:13144\" + +# minimum version for other peers that can connect +peer_min_major = 3 +peer_min_minor = 4 + " .to_string(), ); diff --git a/edna.toml b/edna.toml index f4d992b9..1fa195bf 100644 --- a/edna.toml +++ b/edna.toml @@ -109,6 +109,9 @@ seeding_type = "DNSSeed" # A preferred dandelion_peer, mainly used for testing dandelion # dandelion_peer = "10.0.0.1:13144" +peer_min_major = 3 +peer_min_minor = 4 + [server.p2p_config.capabilities] bits = 31 @@ -213,4 +216,3 @@ log_max_size = 16777216 #maximum count of the log files to rotate over log_max_files = 32 - diff --git a/p2p/src/peers.rs b/p2p/src/peers.rs index be9a6856..ee50b23f 100644 --- a/p2p/src/peers.rs +++ b/p2p/src/peers.rs @@ -72,9 +72,30 @@ impl Peers { last_connected: Utc::now().timestamp(), local_timestamp: Utc::now().timestamp(), }; - debug!("Saving newly connected peer {}.", peer_data.addr); - self.save_peer(&peer_data)?; - peers.insert(peer_data.addr, peer.clone()); + + let version_agent: String = peer_data.user_agent.chars().skip(8).collect(); + let version_numbers: Vec<&str> = version_agent.split(".").collect(); + let agent_major_version: u32 = version_numbers[0].parse().unwrap(); + let agent_minor_version: u32 = version_numbers[1].parse().unwrap(); + + if agent_major_version >= self.config.peer_min_major() + && agent_minor_version >= self.config.peer_min_minor() + { + debug!( + "Saving newly connected peer {} - {}.", + peer_data.addr, peer_data.user_agent + ); + self.save_peer(&peer_data)?; + peers.insert(peer_data.addr, peer.clone()); + } else { + debug!( + "Peer version to old {:?} - {:?}. Require min version {}.{}", + peer_data.addr, + peer.info.user_agent, + self.config.peer_min_major(), + self.config.peer_min_minor() + ); + }; Ok(()) } diff --git a/p2p/src/types.rs b/p2p/src/types.rs index f5b4d49f..ff91df3a 100644 --- a/p2p/src/types.rs +++ b/p2p/src/types.rs @@ -60,6 +60,12 @@ const PEER_MIN_PREFERRED_OUTBOUND_COUNT: u32 = 8; /// than allowed by PEER_MAX_INBOUND_COUNT to encourage network bootstrapping. const PEER_LISTENER_BUFFER_COUNT: u32 = 8; +/// The minimum Major version a peer must have +pub const PEER_MIN_MAJOR: u32 = 3; + +/// The minimum Minor version a peer must have +pub const PEER_MIN_MINOR: u32 = 4; + #[derive(Debug)] pub enum Error { Serialization(ser::Error), @@ -241,6 +247,10 @@ pub struct P2PConfig { pub peer_listener_buffer_count: Option, pub dandelion_peer: Option, + + pub peer_min_major: Option, + + pub peer_min_minor: Option, } /// Default address for peer-to-peer connections. @@ -262,6 +272,8 @@ impl Default for P2PConfig { peer_min_preferred_outbound_count: None, peer_listener_buffer_count: None, dandelion_peer: None, + peer_min_major: None, + peer_min_minor: None, } } } @@ -308,6 +320,22 @@ impl P2PConfig { None => PEER_LISTENER_BUFFER_COUNT, } } + + /// return peer min major version + pub fn peer_min_major(&self) -> u32 { + match self.peer_min_major { + Some(n) => std::cmp::max(PEER_MIN_MAJOR, n), + None => PEER_MIN_MAJOR, + } + } + + /// return peer min minor version + pub fn peer_min_minor(&self) -> u32 { + match self.peer_min_minor { + Some(n) => std::cmp::max(PEER_MIN_MINOR, n), + None => PEER_MIN_MINOR, + } + } } /// Type of seeding the server will use to find other peers on the network.