Optimized new block processing. Added quick-ban for those, who send wrong blocks.

This commit is contained in:
Revertron
2021-04-17 01:51:14 +02:00
parent de61d17845
commit 47c398118a
4 changed files with 72 additions and 57 deletions
+4
View File
@@ -611,6 +611,10 @@ impl Chain {
/// Check if this block can be added to our blockchain /// Check if this block can be added to our blockchain
pub fn check_new_block(&self, block: &Block) -> BlockQuality { pub fn check_new_block(&self, block: &Block) -> BlockQuality {
if block.version > CHAIN_VERSION {
warn!("Ignoring block from unsupported version:\n{:?}", &block);
return Bad;
}
let timestamp = Utc::now().timestamp(); let timestamp = Utc::now().timestamp();
if block.timestamp > timestamp + 60 { if block.timestamp > timestamp + 60 {
warn!("Ignoring block from the future:\n{:?}", &block); warn!("Ignoring block from the future:\n{:?}", &block);
+10 -8
View File
@@ -357,7 +357,6 @@ fn handle_message(context: Arc<Mutex<Context>>, message: Message, peers: &mut Pe
}; };
let answer = match message { let answer = match message {
Message::Hand { app_version, origin, version, public, rand} => { Message::Hand { app_version, origin, version, public, rand} => {
debug!("Hello from v{}", &app_version);
if peers.is_our_own_connect(&rand) { if peers.is_our_own_connect(&rand) {
warn!("Detected loop connect"); warn!("Detected loop connect");
State::Banned State::Banned
@@ -365,6 +364,7 @@ fn handle_message(context: Arc<Mutex<Context>>, message: Message, peers: &mut Pe
if origin.eq(my_origin) && version == my_version { if origin.eq(my_origin) && version == my_version {
let peer = peers.get_mut_peer(token).unwrap(); let peer = peers.get_mut_peer(token).unwrap();
peer.set_public(public); peer.set_public(public);
debug!("Hello from v{} on {}", &app_version, peer.get_addr().ip());
State::message(Message::shake(&origin, version, true, my_height)) State::message(Message::shake(&origin, version, true, my_height))
} else { } else {
warn!("Handshake from unsupported chain or version"); warn!("Handshake from unsupported chain or version");
@@ -453,6 +453,13 @@ fn handle_message(context: Arc<Mutex<Context>>, message: Message, peers: &mut Pe
Ok(block) => block, Ok(block) => block,
Err(_) => return State::Error Err(_) => return State::Error
}; };
process_new_block(context, peers, token, block)
}
};
answer
}
fn process_new_block(context: Arc<Mutex<Context>>, peers: &mut Peers, token: &Token, block: Block) -> State {
let peer = peers.get_mut_peer(token).unwrap(); let peer = peers.get_mut_peer(token).unwrap();
peer.set_received_block(block.index); peer.set_received_block(block.index);
if let Some(transaction) = &block.transaction { if let Some(transaction) = &block.transaction {
@@ -461,9 +468,7 @@ fn handle_message(context: Arc<Mutex<Context>>, message: Message, peers: &mut Pe
return State::Banned; return State::Banned;
} }
} }
let context = Arc::clone(&context);
let peers_count = peers.get_peers_active_count(); let peers_count = peers.get_peers_active_count();
let _ = thread::Builder::new().name(String::from("Message::Block")).spawn(move || {
let mut context = context.lock().unwrap(); let mut context = context.lock().unwrap();
let max_height = context.chain.max_height(); let max_height = context.chain.max_height();
match context.chain.check_new_block(&block) { match context.chain.check_new_block(&block) {
@@ -477,7 +482,7 @@ fn handle_message(context: Arc<Mutex<Context>>, message: Message, peers: &mut Pe
if my_height == max_height { if my_height == max_height {
context.bus.post(crate::event::Event::SyncFinished); context.bus.post(crate::event::Event::SyncFinished);
} else { } else {
context.bus.post(crate::event::Event::Syncing { have: my_height, height: max_height}); context.bus.post(crate::event::Event::Syncing { have: my_height, height: max_height });
} }
context.bus.post(crate::event::Event::NetworkStatus { nodes: peers_count, blocks: my_height }); context.bus.post(crate::event::Event::NetworkStatus { nodes: peers_count, blocks: my_height });
} }
@@ -489,6 +494,7 @@ fn handle_message(context: Arc<Mutex<Context>>, message: Message, peers: &mut Pe
let height = context.chain.height(); let height = context.chain.height();
context.chain.update_max_height(height); context.chain.update_max_height(height);
context.bus.post(crate::event::Event::SyncFinished); context.bus.post(crate::event::Event::SyncFinished);
return State::Banned;
} }
BlockQuality::Fork => { BlockQuality::Fork => {
debug!("Got forked block {} with hash {:?}", block.index, block.hash); debug!("Got forked block {} with hash {:?}", block.index, block.hash);
@@ -505,11 +511,7 @@ fn handle_message(context: Arc<Mutex<Context>>, message: Message, peers: &mut Pe
context.bus.post(crate::event::Event::SyncFinished); context.bus.post(crate::event::Event::SyncFinished);
} }
} }
});
State::idle() State::idle()
}
};
answer
} }
#[allow(dead_code)] #[allow(dead_code)]
+10 -1
View File
@@ -79,7 +79,16 @@ impl Peer {
} }
pub fn has_more_blocks(&self, height: u64) -> bool { pub fn has_more_blocks(&self, height: u64) -> bool {
self.height > self.received_block && self.height > height && self.get_state().is_idle() if self.height <= height {
return false;
}
if self.received_block > height {
return false;
}
if !self.get_state().is_idle() {
return false;
}
self.height > height
} }
pub fn is_public(&self) -> bool { pub fn is_public(&self) -> bool {
+1 -1
View File
@@ -239,7 +239,7 @@ impl Peers {
.choose(&mut rng) { .choose(&mut rng) {
None => {} None => {}
Some((token, peer)) => { Some((token, peer)) => {
debug!("Found some peer higher than we are, requesting block {}", height + 1); debug!("Found some peer higher than we are, requesting block {}, from {}", height + 1, &peer.get_addr().ip());
registry.reregister(peer.get_stream(), token.clone(), Interest::WRITABLE).unwrap(); registry.reregister(peer.get_stream(), token.clone(), Interest::WRITABLE).unwrap();
peer.set_state(State::message(Message::GetBlock { index: height + 1 })); peer.set_state(State::message(Message::GetBlock { index: height + 1 }));
ping_sent = true; ping_sent = true;