From 520f485899124de1d9599a94055c1455d812bf47 Mon Sep 17 00:00:00 2001 From: Revertron Date: Fri, 23 Apr 2021 13:20:26 +0200 Subject: [PATCH] Optimized p2p connections. Added a limit for 10 active connections to save bandwidth and CPU. --- Cargo.toml | 2 +- src/commons/constants.rs | 7 +++++++ src/event.rs | 2 +- src/miner.rs | 6 +++--- src/p2p/network.rs | 20 ++++++++------------ src/p2p/peers.rs | 7 ++++--- src/web_ui.rs | 4 ++-- 7 files changed, 26 insertions(+), 22 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 6f2f452..2579a42 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "alfis" -version = "0.4.24" +version = "0.4.25" authors = ["Revertron "] edition = "2018" build = "build.rs" diff --git a/src/commons/constants.rs b/src/commons/constants.rs index cc3e61a..4e03a59 100644 --- a/src/commons/constants.rs +++ b/src/commons/constants.rs @@ -1,3 +1,5 @@ +use std::time::Duration; + pub const DB_VERSION: u32 = 0; pub const CHAIN_VERSION: u32 = 0; @@ -38,3 +40,8 @@ pub const ALFIS_DEBUG: &str = "ALFIS_DEBUG"; pub const LISTEN_PORT: u16 = 4244; pub const UI_REFRESH_DELAY_MS: u128 = 250; pub const LOG_REFRESH_DELAY_SEC: u64 = 60; + +pub const POLL_TIMEOUT: Option = Some(Duration::from_millis(250)); +pub const MAX_PACKET_SIZE: usize = 1 * 1024 * 1024; // 1 Mb +pub const MAX_READ_BLOCK_TIME: u128 = 500; +pub const MAX_NODES: usize = 10; diff --git a/src/event.rs b/src/event.rs index f37869b..fd0327c 100644 --- a/src/event.rs +++ b/src/event.rs @@ -2,7 +2,7 @@ pub enum Event { MinerStarted, MinerStopped { success: bool, full: bool }, - MinerStats { thread: usize, speed: u64, max_diff: u32, aim_diff: u32 }, + MinerStats { thread: usize, speed: u64, max_diff: u32, target_diff: u32 }, KeyGeneratorStarted, KeyGeneratorStopped, KeyCreated { path: String, public: String, hash: String }, diff --git a/src/miner.rs b/src/miner.rs index b057d06..f3945c4 100644 --- a/src/miner.rs +++ b/src/miner.rs @@ -224,7 +224,7 @@ impl Miner { } fn find_hash(context: Arc>, mut block: Block, running: Arc, thread: usize) -> Option { - let difficulty = block.difficulty; + let target_diff = block.difficulty; let full = block.transaction.is_some(); let mut digest = Blakeout::new(); let mut max_diff = 0; @@ -261,7 +261,7 @@ fn find_hash(context: Arc>, mut block: Block, running: Arc= difficulty { + if diff >= target_diff { block.hash = Bytes::from_bytes(digest.result()); return Some(block); } @@ -276,7 +276,7 @@ fn find_hash(context: Arc>, mut block: Block, running: Arc = Some(Duration::from_millis(250)); -const MAX_PACKET_SIZE: usize = 1 * 1024 * 1024; // 1 Mb -const MAX_READ_BLOCK_TIME: u128 = 500; pub struct Network { context: Arc> @@ -147,7 +144,6 @@ impl Network { if !events.is_empty() { last_events_time = Instant::now(); } - events.clear(); if ui_timer.elapsed().as_millis() > UI_REFRESH_DELAY_MS { // Send pings to idle peers @@ -167,15 +163,15 @@ impl Network { } log_timer = Instant::now(); } + if nodes < MAX_NODES && connect_timer.elapsed().as_secs() >= 10 { + peers.connect_new_peers(poll.registry(), &mut unique_token, yggdrasil_only); + connect_timer = Instant::now(); + } (height, context.chain.get_last_hash()) }; peers.update(poll.registry(), height, hash); ui_timer = Instant::now(); } - if connect_timer.elapsed().as_secs() >= 10 { - peers.connect_new_peers(poll.registry(), &mut unique_token, yggdrasil_only); - connect_timer = Instant::now(); - } } if !running.load(Ordering::SeqCst) { info!("Network loop finished"); @@ -401,7 +397,7 @@ fn handle_message(context: Arc>, message: Message, peers: &mut Pe return State::Banned; } if ok { - let active_count = peers.get_peers_active_count(); + let nodes = peers.get_peers_active_count(); let peer = peers.get_mut_peer(token).unwrap(); peer.set_height(height); peer.set_active(true); @@ -412,7 +408,7 @@ fn handle_message(context: Arc>, message: Message, peers: &mut Pe let event = crate::event::Event::Syncing { have: my_height, height: max(height, my_height) }; context.bus.post(event); } - if active_count < 5 || random::() < 10 { + if nodes < MAX_NODES && random::() { debug!("Requesting more peers from {}", peer.get_addr().ip()); State::message(Message::GetPeers) } else { @@ -453,7 +449,7 @@ fn handle_message(context: Arc>, message: Message, peers: &mut Pe info!("My hash: {:?}, their hash: {:?}", &my_hash, &hash); State::message(Message::GetBlock { index: my_height }) } else { - if active_count < 5 || random::() < 10 { + if active_count < MAX_NODES && random::() < 50 { debug!("Requesting more peers from {}", peer.get_addr().ip()); State::message(Message::GetPeers) } else { diff --git a/src/p2p/peers.rs b/src/p2p/peers.rs index 0ee11e3..8277529 100644 --- a/src/p2p/peers.rs +++ b/src/p2p/peers.rs @@ -213,14 +213,15 @@ impl Peers { } pub fn update(&mut self, registry: &Registry, height: u64, hash: Bytes) { + let nodes = self.get_peers_active_count(); + + let random_time = random::() % PING_PERIOD; for (token, peer) in self.peers.iter_mut() { match peer.get_state() { State::Idle { from } => { - let random_time = random::() % PING_PERIOD; if from.elapsed().as_secs() >= PING_PERIOD + random_time { // Sometimes we check for new peers instead of pinging - let random: u8 = random(); - let message = if random < 10 { + let message = if nodes < MAX_NODES && random::() { Message::GetPeers } else { Message::ping(height, hash.clone()) diff --git a/src/web_ui.rs b/src/web_ui.rs index 3e6f60f..973710b 100644 --- a/src/web_ui.rs +++ b/src/web_ui.rs @@ -243,13 +243,13 @@ fn action_loaded(context: &Arc>, web_view: &mut WebView<()>) { } s } - Event::MinerStats { thread, speed, max_diff, aim_diff } => { + Event::MinerStats { thread, speed, max_diff, target_diff } => { if status.max_diff < max_diff { status.max_diff = max_diff; } status.set_thread_speed(thread, speed); if thread == threads - 1 { - format!("setLeftStatusBarText('Mining speed {} H/s, max found difficulty {}/{}.'); showMiningIndicator(true, false);", status.get_speed(), status.max_diff, aim_diff) + format!("setLeftStatusBarText('Mining speed {} H/s, max found difficulty {}/{}.'); showMiningIndicator(true, false);", status.get_speed(), status.max_diff, target_diff) } else { String::new() }