From 20054e4be7db8b92bafe32bc0c31ee5b386fd67b Mon Sep 17 00:00:00 2001 From: Revertron Date: Mon, 11 Jul 2022 14:44:24 +0200 Subject: [PATCH] Optimized p2p communication. Disabled connections from v0.6.*. Updated dependencies. --- Cargo.lock | 10 +++++----- Cargo.toml | 6 +++--- src/p2p/network.rs | 9 ++++++++- src/p2p/peer.rs | 14 ++++++++++++++ src/p2p/peers.rs | 7 ++++--- 5 files changed, 34 insertions(+), 12 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 0df289a..9a5106b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -84,7 +84,7 @@ dependencies = [ [[package]] name = "alfis" -version = "0.7.5" +version = "0.7.6" dependencies = [ "base64", "bincode", @@ -260,9 +260,9 @@ dependencies = [ [[package]] name = "chacha20poly1305" -version = "0.9.0" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b84ed6d1d5f7aa9bdde921a5090e0ca4d934d250ea3b402a5fab3a994e28a2a" +checksum = "a18446b09be63d457bbec447509e85f662f32952b035ce892290396bc0b0cff5" dependencies = [ "aead 0.4.3", "chacha20", @@ -1411,9 +1411,9 @@ checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" [[package]] name = "ureq" -version = "2.4.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9399fa2f927a3d327187cbd201480cee55bee6ac5d3c77dd27f0c6814cff16d5" +checksum = "b97acb4c28a254fd7a4aeec976c46a7fa404eac4d7c134b30c75144846d7cb8f" dependencies = [ "base64", "chunked_transfer", diff --git a/Cargo.toml b/Cargo.toml index 748ed79..0fade0f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "alfis" -version = "0.7.5" +version = "0.7.6" authors = ["Revertron "] edition = "2021" build = "build.rs" @@ -20,7 +20,7 @@ sha2 = "0.10.2" ed25519-dalek = "1.0" x25519-dalek = "1.2" ecies-ed25519 = "0.5" -chacha20poly1305 = "0.9" +chacha20poly1305 = "0.9.1" signature = "1.5" blakeout = "0.3.0" num_cpus = "1.13.1" @@ -39,7 +39,7 @@ rand-old = { package = "rand", version = "0.7.0" } # For ed25519-dalek sqlite = "0.26.0" uuid = { version = "1.1.2", features = ["serde", "v4"] } mio = { version = "0.8.4", features = ["os-poll", "net"] } -ureq = { version = "2.4", optional = true } +ureq = { version = "2.5", optional = true } lru = "0.7.7" derive_more = "0.99.17" lazy_static = "1.4.0" diff --git a/src/p2p/network.rs b/src/p2p/network.rs index 63655f8..2b85713 100644 --- a/src/p2p/network.rs +++ b/src/p2p/network.rs @@ -459,6 +459,9 @@ impl Network { let my_id = self.peers.get_my_id().to_owned(); let answer = match message { Message::Hand { app_version, origin, version, public, rand_id } => { + if app_version.starts_with("0.6") { + return State::Banned; + } if self.peers.is_our_own_connect(&rand_id) { warn!("Detected loop connect"); State::SendLoop @@ -490,6 +493,9 @@ impl Network { if self.peers.is_tween_connect(&rand_id) { return State::Twin; } + if app_version.starts_with("0.6") { + return State::Banned; + } let nodes = self.peers.get_peers_active_count(); let peer = self.peers.get_mut_peer(token).unwrap(); // TODO check rand_id whether we have this peers connection already @@ -610,6 +616,7 @@ impl Network { let peers_count = self.peers.get_peers_active_count(); let peer = self.peers.get_mut_peer(token).unwrap(); peer.set_received_block(block.index); + trace!("New block from {}", &peer.get_addr()); let mut context = self.context.lock().unwrap(); let max_height = context.chain.get_max_height(); @@ -654,8 +661,8 @@ impl Network { if height + 1 == block.index { context.chain.update_max_height(height); post(crate::event::Event::SyncFinished); - return State::Banned; } + return State::Banned; } BlockQuality::Rewind => { debug!("Got some orphan block, requesting its parent"); diff --git a/src/p2p/peer.rs b/src/p2p/peer.rs index 5b016e1..862af8e 100644 --- a/src/p2p/peer.rs +++ b/src/p2p/peer.rs @@ -19,6 +19,7 @@ pub struct Peer { active: bool, reconnects: u32, received_block: u64, + sent_height: u64, cipher: Option, fork: HashMap } @@ -36,6 +37,7 @@ impl Peer { active: false, reconnects: 0, received_block: 0, + sent_height: 0, cipher: None, fork: HashMap::new() } @@ -84,6 +86,18 @@ impl Peer { self.height = height; } + pub fn get_height(&self) -> u64 { + self.height + } + + pub fn set_sent_height(&mut self, height: u64) { + self.sent_height = height; + } + + pub fn get_sent_height(&self) -> u64 { + self.sent_height + } + pub fn is_higher(&self, height: u64) -> bool { self.height > height } diff --git a/src/p2p/peers.rs b/src/p2p/peers.rs index a949417..df6129b 100644 --- a/src/p2p/peers.rs +++ b/src/p2p/peers.rs @@ -284,13 +284,14 @@ impl Peers { let mut rng = rand::thread_rng(); match self.peers .iter_mut() - .filter_map(|(token, peer)| if peer.is_lower(height) && peer.get_state().is_idle() { Some((token, peer)) } else { None }) + .filter_map(|(token, peer)| if peer.is_lower(height) && peer.get_state().is_idle() && peer.get_sent_height() < height { Some((token, peer)) } else { None }) .choose(&mut rng) { None => {} Some((token, peer)) => { - debug!("Peer {} is behind, sending ping", &peer.get_addr().ip()); + debug!("Peer {} is behind ({}), sending ping", &peer.get_addr().ip(), peer.get_height()); registry.reregister(peer.get_stream(), *token, Interest::WRITABLE).unwrap(); peer.set_state(State::message(Message::Ping { height, hash })); + peer.set_sent_height(height); self.update_behind_ping_time(); } } @@ -368,7 +369,7 @@ impl Peers { if self.new_peers.is_empty() { return; } - self.new_peers.dedup(); + self.new_peers.sort().dedup(); let addr = self.new_peers.remove(0); match self.connect_peer(&addr, registry, unique_token, yggdrasil_only) { Ok(_) => {}