diff --git a/Cargo.lock b/Cargo.lock index 71f4600..e2db10b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -429,6 +429,7 @@ dependencies = [ "networking", "serde", "serde_json", + "tokio", ] [[package]] diff --git a/consensus/Cargo.toml b/consensus/Cargo.toml index 6348adb..a86f661 100644 --- a/consensus/Cargo.toml +++ b/consensus/Cargo.toml @@ -9,6 +9,7 @@ serde_json.workspace = true env_logger.workspace = true log.workspace = true serde.workspace = true +tokio.workspace = true [dependencies.networking] path = "../networking" \ No newline at end of file diff --git a/consensus/src/lib.rs b/consensus/src/lib.rs index 2517fb1..3d4e60e 100644 --- a/consensus/src/lib.rs +++ b/consensus/src/lib.rs @@ -1 +1,22 @@ -//ToDo: Add consensus module +use std::sync::Arc; + +use networking::peer_manager::PeerManager; +use tokio::sync::Mutex; + +#[derive(Debug)] +///Entrypoint to consensus. +/// Manages consensus protocol. +pub struct ConsensusManager { + pub peer_manager: Arc>, +} + +impl ConsensusManager { + pub fn new(peer_manager: Arc>) -> Self { + Self { peer_manager } + } + + //ToDo: change block from generic value into struct, when data block will be defined + pub fn vote(&self, _block: serde_json::Value) -> bool { + todo!() + } +} diff --git a/networking/src/lib.rs b/networking/src/lib.rs index 57df9c8..77025d9 100644 --- a/networking/src/lib.rs +++ b/networking/src/lib.rs @@ -1 +1,5 @@ -//ToDo: Add networking module +pub mod network_protocol; +pub mod peer; +pub mod peer_manager; +pub mod rate_limiter; +pub mod tcp; diff --git a/networking/src/network_protocol.rs b/networking/src/network_protocol.rs new file mode 100644 index 0000000..333887b --- /dev/null +++ b/networking/src/network_protocol.rs @@ -0,0 +1,19 @@ +#[derive(Debug)] +pub enum MessageKind {} + +pub type PeerId = u64; +pub type PeerDistance = u32; + +#[derive(Debug)] +pub struct PeerAddr { + pub id: PeerId, + //Probably will be socket address in the future + pub addr: String, +} + +#[derive(Debug)] +///Structure, which contains all necessary fields for handshake +pub struct Handshake {} + +#[derive(Debug)] +pub enum HandshakeFailedReason {} diff --git a/networking/src/peer.rs b/networking/src/peer.rs new file mode 100644 index 0000000..c7775d8 --- /dev/null +++ b/networking/src/peer.rs @@ -0,0 +1,18 @@ +use crate::{ + network_protocol::{HandshakeFailedReason, PeerAddr}, + tcp::Connection, +}; + +#[derive(Debug)] +/// Structure, which stores all of the peer interaction data. +/// Created at per-peer connection basis at `PeerManager` +pub struct Peer { + pub connection: Connection, + pub peer_addr: PeerAddr, +} + +impl Peer { + pub fn handshake(&mut self) -> Result<(), HandshakeFailedReason> { + todo!(); + } +} diff --git a/networking/src/peer_manager.rs b/networking/src/peer_manager.rs new file mode 100644 index 0000000..f75cb81 --- /dev/null +++ b/networking/src/peer_manager.rs @@ -0,0 +1,20 @@ +use anyhow::Result; + +use crate::{network_protocol::PeerId, peer::Peer}; + +#[derive(Debug)] +///Entrypoint to network module. +/// Manages connections with peers in network +pub struct PeerManager { + pub my_peer_id: PeerId, +} + +impl PeerManager { + pub async fn start_peer_manager(_num_threads: u8, my_peer_id: PeerId) -> Result { + Ok(Self { my_peer_id }) + } + + pub async fn connect(&self, _peer_id: PeerId) -> Peer { + todo!() + } +} diff --git a/networking/src/rate_limiter.rs b/networking/src/rate_limiter.rs new file mode 100644 index 0000000..316e5a3 --- /dev/null +++ b/networking/src/rate_limiter.rs @@ -0,0 +1,16 @@ +use std::collections::HashMap; + +use crate::network_protocol::MessageKind; + +#[derive(Debug)] +/// Object responsible to manage the rate limits of all network messages +/// for a single connection/peer. +pub struct RateLimiter { + pub limits: HashMap, +} + +impl RateLimiter { + pub fn is_allowed(&self, _message: MessageKind) -> bool { + todo!(); + } +} diff --git a/networking/src/tcp.rs b/networking/src/tcp.rs new file mode 100644 index 0000000..406c64f --- /dev/null +++ b/networking/src/tcp.rs @@ -0,0 +1,11 @@ +use crate::network_protocol::PeerAddr; + +#[derive(Debug)] +///Structure, representing peer connection +pub struct Connection {} + +#[derive(Debug)] +pub enum ConnectionType { + Inbound { conn: Connection }, + Outbound { conn: Connection, peer: PeerAddr }, +} diff --git a/node_runner/src/lib.rs b/node_runner/src/lib.rs index 4c5e698..bd6d129 100644 --- a/node_runner/src/lib.rs +++ b/node_runner/src/lib.rs @@ -1,7 +1,12 @@ +use std::sync::Arc; + use anyhow::Result; +use consensus::ConsensusManager; use log::info; +use networking::peer_manager::PeerManager; use node_rpc::new_http_server; use rpc_primitives::RpcConfig; +use tokio::sync::Mutex; pub async fn main_runner() -> Result<()> { env_logger::init(); @@ -11,6 +16,14 @@ pub async fn main_runner() -> Result<()> { let _http_server_handle = http_server.handle(); tokio::spawn(http_server); + let peer_manager = PeerManager::start_peer_manager(4, 0).await?; + info!("Peer manager mock started"); + + let peer_manager_shared = Arc::new(Mutex::new(peer_manager)); + + let _consensus_manager = ConsensusManager::new(peer_manager_shared.clone()); + info!("Consensus manger mock started"); + #[allow(clippy::empty_loop)] loop { //ToDo: Insert activity into main loop diff --git a/rpc_primitives/src/message.rs b/rpc_primitives/src/message.rs index 523fcca..9378b60 100644 --- a/rpc_primitives/src/message.rs +++ b/rpc_primitives/src/message.rs @@ -28,6 +28,7 @@ impl serde::Serialize for Version { impl<'de> serde::Deserialize<'de> for Version { fn deserialize>(deserializer: D) -> Result { struct VersionVisitor; + #[allow(clippy::needless_lifetimes)] impl<'de> Visitor<'de> for VersionVisitor { type Value = Version;