diff --git a/Cargo.lock b/Cargo.lock index 6832514..cc27b6f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1883,6 +1883,12 @@ version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" +[[package]] +name = "human_format" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c3b1f728c459d27b12448862017b96ad4767b1ec2ec5e6434e99f1577f085b8" + [[package]] name = "humantime" version = "2.1.0" @@ -3789,8 +3795,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0c1318b19085f08681016926435853bbf7858f9c082d0999b80550ff5d9abe15" dependencies = [ "bytes 1.7.2", - "heck 0.4.1", - "itertools 0.10.5", + "heck 0.5.0", + "itertools 0.13.0", "log", "multimap", "once_cell", @@ -3823,7 +3829,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e9552f850d5f0964a4e4d0bf306459ac29323ddfbae05e35a7c0d35cb0803cc5" dependencies = [ "anyhow", - "itertools 0.10.5", + "itertools 0.13.0", "proc-macro2", "quote", "syn 2.0.77", @@ -4483,6 +4489,8 @@ dependencies = [ "dirs", "hex", "hickory-resolver 0.24.1", + "human_format", + "humantime", "itertools 0.13.0", "lazy_static", "libp2p", diff --git a/Cargo.toml b/Cargo.toml index ce5b5ef..8c096b5 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,14 +4,14 @@ name = "sha_p2pool" version = "0.3.4" [dependencies] -minotari_app_grpc = { git = "https://github.com/tari-project/tari.git" , rev = "2d0ccb121bb13990cac422fe72945cced06c1f74"} -minotari_node_grpc_client = { git = "https://github.com/tari-project/tari.git" , rev = "2d0ccb121bb13990cac422fe72945cced06c1f74"} -tari_common_types = { git = "https://github.com/tari-project/tari.git", rev = "2d0ccb121bb13990cac422fe72945cced06c1f74" } -tari_common = { git = "https://github.com/tari-project/tari.git", rev = "2d0ccb121bb13990cac422fe72945cced06c1f74" } -tari_core = { git = "https://github.com/tari-project/tari.git", rev = "2d0ccb121bb13990cac422fe72945cced06c1f74" } -tari_script = { git = "https://github.com/tari-project/tari.git" , rev = "2d0ccb121bb13990cac422fe72945cced06c1f74"} -tari_shutdown = { git = "https://github.com/tari-project/tari.git", rev = "2d0ccb121bb13990cac422fe72945cced06c1f74" } +minotari_app_grpc = {git = "https://github.com/tari-project/tari.git", rev = "2d0ccb121bb13990cac422fe72945cced06c1f74"} +minotari_node_grpc_client = {git = "https://github.com/tari-project/tari.git", rev = "2d0ccb121bb13990cac422fe72945cced06c1f74"} +tari_common = {git = "https://github.com/tari-project/tari.git", rev = "2d0ccb121bb13990cac422fe72945cced06c1f74"} +tari_common_types = {git = "https://github.com/tari-project/tari.git", rev = "2d0ccb121bb13990cac422fe72945cced06c1f74"} +tari_core = {git = "https://github.com/tari-project/tari.git", rev = "2d0ccb121bb13990cac422fe72945cced06c1f74"} tari_crypto = "0.21.0" +tari_script = {git = "https://github.com/tari-project/tari.git", rev = "2d0ccb121bb13990cac422fe72945cced06c1f74"} +tari_shutdown = {git = "https://github.com/tari-project/tari.git", rev = "2d0ccb121bb13990cac422fe72945cced06c1f74"} tari_utilities = {version = "0.8", features = ["borsh"]} anyhow = "1.0" @@ -24,6 +24,8 @@ digest = "0.10.7" dirs = "4.0.0" hex = "0.4.3" hickory-resolver = {version = "*", features = ["dns-over-rustls"]} +human_format = "1.1.0" +humantime = "2.1.0" itertools = "0.13.0" lazy_static = "1.5.0" libp2p = {version = "0.54.0", features = [ diff --git a/src/server/grpc/p2pool.rs b/src/server/grpc/p2pool.rs index 9fadad7..70bfd84 100644 --- a/src/server/grpc/p2pool.rs +++ b/src/server/grpc/p2pool.rs @@ -260,12 +260,17 @@ where S: ShareChain new_tip_block.fix_hash(); if let Some(miner_data) = response.miner_data.as_mut() { + let _ = self + .stats_broadcast + .send_network_difficulty(pow_algo, Difficulty::from_u64(miner_data.target_difficulty).unwrap()); // what happens p2pool difficulty > base chain diff if target_difficulty.as_u64() < miner_data.target_difficulty { miner_data.target_difficulty = target_difficulty.as_u64(); } } + let _ = self.stats_broadcast.send_target_difficulty(pow_algo, target_difficulty); + // save template let mut list_of_template_write_lock = self.list_of_templates.write().await; list_of_template_write_lock.push_back(tari_hash.clone()); diff --git a/src/server/http/stats_collector.rs b/src/server/http/stats_collector.rs index f6880da..34320cc 100644 --- a/src/server/http/stats_collector.rs +++ b/src/server/http/stats_collector.rs @@ -1,3 +1,6 @@ +use std::time::Duration; + +use human_format::Formatter; use log::{error, info}; use tari_core::proof_of_work::{Difficulty, PowAlgorithm}; use tari_shutdown::ShutdownSignal; @@ -18,7 +21,10 @@ pub(crate) struct StatsCollector { miner_rejected: u64, pool_accepted: u64, pool_rejected: u64, - network_difficulty: Difficulty, + sha_network_difficulty: Difficulty, + sha_target_difficulty: Difficulty, + randomx_network_difficulty: Difficulty, + randomx_target_difficulty: Difficulty, sha3x_chain_height: u64, sha3x_chain_length: u64, randomx_chain_height: u64, @@ -48,7 +54,10 @@ impl StatsCollector { total_peers: 0, total_grey_list: 0, total_black_list: 0, - network_difficulty: Difficulty::min(), + sha_network_difficulty: Difficulty::min(), + randomx_network_difficulty: Difficulty::min(), + sha_target_difficulty: Difficulty::min(), + randomx_target_difficulty: Difficulty::min(), } } @@ -95,6 +104,30 @@ impl StatsCollector { self.total_grey_list = total_grey_list; self.total_black_list = total_black_list; }, + StatData::TargetDifficultyChanged { + target_difficulty, + pow_algo, + timestamp, + } => match pow_algo { + PowAlgorithm::Sha3x => { + self.sha_target_difficulty = target_difficulty; + }, + PowAlgorithm::RandomX => { + self.randomx_target_difficulty = target_difficulty; + }, + }, + StatData::NetworkDifficultyChanged { + network_difficulty, + pow_algo, + timestamp, + } => match pow_algo { + PowAlgorithm::Sha3x => { + self.sha_network_difficulty = network_difficulty; + }, + PowAlgorithm::RandomX => { + self.randomx_network_difficulty = network_difficulty; + }, + }, } } @@ -104,57 +137,67 @@ impl StatsCollector { loop { tokio::select! { - _ = self.shutdown_signal.wait() => { - break; - }, - _ = stats_report_timer.tick() => { - info!(target: LOG_TARGET, - "========= Chains: Rx {}..{}, Sha3 {}..{}. Miner(A/R): {}/{}. Pool(A/R) {}/{}. Peers(a/g/b) {}/{}/{} ==== ", - self.randomx_chain_height.saturating_sub(self.randomx_chain_length), - self.randomx_chain_height, - self.sha3x_chain_height.saturating_sub(self.sha3x_chain_length), - self.sha3x_chain_height, - self.miner_accepted, - self.miner_rejected, - self.pool_accepted, - self.pool_rejected, - self.total_peers, - self.total_grey_list, - self.total_black_list - ); - }, - res = self.request_rx.recv() => { - match res { - Some(StatsRequest::GetStats(_pow, _tx)) => { - todo!(); - // let _ = tx.send(hashrate); - }, - None => { + _ = self.shutdown_signal.wait() => { break; - } - } - }, - res = self.stats_broadcast_receiver.recv() => { - match res { - Ok(sample) => { - if self.first_stat_received.is_none() { - self.first_stat_received = Some(sample.timestamp()); + }, + _ = stats_report_timer.tick() => { + let formatter = Formatter::new(); + + info!(target: LOG_TARGET, + "========= Uptime: {}. Chains: Rx {}..{}, Sha3 {}..{}. Difficulty (Target/Network): Rx: {}/{} Sha3x: {}/{} Miner(A/R): {}/{}. Pool(A/R) {}/{}. Peers(a/g/b) {}/{}/{} ==== ", + humantime::format_duration(Duration::from_secs( + EpochTime::now().as_u64().checked_sub( + self.first_stat_received.unwrap_or_else(|| EpochTime::now()).as_u64()) + .unwrap_or_default())), + self.randomx_chain_height.saturating_sub(self.randomx_chain_length.saturating_sub(1)), + self.randomx_chain_height, + self.sha3x_chain_height.saturating_sub(self.sha3x_chain_length.saturating_sub(1)), + self.sha3x_chain_height, + formatter.format(self.randomx_target_difficulty.as_u64() as f64 ), + formatter.format( self.randomx_network_difficulty.as_u64() as f64), + formatter.format(self.sha_target_difficulty.as_u64() as f64), + formatter.format(self.sha_network_difficulty.as_u64() as f64), + self.miner_accepted, + self.miner_rejected, + self.pool_accepted, + self.pool_rejected, + self.total_peers, + self.total_grey_list, + self.total_black_list + ); + }, + res = self.request_rx.recv() => { + match res { + Some(StatsRequest::GetStats(_pow, _tx)) => { + todo!(); + // let _ = tx.send(hashrate); + }, + None => { + break; + } } - self.handle_stat(sample); - // Expect 2 samples per second per device - // let entry = self.hashrate_samples.entry(sample.device_id).or_insert_with(|| VecDeque::with_capacity(181)); - // if entry.len() > 180 { - // entry.pop_front(); - // } - // entry.push_back(sample); }, - Err(e) => { - error!(target: LOG_TARGET, "Error receiving hashrate sample: {:?}", e); - break; - } - } + res = self.stats_broadcast_receiver.recv() => { + match res { + Ok(sample) => { + if self.first_stat_received.is_none() { + self.first_stat_received = Some(sample.timestamp()); } - } + self.handle_stat(sample); + // Expect 2 samples per second per device + // let entry = self.hashrate_samples.entry(sample.device_id).or_insert_with(|| VecDeque::with_capacity(181)); + // if entry.len() > 180 { + // entry.pop_front(); + // } + // entry.push_back(sample); + }, + Err(e) => { + error!(target: LOG_TARGET, "Error receiving hashrate sample: {:?}", e); + break; + } + } + } + } } Ok(()) } @@ -175,6 +218,16 @@ pub(crate) struct ChainStats { #[derive(Clone)] pub(crate) enum StatData { + TargetDifficultyChanged { + target_difficulty: Difficulty, + pow_algo: PowAlgorithm, + timestamp: EpochTime, + }, + NetworkDifficultyChanged { + network_difficulty: Difficulty, + pow_algo: PowAlgorithm, + timestamp: EpochTime, + }, ChainStats { chain: ChainStats, timestamp: EpochTime, @@ -220,6 +273,8 @@ impl StatData { StatData::PoolBlockRejected { timestamp, .. } => *timestamp, StatData::ChainChanged { timestamp, .. } => *timestamp, StatData::NewPeer { timestamp, .. } => *timestamp, + StatData::TargetDifficultyChanged { timestamp, .. } => *timestamp, + StatData::NetworkDifficultyChanged { timestamp, .. } => *timestamp, } } } @@ -310,4 +365,30 @@ impl StatsBroadcastClient { timestamp: EpochTime::now(), }) } + + pub fn send_target_difficulty( + &self, + pow_algo: PowAlgorithm, + target_difficulty: Difficulty, + ) -> Result<(), anyhow::Error> { + let data = StatData::TargetDifficultyChanged { + target_difficulty, + pow_algo, + timestamp: EpochTime::now(), + }; + self.broadcast(data) + } + + pub fn send_network_difficulty( + &self, + pow_algo: PowAlgorithm, + network_difficulty: Difficulty, + ) -> Result<(), anyhow::Error> { + let data = StatData::NetworkDifficultyChanged { + network_difficulty, + pow_algo, + timestamp: EpochTime::now(), + }; + self.broadcast(data) + } }