diff options
| author | littleblack111 <littleblack11111@gmail.com> | 2025-10-21 22:05:04 +0800 |
|---|---|---|
| committer | littleblack111 <littleblack11111@gmail.com> | 2025-10-21 22:05:04 +0800 |
| commit | 1d94e7ad83c939cf2094c4eefaea2231a68aeee8 (patch) | |
| tree | 89fdce76c121c63b510fa8825fe4c3f8e9bbc7cb /src | |
| parent | f396a01d7ba171e30e44084dc0d0a4f0a146956f (diff) | |
refactor: mutex logics
Diffstat (limited to 'src')
| -rw-r--r-- | src/blocks.rs | 1 | ||||
| -rw-r--r-- | src/main.rs | 19 | ||||
| -rw-r--r-- | src/network.rs | 136 |
3 files changed, 79 insertions, 77 deletions
diff --git a/src/blocks.rs b/src/blocks.rs index 65c0380..a66f220 100644 --- a/src/blocks.rs +++ b/src/blocks.rs @@ -49,6 +49,7 @@ impl Block { fn calc_pow(&self) -> u64 { for i in 0.. { // reset every loop + println!("{i}"); let mut hasher = Sha256::new(); Digest::update(&mut hasher, bincode::encode_to_vec((&self.prev_hash, &self.trans, i), bincode::config::standard()).unwrap()); let hashed = hasher.finalize(); diff --git a/src/main.rs b/src/main.rs index 9526d51..162f8de 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,6 +1,9 @@ use std::{io, sync::Arc}; -use bitcoin::{blocks::BlockChain, network::Network}; +use bitcoin::{ + blocks::BlockChain, + network::{Network, Request}, +}; use tokio::sync::Mutex; use crate::ui::Ui; @@ -19,13 +22,7 @@ async fn main() { net.start(); } - { - let mut net = network - .lock() - .await; - net.broadcast(bitcoin::network::Request::Ibd(None)) - .await; - } + Network::broadcast(network.clone(), Request::Ibd(None)).await; let (blockchain, me) = { let net = network @@ -50,11 +47,7 @@ async fn main() { .cmd(&cmd) .await { - let mut net = network - .lock() - .await; - net.broadcast(req) - .await; + Network::broadcast(network.clone(), req).await; } } } diff --git a/src/network.rs b/src/network.rs index 969d021..188c053 100644 --- a/src/network.rs +++ b/src/network.rs @@ -19,6 +19,7 @@ use crate::{ }; #[derive(Deserialize, Serialize, Clone)] +// Make possible to take borrowed so we dont need to clone everything pub enum Request { Block(Block), Ibd(Option<BlockChain>), @@ -71,17 +72,18 @@ impl Network { this } - async fn try_peer(&mut self) { - let peer = Arc::new(Mutex::new(Peer::new( - self.this - .clone(), - TcpStream::connect("192.168.1.16:6767") + async fn try_peer(this: Weak<Mutex<Self>>) { + let stream = TcpStream::connect("192.168.1.16:6767") + .await + .unwrap(); + let peer = Arc::new(Mutex::new(Peer::new(this.clone(), stream))); + if let Some(parent) = this.upgrade() { + parent + .lock() .await - .unwrap(), - ))); - self.peers - .push(Arc::clone(&peer)); - + .peers + .push(Arc::clone(&peer)); + } spawn(async move { peer.lock() .await @@ -130,14 +132,7 @@ impl Network { .this .clone(); spawn(async move { - if let Some(parent) = this.upgrade() { - let mut parent = parent - .lock() - .await; - parent - .try_peer() - .await; - } + Network::try_peer(this).await; }); self.get_idb() @@ -149,18 +144,21 @@ impl Network { .clone(); spawn(async move { if let Some(parent) = this.upgrade() { - let mut parent = parent - .lock() - .await; - parent - .broadcast(Request::Ibd(None)) - .await; + Network::broadcast(parent, Request::Ibd(None)).await; } }); } - pub async fn broadcast(&mut self, data: Request) { - for p in &self.peers { + pub async fn broadcast(this: Arc<Mutex<Self>>, data: Request) { + let peers: Vec<Arc<Mutex<Peer>>> = { + let guard = this + .lock() + .await; + guard + .peers + .clone() + }; + for p in peers { let sink = { let peer = p .lock() @@ -228,42 +226,57 @@ impl Peer { .is_some() { if !block.verify_pow() { - eprintln!("Rejecting remote block, POW verification failed"); // TODO: log remote IP + eprintln!("Rejecting remote block, POW verification failed"); return; } println!("Accepting and storing remote block: {:?}", block); - parent + let network = parent .upgrade() - .unwrap() - .lock() - .await - .blockchain - .lock() + .unwrap(); + let bc = { + network + .lock() + .await + .blockchain + .clone() + }; + bc.lock() .await .store(block) } else { block.calc_set_pow(); - let parent = parent + let network = parent .upgrade() .unwrap(); - let mut parent = parent - .lock() - .await; - parent - .broadcast(Request::Block(block)) - .await; + { + let self_bc = { + network + .lock() + .await + .blockchain + .clone() + }; + self_bc + .lock() + .await + .store(block.clone()); + } + Network::broadcast(network, Request::Block(block)).await; } } Request::Ibd(bc) => match bc { Some(bc) => { - let parent = parent + let network = parent .upgrade() .unwrap(); - let parent = parent - .lock() - .await; - let mut self_bc = parent - .blockchain + let self_bc = { + network + .lock() + .await + .blockchain + .clone() + }; + let mut self_bc = self_bc .lock() .await; if self_bc.is_empty() @@ -280,35 +293,30 @@ impl Peer { } })) { + println!("Setting IBD to {:?} from remote", bc); *self_bc = bc; - } else if *parent - .blockchain - .lock() - .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") + } else if *self_bc != bc { + eprintln!("Remote IBD broadcast did not match ours, {:?} vs. {:?}", bc, self_bc); } } None => { - let parent = parent + let network = parent .upgrade() .unwrap(); - let mut parent = parent - .lock() - .await; let bc = { - let guard = parent - .blockchain + let bc = { + network + .lock() + .await + .blockchain + .clone() + }; + let guard = bc .lock() .await; guard.clone() }; - parent - .broadcast(Request::Ibd(Some(bc))) - .await; + Network::broadcast(network, Request::Ibd(Some(bc))).await; } }, } |
