diff --git a/src/bin/dashboard_src/peers_screen.rs b/src/bin/dashboard_src/peers_screen.rs index 3f5d1cf3..5dd3b993 100644 --- a/src/bin/dashboard_src/peers_screen.rs +++ b/src/bin/dashboard_src/peers_screen.rs @@ -5,7 +5,7 @@ use std::sync::Mutex; use std::time::Duration; use itertools::Itertools; -use neptune_cash::models::peer::PeerInfo; +use neptune_cash::models::peer::peer_info::PeerInfo; use neptune_cash::rpc_auth; use neptune_cash::rpc_server::RPCClient; use ratatui::layout::Constraint; diff --git a/src/connect_to_peers.rs b/src/connect_to_peers.rs index 757b9e4c..adb8ddee 100644 --- a/src/connect_to_peers.rs +++ b/src/connect_to_peers.rs @@ -554,9 +554,9 @@ mod connect_tests { use super::*; use crate::config_models::cli_args; use crate::config_models::network::Network; + use crate::models::peer::peer_info::PeerInfo; use crate::models::peer::InternalConnectionStatus; use crate::models::peer::NegativePeerSanction; - use crate::models::peer::PeerInfo; use crate::models::peer::PeerMessage; use crate::models::peer::PeerStanding; use crate::prelude::twenty_first; diff --git a/src/lib.rs b/src/lib.rs index fbdb0116..a83fa298 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -45,7 +45,7 @@ use futures::StreamExt; use models::blockchain::block::Block; use models::blockchain::shared::Hash; use models::peer::handshake_data::HandshakeData; -use models::peer::PeerInfo; +use models::peer::peer_info::PeerInfo; use prelude::tasm_lib; use prelude::triton_vm; use prelude::twenty_first; diff --git a/src/main_loop.rs b/src/main_loop.rs index d40f1005..08d42135 100644 --- a/src/main_loop.rs +++ b/src/main_loop.rs @@ -44,8 +44,8 @@ use crate::models::channel::MinerToMain; use crate::models::channel::PeerTaskToMain; use crate::models::channel::RPCServerToMain; use crate::models::peer::handshake_data::HandshakeData; +use crate::models::peer::peer_info::PeerInfo; use crate::models::peer::transaction_notification::TransactionNotification; -use crate::models::peer::PeerInfo; use crate::models::peer::PeerSynchronizationState; use crate::models::proof_abstractions::tasm::program::TritonVmProofJobOptions; use crate::models::state::block_proposal::BlockProposal; diff --git a/src/models/peer.rs b/src/models/peer.rs index 99cdc030..568a7ec2 100644 --- a/src/models/peer.rs +++ b/src/models/peer.rs @@ -1,5 +1,6 @@ pub(crate) mod handshake_data; pub mod peer_block_notifications; +pub mod peer_info; pub mod transaction_notification; pub mod transfer_block; pub mod transfer_transaction; @@ -49,101 +50,6 @@ pub(crate) type InstanceId = u128; pub(crate) const SYNC_CHALLENGE_POW_WITNESS_LENGTH: usize = 10; pub(crate) const SYNC_CHALLENGE_NUM_BLOCK_PAIRS: usize = 10; -#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Hash)] -pub(crate) struct PeerConnectionInfo { - port_for_incoming_connections: Option, - connected_address: SocketAddr, - inbound: bool, -} - -impl PeerConnectionInfo { - pub(crate) fn new( - port_for_incoming_connections: Option, - connected_address: SocketAddr, - inbound: bool, - ) -> Self { - Self { - port_for_incoming_connections, - connected_address, - inbound, - } - } -} - -#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq, Hash)] -pub struct PeerInfo { - peer_connection_info: PeerConnectionInfo, - instance_id: InstanceId, - connection_established: SystemTime, - pub(crate) standing: PeerStanding, - version: String, - is_archival_node: bool, -} - -impl PeerInfo { - pub(crate) fn new( - peer_connection_info: PeerConnectionInfo, - instance_id: InstanceId, - connection_established: SystemTime, - version: String, - is_archival_node: bool, - peer_tolerance: u16, - ) -> Self { - assert!(peer_tolerance > 0, "Peer tolerance must be positive"); - let standing = PeerStanding::new(peer_tolerance); - Self { - peer_connection_info, - instance_id, - connection_established, - standing, - version, - is_archival_node, - } - } - - pub(crate) fn with_standing(mut self, standing: PeerStanding) -> Self { - self.standing = standing; - self - } - - pub(crate) fn instance_id(&self) -> u128 { - self.instance_id - } - - pub fn standing(&self) -> PeerStanding { - self.standing - } - - pub fn connected_address(&self) -> SocketAddr { - self.peer_connection_info.connected_address - } - - pub fn connection_established(&self) -> SystemTime { - self.connection_established - } - - pub fn is_archival_node(&self) -> bool { - self.is_archival_node - } - - pub(crate) fn connection_is_inbound(&self) -> bool { - self.peer_connection_info.inbound - } - - /// Return the socket address that the peer is expected to listen on. Returns `None` if peer does not accept - /// incoming connections. - pub fn listen_address(&self) -> Option { - self.peer_connection_info - .port_for_incoming_connections - .map(|port| SocketAddr::new(self.peer_connection_info.connected_address.ip(), port)) - } - - #[cfg(test)] - pub(crate) fn set_connection_established(&mut self, new_timestamp: SystemTime) { - self.connection_established = new_timestamp; - } -} - trait Sanction { fn severity(self) -> i32; } diff --git a/src/models/peer/peer_info.rs b/src/models/peer/peer_info.rs new file mode 100644 index 00000000..5bad3a88 --- /dev/null +++ b/src/models/peer/peer_info.rs @@ -0,0 +1,103 @@ +use std::net::SocketAddr; +use std::time::SystemTime; + +use serde::Deserialize; +use serde::Serialize; + +use super::InstanceId; +use super::PeerStanding; + +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Hash)] +pub(crate) struct PeerConnectionInfo { + port_for_incoming_connections: Option, + connected_address: SocketAddr, + inbound: bool, +} + +impl PeerConnectionInfo { + pub(crate) fn new( + port_for_incoming_connections: Option, + connected_address: SocketAddr, + inbound: bool, + ) -> Self { + Self { + port_for_incoming_connections, + connected_address, + inbound, + } + } +} + +#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq, Hash)] +pub struct PeerInfo { + peer_connection_info: PeerConnectionInfo, + instance_id: InstanceId, + connection_established: SystemTime, + pub(crate) standing: PeerStanding, + version: String, + is_archival_node: bool, +} + +impl PeerInfo { + pub(crate) fn new( + peer_connection_info: PeerConnectionInfo, + instance_id: InstanceId, + connection_established: SystemTime, + version: String, + is_archival_node: bool, + peer_tolerance: u16, + ) -> Self { + assert!(peer_tolerance > 0, "Peer tolerance must be positive"); + let standing = PeerStanding::new(peer_tolerance); + Self { + peer_connection_info, + instance_id, + connection_established, + standing, + version, + is_archival_node, + } + } + + pub(crate) fn with_standing(mut self, standing: PeerStanding) -> Self { + self.standing = standing; + self + } + + pub(crate) fn instance_id(&self) -> u128 { + self.instance_id + } + + pub fn standing(&self) -> PeerStanding { + self.standing + } + + pub fn connected_address(&self) -> SocketAddr { + self.peer_connection_info.connected_address + } + + pub fn connection_established(&self) -> SystemTime { + self.connection_established + } + + pub fn is_archival_node(&self) -> bool { + self.is_archival_node + } + + pub(crate) fn connection_is_inbound(&self) -> bool { + self.peer_connection_info.inbound + } + + /// Return the socket address that the peer is expected to listen on. Returns `None` if peer does not accept + /// incoming connections. + pub fn listen_address(&self) -> Option { + self.peer_connection_info + .port_for_incoming_connections + .map(|port| SocketAddr::new(self.peer_connection_info.connected_address.ip(), port)) + } + + #[cfg(test)] + pub(crate) fn set_connection_established(&mut self, new_timestamp: SystemTime) { + self.connection_established = new_timestamp; + } +} diff --git a/src/models/state/networking_state.rs b/src/models/state/networking_state.rs index ed0d7170..d4f14b55 100644 --- a/src/models/state/networking_state.rs +++ b/src/models/state/networking_state.rs @@ -14,12 +14,12 @@ use crate::database::WriteBatchAsync; use crate::models::blockchain::block::block_height::BlockHeight; use crate::models::blockchain::block::difficulty_control::ProofOfWork; use crate::models::database::PeerDatabases; -use crate::models::peer; +use crate::models::peer::peer_info::PeerInfo; use crate::models::peer::PeerStanding; pub const BANNED_IPS_DB_NAME: &str = "banned_ips"; -type PeerMap = HashMap; +type PeerMap = HashMap; /// Information about a foreign tip towards which the client is syncing. #[derive(Debug, Clone, Eq, PartialEq)] diff --git a/src/peer_loop.rs b/src/peer_loop.rs index 696ef05e..e6305ef3 100644 --- a/src/peer_loop.rs +++ b/src/peer_loop.rs @@ -37,14 +37,14 @@ use crate::models::channel::MainToPeerTask; use crate::models::channel::PeerTaskToMain; use crate::models::channel::PeerTaskToMainTransaction; use crate::models::peer::handshake_data::HandshakeData; +use crate::models::peer::peer_info::PeerConnectionInfo; +use crate::models::peer::peer_info::PeerInfo; use crate::models::peer::transfer_block::TransferBlock; use crate::models::peer::BlockProposalRequest; use crate::models::peer::BlockRequestBatch; use crate::models::peer::IssuedSyncChallenge; use crate::models::peer::MutablePeerState; use crate::models::peer::NegativePeerSanction; -use crate::models::peer::PeerConnectionInfo; -use crate::models::peer::PeerInfo; use crate::models::peer::PeerMessage; use crate::models::peer::PeerSanction; use crate::models::peer::PeerStanding; diff --git a/src/rpc_server.rs b/src/rpc_server.rs index 4e8055db..7bc3165c 100644 --- a/src/rpc_server.rs +++ b/src/rpc_server.rs @@ -76,8 +76,8 @@ use crate::models::blockchain::transaction::TransactionProof; use crate::models::blockchain::type_scripts::native_currency_amount::NativeCurrencyAmount; use crate::models::channel::ClaimUtxoData; use crate::models::channel::RPCServerToMain; +use crate::models::peer::peer_info::PeerInfo; use crate::models::peer::InstanceId; -use crate::models::peer::PeerInfo; use crate::models::peer::PeerStanding; use crate::models::proof_abstractions::timestamp::Timestamp; use crate::models::state::mining_status::MiningStatus; diff --git a/src/tests/shared.rs b/src/tests/shared.rs index da6056d9..06d0a32e 100644 --- a/src/tests/shared.rs +++ b/src/tests/shared.rs @@ -86,8 +86,8 @@ use crate::models::channel::PeerTaskToMain; use crate::models::database::BlockIndexKey; use crate::models::database::BlockIndexValue; use crate::models::database::PeerDatabases; -use crate::models::peer::PeerConnectionInfo; -use crate::models::peer::PeerInfo; +use crate::models::peer::peer_info::PeerConnectionInfo; +use crate::models::peer::peer_info::PeerInfo; use crate::models::peer::PeerMessage; use crate::models::proof_abstractions::mast_hash::MastHash; use crate::models::proof_abstractions::timestamp::Timestamp;