diff --git a/Cargo.lock b/Cargo.lock index 02a220349..7c80672b5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -7106,6 +7106,7 @@ dependencies = [ "log", "rand 0.8.5", "ring 0.17.8", + "semver 1.0.23", "serde", "signal-hook", "signal-hook-async-std", diff --git a/bin/darkirc/src/irc/client.rs b/bin/darkirc/src/irc/client.rs index a994c3d49..6f2c8f1f1 100644 --- a/bin/darkirc/src/irc/client.rs +++ b/bin/darkirc/src/irc/client.rs @@ -47,6 +47,8 @@ use super::{ const PENALTY_LIMIT: usize = 5; +const PROTOCOL_VERSION_SECS_TIMESTAMPS: semver::Version = semver::Version::new(0, 5, 0); + /// Reply types, we can either send server replies, or client replies. pub enum ReplyType { /// Server reply, we have to use numerics @@ -190,28 +192,27 @@ impl Client { } // Otherwise, broadcast it - let self_version = self.server.darkirc.p2p.settings().read().await.app_version.clone(); let connected_peers = self.server.darkirc.p2p.hosts().peers(); - let mut peers_with_matched_version = vec![]; - let mut peers_with_different_version = vec![]; + let mut peers_millis = vec![]; + let mut peers_seconds = vec![]; for peer in connected_peers { let peer_version = peer.version.lock().await.clone(); if let Some(ref peer_version) = peer_version { - if self_version == peer_version.version { - peers_with_matched_version.push(peer) + if peer_version.version > PROTOCOL_VERSION_SECS_TIMESTAMPS{ + peers_millis.push(peer) } else { - peers_with_different_version.push(peer) + peers_seconds.push(peer) } } } - if !peers_with_matched_version.is_empty() { - self.server.darkirc.p2p.broadcast_to(&EventPut(event.clone()), &peers_with_matched_version).await; + if !peers_millis.is_empty() { + self.server.darkirc.p2p.broadcast_to(&EventPut(event.clone()), &peers_millis).await; } - if !peers_with_different_version.is_empty() { + if !peers_seconds.is_empty() { let mut event = event; event.timestamp /= 1000; - self.server.darkirc.p2p.broadcast_to(&EventPut(event), &peers_with_different_version).await; + self.server.darkirc.p2p.broadcast_to(&EventPut(event), &peers_seconds).await; } // self.server.darkirc.p2p.broadcast(&EventPut(event)).await; } diff --git a/bin/tau/taud/Cargo.toml b/bin/tau/taud/Cargo.toml index 71d231dc1..40b1735d3 100644 --- a/bin/tau/taud/Cargo.toml +++ b/bin/tau/taud/Cargo.toml @@ -37,6 +37,7 @@ ring = "0.17.8" # Encoding and parsing bs58 = "0.5.1" toml = "0.8.19" +semver = "1.0.23" # Misc async-trait = "0.1.81" diff --git a/bin/tau/taud/src/main.rs b/bin/tau/taud/src/main.rs index 1d4fd43ba..b84f6815a 100644 --- a/bin/tau/taud/src/main.rs +++ b/bin/tau/taud/src/main.rs @@ -76,6 +76,8 @@ use crate::{ settings::{Args, CONFIG_FILE, CONFIG_FILE_CONTENTS}, }; +const PROTOCOL_VERSION_SECS_TIMESTAMPS: semver::Version = semver::Version::new(0, 5, 0); + struct Workspace { read_key: ChaChaBox, write_key: Option, @@ -318,28 +320,27 @@ async fn start_sync_loop( error!(target: "taud", "Failed inserting new event to DAG: {}", e); } else { // Otherwise, broadcast it - let self_version = p2p.settings().read().await.app_version.clone(); let connected_peers = p2p.hosts().peers(); - let mut peers_with_matched_version = vec![]; - let mut peers_with_different_version = vec![]; + let mut peers_millis = vec![]; + let mut peers_seconds = vec![]; for peer in connected_peers { let peer_version = peer.version.lock().await.clone(); if let Some(ref peer_version) = peer_version { - if self_version == peer_version.version { - peers_with_matched_version.push(peer) + if peer_version.version > PROTOCOL_VERSION_SECS_TIMESTAMPS { + peers_millis.push(peer) } else { - peers_with_different_version.push(peer) + peers_seconds.push(peer) } } } - if !peers_with_matched_version.is_empty() { - p2p.broadcast_to(&EventPut(event.clone()), &peers_with_matched_version).await; + if !peers_millis.is_empty() { + p2p.broadcast_to(&EventPut(event.clone()), &peers_millis).await; } - if !peers_with_different_version.is_empty() { + if !peers_seconds.is_empty() { let mut event = event; event.timestamp /= 1000; - p2p.broadcast_to(&EventPut(event), &peers_with_different_version).await; + p2p.broadcast_to(&EventPut(event), &peers_seconds).await; } // p2p.broadcast(&EventPut(event)).await; } diff --git a/src/event_graph/event.rs b/src/event_graph/event.rs index cf84db89a..fc890a3b6 100644 --- a/src/event_graph/event.rs +++ b/src/event_graph/event.rs @@ -176,28 +176,21 @@ impl Event { /// assuming some possibility for a time drift. /// Note: This validation does *NOT* check for recursive references(circles), /// and should be used as a first quick check. - pub fn validate_new(&self, is_ver_match: bool) -> bool { + pub fn validate_new(&self) -> bool { // Let's not bother with empty events if self.content.is_empty() { return false } - if is_ver_match { - // Check if the event is too old or too new - let now = UNIX_EPOCH.elapsed().unwrap().as_millis() as u64; - let too_old = self.timestamp < now - EVENT_TIME_DRIFT; - let too_new = self.timestamp > now + EVENT_TIME_DRIFT; - if too_old || too_new { - return false - } - } else { - // Check if the event is too old or too new - let now = UNIX_EPOCH.elapsed().unwrap().as_secs(); - let too_old = self.timestamp < (now - (EVENT_TIME_DRIFT / 1000)); - let too_new = self.timestamp > (now + (EVENT_TIME_DRIFT / 1000)); - if too_old || too_new { - return false - } + let timestamp = + if self.timestamp > 1e10 as u64 { self.timestamp / 1000 } else { self.timestamp }; + + // Check if the event is too old or too new + let now = UNIX_EPOCH.elapsed().unwrap().as_secs(); + let too_old = timestamp < (now - (EVENT_TIME_DRIFT / 1000)); + let too_new = timestamp > (now + (EVENT_TIME_DRIFT / 1000)); + if too_old || too_new { + return false } // Validate the parents. We have to check that at least one parent diff --git a/src/event_graph/mod.rs b/src/event_graph/mod.rs index 765fe1d55..889fea576 100644 --- a/src/event_graph/mod.rs +++ b/src/event_graph/mod.rs @@ -35,7 +35,7 @@ use tinyjson::JsonValue::{self}; use crate::{ event_graph::util::{replayer_log, seconds_until_next_rotation}, - net::{channel::Channel, P2pPtr}, + net::P2pPtr, rpc::{ jsonrpc::{JsonResponse, JsonResult}, util::json_map, @@ -880,18 +880,4 @@ impl EventGraph { Ok(result) } - - /// Check if the our version matches the connected peer's - /// return true if they are, false otherwise - async fn check_version_match(&self, channel: &Arc) -> bool { - let self_version = self.p2p.settings().read().await.app_version.clone(); - let peer_version = channel.version.lock().await.clone(); - if let Some(ref peer_version) = peer_version { - if self_version == peer_version.version { - return true - } - } - - false - } } diff --git a/src/event_graph/proto.rs b/src/event_graph/proto.rs index e698e0cb6..d544e2db4 100644 --- a/src/event_graph/proto.rs +++ b/src/event_graph/proto.rs @@ -203,8 +203,7 @@ impl ProtocolEventGraph { // Validate the new event first. If we do not consider it valid, we // will just drop it and stay quiet. If the malicious threshold // is reached, we will stop the connection. - let is_ver_match = self.event_graph.check_version_match(&self.channel).await; - if !event.validate_new(is_ver_match) { + if !event.validate_new() { self.clone().increase_malicious_count().await?; continue }