From 2f4051d7519bd971c3a1a28639e4e86fe90687e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ahmet=20Kaan=20G=C3=9CM=C3=9C=C5=9E?= <96421894+Tahinli@users.noreply.github.com> Date: Thu, 30 May 2024 01:37:18 +0300 Subject: [PATCH] feat: :sparkles: send mined block for client --- src/blockchain.rs | 8 +++++++- src/client_network.rs | 36 ++++++++++++++++++++++++++++++------ src/consensus.rs | 9 +++++++-- 3 files changed, 44 insertions(+), 9 deletions(-) diff --git a/src/blockchain.rs b/src/blockchain.rs index 249e4e1..0ed6d01 100644 --- a/src/blockchain.rs +++ b/src/blockchain.rs @@ -51,7 +51,13 @@ impl BlockChain { self.chain.push(new_block); } - pub fn add_block(&mut self, block: Block) -> Option { + pub fn add_block(&mut self, mut block: Block) -> Block { + block.mine(self.difficulty); + self.chain.push(block.clone()); + block + } + + pub fn push_block(&mut self, block: Block) -> Option { if block.hash != String::new() { self.chain.push(block.clone()); Some(block) diff --git a/src/client_network.rs b/src/client_network.rs index 1639da2..fe7e32a 100644 --- a/src/client_network.rs +++ b/src/client_network.rs @@ -1,6 +1,9 @@ -use futures_util::{stream::SplitStream, StreamExt}; +use futures_util::{ + stream::{SplitSink, SplitStream}, + SinkExt, StreamExt, +}; use tokio::net::TcpStream; -use tokio_tungstenite::{connect_async, MaybeTlsStream, WebSocketStream}; +use tokio_tungstenite::{connect_async, tungstenite::Message, MaybeTlsStream, WebSocketStream}; use crate::{block::Block, blockchain::BlockChain, ClientConfig}; @@ -14,11 +17,14 @@ pub async fn start_network(client_config: ClientConfig) { Ok(ws_stream) => ws_stream, Err(_) => return, }; - let (_, ws_receiver) = ws_stream.0.split(); - sync(ws_receiver).await; + let (ws_stream_sender, ws_stream_receiver) = ws_stream.0.split(); + sync(ws_stream_sender, ws_stream_receiver).await; } -async fn sync(ws_stream_receiver: SplitStream>>) { +async fn sync( + mut ws_stream_sender: SplitSink>, Message>, + ws_stream_receiver: SplitStream>>, +) { let (mut ws_stream_receiver, mut blockchain) = match receive_blockchain(ws_stream_receiver).await { Some((ws_stream_receiver, blockchain)) => (ws_stream_receiver, blockchain), @@ -30,7 +36,11 @@ async fn sync(ws_stream_receiver: SplitStream (ws_stream_receiver, block), None => return, }; - blockchain.add_block(block); + let block = blockchain.add_block(block); + ws_stream_sender = match send_block(ws_stream_sender, block).await { + Some(ws_stream_sender) => ws_stream_sender, + None => return, + } } } @@ -83,3 +93,17 @@ async fn receive_block( None => return None, } } + +async fn send_block( + mut ws_stream_sender: SplitSink>, Message>, + block: Block, +) -> Option>, Message>> { + let block_data = serde_json::json!(block).to_string(); + match ws_stream_sender.send(block_data.into()).await { + Ok(_) => match ws_stream_sender.flush().await { + Ok(_) => Some(ws_stream_sender), + Err(_) => None, + }, + Err(_) => None, + } +} diff --git a/src/consensus.rs b/src/consensus.rs index c6eca84..5e3c14d 100644 --- a/src/consensus.rs +++ b/src/consensus.rs @@ -44,8 +44,13 @@ pub async fn accept_agreement( //03.46 right now. for block in received_blocks.iter() { if max_pair.0 == block.hash { - match blockchain_thread_safe.lock().await.add_block(block.clone()) { - Some(_successfully_added_block) => { + match blockchain_thread_safe + .lock() + .await + .push_block(block.clone()) + { + Some(successfully_added_block) => { + println!("{:#?}", successfully_added_block); todo!("Notify Whole Network, Reward First Founder or Else") } None => todo!(),