mirror of
https://github.com/darkrenaissance/darkfi.git
synced 2026-01-09 14:48:08 -05:00
event_graph: remove check_version_match() and compare peers version with a const in taud and darkirc
This commit is contained in:
1
Cargo.lock
generated
1
Cargo.lock
generated
@@ -7106,6 +7106,7 @@ dependencies = [
|
|||||||
"log",
|
"log",
|
||||||
"rand 0.8.5",
|
"rand 0.8.5",
|
||||||
"ring 0.17.8",
|
"ring 0.17.8",
|
||||||
|
"semver 1.0.23",
|
||||||
"serde",
|
"serde",
|
||||||
"signal-hook",
|
"signal-hook",
|
||||||
"signal-hook-async-std",
|
"signal-hook-async-std",
|
||||||
|
|||||||
@@ -47,6 +47,8 @@ use super::{
|
|||||||
|
|
||||||
const PENALTY_LIMIT: usize = 5;
|
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.
|
/// Reply types, we can either send server replies, or client replies.
|
||||||
pub enum ReplyType {
|
pub enum ReplyType {
|
||||||
/// Server reply, we have to use numerics
|
/// Server reply, we have to use numerics
|
||||||
@@ -190,28 +192,27 @@ impl Client {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Otherwise, broadcast it
|
// 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 connected_peers = self.server.darkirc.p2p.hosts().peers();
|
||||||
let mut peers_with_matched_version = vec![];
|
let mut peers_millis = vec![];
|
||||||
let mut peers_with_different_version = vec![];
|
let mut peers_seconds = vec![];
|
||||||
for peer in connected_peers {
|
for peer in connected_peers {
|
||||||
let peer_version = peer.version.lock().await.clone();
|
let peer_version = peer.version.lock().await.clone();
|
||||||
if let Some(ref peer_version) = peer_version {
|
if let Some(ref peer_version) = peer_version {
|
||||||
if self_version == peer_version.version {
|
if peer_version.version > PROTOCOL_VERSION_SECS_TIMESTAMPS{
|
||||||
peers_with_matched_version.push(peer)
|
peers_millis.push(peer)
|
||||||
} else {
|
} else {
|
||||||
peers_with_different_version.push(peer)
|
peers_seconds.push(peer)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if !peers_with_matched_version.is_empty() {
|
if !peers_millis.is_empty() {
|
||||||
self.server.darkirc.p2p.broadcast_to(&EventPut(event.clone()), &peers_with_matched_version).await;
|
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;
|
let mut event = event;
|
||||||
event.timestamp /= 1000;
|
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;
|
// self.server.darkirc.p2p.broadcast(&EventPut(event)).await;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -37,6 +37,7 @@ ring = "0.17.8"
|
|||||||
# Encoding and parsing
|
# Encoding and parsing
|
||||||
bs58 = "0.5.1"
|
bs58 = "0.5.1"
|
||||||
toml = "0.8.19"
|
toml = "0.8.19"
|
||||||
|
semver = "1.0.23"
|
||||||
|
|
||||||
# Misc
|
# Misc
|
||||||
async-trait = "0.1.81"
|
async-trait = "0.1.81"
|
||||||
|
|||||||
@@ -76,6 +76,8 @@ use crate::{
|
|||||||
settings::{Args, CONFIG_FILE, CONFIG_FILE_CONTENTS},
|
settings::{Args, CONFIG_FILE, CONFIG_FILE_CONTENTS},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const PROTOCOL_VERSION_SECS_TIMESTAMPS: semver::Version = semver::Version::new(0, 5, 0);
|
||||||
|
|
||||||
struct Workspace {
|
struct Workspace {
|
||||||
read_key: ChaChaBox,
|
read_key: ChaChaBox,
|
||||||
write_key: Option<Ed25519KeyPair>,
|
write_key: Option<Ed25519KeyPair>,
|
||||||
@@ -318,28 +320,27 @@ async fn start_sync_loop(
|
|||||||
error!(target: "taud", "Failed inserting new event to DAG: {}", e);
|
error!(target: "taud", "Failed inserting new event to DAG: {}", e);
|
||||||
} else {
|
} else {
|
||||||
// Otherwise, broadcast it
|
// Otherwise, broadcast it
|
||||||
let self_version = p2p.settings().read().await.app_version.clone();
|
|
||||||
let connected_peers = p2p.hosts().peers();
|
let connected_peers = p2p.hosts().peers();
|
||||||
let mut peers_with_matched_version = vec![];
|
let mut peers_millis = vec![];
|
||||||
let mut peers_with_different_version = vec![];
|
let mut peers_seconds = vec![];
|
||||||
for peer in connected_peers {
|
for peer in connected_peers {
|
||||||
let peer_version = peer.version.lock().await.clone();
|
let peer_version = peer.version.lock().await.clone();
|
||||||
if let Some(ref peer_version) = peer_version {
|
if let Some(ref peer_version) = peer_version {
|
||||||
if self_version == peer_version.version {
|
if peer_version.version > PROTOCOL_VERSION_SECS_TIMESTAMPS {
|
||||||
peers_with_matched_version.push(peer)
|
peers_millis.push(peer)
|
||||||
} else {
|
} else {
|
||||||
peers_with_different_version.push(peer)
|
peers_seconds.push(peer)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if !peers_with_matched_version.is_empty() {
|
if !peers_millis.is_empty() {
|
||||||
p2p.broadcast_to(&EventPut(event.clone()), &peers_with_matched_version).await;
|
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;
|
let mut event = event;
|
||||||
event.timestamp /= 1000;
|
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;
|
// p2p.broadcast(&EventPut(event)).await;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -176,28 +176,21 @@ impl Event {
|
|||||||
/// assuming some possibility for a time drift.
|
/// assuming some possibility for a time drift.
|
||||||
/// Note: This validation does *NOT* check for recursive references(circles),
|
/// Note: This validation does *NOT* check for recursive references(circles),
|
||||||
/// and should be used as a first quick check.
|
/// 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
|
// Let's not bother with empty events
|
||||||
if self.content.is_empty() {
|
if self.content.is_empty() {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
if is_ver_match {
|
let timestamp =
|
||||||
// Check if the event is too old or too new
|
if self.timestamp > 1e10 as u64 { self.timestamp / 1000 } else { self.timestamp };
|
||||||
let now = UNIX_EPOCH.elapsed().unwrap().as_millis() as u64;
|
|
||||||
let too_old = self.timestamp < now - EVENT_TIME_DRIFT;
|
// Check if the event is too old or too new
|
||||||
let too_new = self.timestamp > now + EVENT_TIME_DRIFT;
|
let now = UNIX_EPOCH.elapsed().unwrap().as_secs();
|
||||||
if too_old || too_new {
|
let too_old = timestamp < (now - (EVENT_TIME_DRIFT / 1000));
|
||||||
return false
|
let too_new = timestamp > (now + (EVENT_TIME_DRIFT / 1000));
|
||||||
}
|
if too_old || too_new {
|
||||||
} else {
|
return false
|
||||||
// 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
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Validate the parents. We have to check that at least one parent
|
// Validate the parents. We have to check that at least one parent
|
||||||
|
|||||||
@@ -35,7 +35,7 @@ use tinyjson::JsonValue::{self};
|
|||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
event_graph::util::{replayer_log, seconds_until_next_rotation},
|
event_graph::util::{replayer_log, seconds_until_next_rotation},
|
||||||
net::{channel::Channel, P2pPtr},
|
net::P2pPtr,
|
||||||
rpc::{
|
rpc::{
|
||||||
jsonrpc::{JsonResponse, JsonResult},
|
jsonrpc::{JsonResponse, JsonResult},
|
||||||
util::json_map,
|
util::json_map,
|
||||||
@@ -880,18 +880,4 @@ impl EventGraph {
|
|||||||
|
|
||||||
Ok(result)
|
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<Channel>) -> 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
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -203,8 +203,7 @@ impl ProtocolEventGraph {
|
|||||||
// Validate the new event first. If we do not consider it valid, we
|
// Validate the new event first. If we do not consider it valid, we
|
||||||
// will just drop it and stay quiet. If the malicious threshold
|
// will just drop it and stay quiet. If the malicious threshold
|
||||||
// is reached, we will stop the connection.
|
// is reached, we will stop the connection.
|
||||||
let is_ver_match = self.event_graph.check_version_match(&self.channel).await;
|
if !event.validate_new() {
|
||||||
if !event.validate_new(is_ver_match) {
|
|
||||||
self.clone().increase_malicious_count().await?;
|
self.clone().increase_malicious_count().await?;
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user