summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorlittleblack111 <littleblack11111@gmail.com>2025-10-21 11:08:00 +0800
committerlittleblack111 <littleblack11111@gmail.com>2025-10-21 21:14:12 +0800
commit03709597ead7197b95c19d942020656f6b4eafd4 (patch)
tree239339a03ce5780fc6b25af4ce7916f516d654f3 /src
parent6ae4e4b55d06d50a2ee2661163ec8092d2e6fdf1 (diff)
fix: frame send
Diffstat (limited to 'src')
-rw-r--r--src/network.rs69
1 files changed, 41 insertions, 28 deletions
diff --git a/src/network.rs b/src/network.rs
index 08d59ef..0a49ded 100644
--- a/src/network.rs
+++ b/src/network.rs
@@ -2,6 +2,7 @@ use std::sync::{Arc, Weak};
use serde::{Deserialize, Serialize};
+use futures::stream::{SplitSink, SplitStream};
use futures::{SinkExt, StreamExt};
use tokio::{
net::{TcpListener, TcpStream},
@@ -140,51 +141,66 @@ impl Network {
pub async fn broadcast(&mut self, data: Request) {
for p in &self.peers {
- p.lock()
- .await
- .framed
+ let sink = {
+ let peer = p
+ .lock()
+ .await;
+ Arc::clone(&peer.sink)
+ };
+ let mut sink = sink
+ .lock()
+ .await;
+ let _ = sink
.send(data.clone())
- .await
- .unwrap();
+ .await;
}
}
}
struct Peer {
parent: Weak<Mutex<Network>>,
- framed: Framed<TokioFramed<TcpStream, LengthDelimitedCodec>, Request, Request, Json<Request, Request>>,
+ sink: Arc<Mutex<SplitSink<Framed<TokioFramed<TcpStream, LengthDelimitedCodec>, Request, Request, Json<Request, Request>>, Request>>>,
}
impl Peer {
fn new(parent: Weak<Mutex<Network>>, stream: TcpStream) -> Self {
+ let framed = Framed::new(TokioFramed::new(stream, LengthDelimitedCodec::new()), Json::default());
+ let (sink, stream) = framed.split();
+ let sink = Arc::new(Mutex::new(sink));
+ let reader = parent.clone();
+ spawn(async move {
+ Peer::read_loop(reader, stream).await;
+ });
Self {
parent,
- framed: Framed::new(TokioFramed::new(stream, LengthDelimitedCodec::new()), Json::default()),
+ sink,
}
}
- async fn start(&mut self) {
+ async fn start(&mut self) {}
+
+ async fn read_loop(parent: Weak<Mutex<Network>>, mut stream: SplitStream<Framed<TokioFramed<TcpStream, LengthDelimitedCodec>, Request, Request, Json<Request, Request>>>) {
loop {
- while let Some(req) = self
- .framed
+ while let Some(req) = stream
.next()
.await
{
- self.handle(req.unwrap())
- .await;
+ if let Ok(msg) = req {
+ Peer::handle(parent.clone(), msg).await;
+ }
}
}
}
- async fn handle(&mut self, req: Request) {
+ async fn handle(parent: Weak<Mutex<Network>>, req: Request) {
match req {
Request::Block(mut block) => match block.pow {
- Some(pow) => {
+ Some(_pow) => {
if !block.verify_pow() {
eprintln!("Rejecting remote block, POW verification failed"); // TODO: log remote IP
return;
}
- self.parent
+ parent
.upgrade()
.unwrap()
.lock()
@@ -196,8 +212,7 @@ impl Peer {
}
None => {
block.calc_set_pow();
- let parent = self
- .parent
+ let parent = parent
.upgrade()
.unwrap();
let mut parent = parent
@@ -210,27 +225,25 @@ impl Peer {
},
Request::Ibd(bc) => match bc {
Some(bc) => {
- let parent = self
- .parent
+ let parent = parent
.upgrade()
.unwrap();
let parent = parent
.lock()
.await;
- let mut self_bc = parent
+ if *parent
.blockchain
.lock()
- .await;
- // verify if our blocks match theirs
- if *self_bc != bc {
- eprintln!("Remote IBD broadcast did not match ours") // TODO: log IP of sender
- // TODO: verify POWs, prev_hash of theirs(check missing), verify our POWs and if they have more blocks if their's all correct
- // TODO: maybe queue and see if everybody else's blockchain match and is verified and has more block
+ .await
+ != bc
+ {
+ // TODO: maybe queue and see if everybody else's blockchain match and is
+ // verified and has more block
+ eprintln!("Remote IBD broadcast did not match ours")
}
}
None => {
- let parent = self
- .parent
+ let parent = parent
.upgrade()
.unwrap();
let mut parent = parent