Disconnect peers on a fork
This commit is contained in:
parent
268c6d15c0
commit
a65a556239
@ -140,6 +140,8 @@ const HEADERS_TIMEOUT_SEC: f64 = 15f64;
|
|||||||
const BODIES_TIMEOUT_SEC: f64 = 10f64;
|
const BODIES_TIMEOUT_SEC: f64 = 10f64;
|
||||||
const FORK_HEADER_TIMEOUT_SEC: f64 = 3f64;
|
const FORK_HEADER_TIMEOUT_SEC: f64 = 3f64;
|
||||||
|
|
||||||
|
const MAX_REORG_BLOCKS: u64 = 64;
|
||||||
|
|
||||||
#[derive(Copy, Clone, Eq, PartialEq, Debug)]
|
#[derive(Copy, Clone, Eq, PartialEq, Debug)]
|
||||||
/// Sync state
|
/// Sync state
|
||||||
pub enum SyncState {
|
pub enum SyncState {
|
||||||
@ -567,6 +569,12 @@ impl ChainSync {
|
|||||||
trace!(target: "sync", "Received {} subchain heads, proceeding to download", headers.len());
|
trace!(target: "sync", "Received {} subchain heads, proceeding to download", headers.len());
|
||||||
self.blocks.reset_to(hashes);
|
self.blocks.reset_to(hashes);
|
||||||
self.state = SyncState::Blocks;
|
self.state = SyncState::Blocks;
|
||||||
|
} else {
|
||||||
|
let best = io.chain().chain_info().best_block_number;
|
||||||
|
if best > self.last_imported_block && best - self.last_imported_block > MAX_REORG_BLOCKS {
|
||||||
|
trace!(target: "sync", "No common block, disabling peer");
|
||||||
|
io.disable_peer(peer_id);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
SyncState::Blocks | SyncState::NewBlocks | SyncState::Waiting => {
|
SyncState::Blocks | SyncState::NewBlocks | SyncState::Waiting => {
|
||||||
|
@ -78,14 +78,14 @@ fn empty_blocks() {
|
|||||||
fn forked() {
|
fn forked() {
|
||||||
::env_logger::init().ok();
|
::env_logger::init().ok();
|
||||||
let mut net = TestNet::new(3);
|
let mut net = TestNet::new(3);
|
||||||
net.peer_mut(0).chain.add_blocks(300, EachBlockWith::Uncle);
|
net.peer_mut(0).chain.add_blocks(30, EachBlockWith::Uncle);
|
||||||
net.peer_mut(1).chain.add_blocks(300, EachBlockWith::Uncle);
|
net.peer_mut(1).chain.add_blocks(30, EachBlockWith::Uncle);
|
||||||
net.peer_mut(2).chain.add_blocks(300, EachBlockWith::Uncle);
|
net.peer_mut(2).chain.add_blocks(30, EachBlockWith::Uncle);
|
||||||
net.peer_mut(0).chain.add_blocks(100, EachBlockWith::Nothing); //fork
|
net.peer_mut(0).chain.add_blocks(10, EachBlockWith::Nothing); //fork
|
||||||
net.peer_mut(1).chain.add_blocks(200, EachBlockWith::Uncle);
|
net.peer_mut(1).chain.add_blocks(20, EachBlockWith::Uncle);
|
||||||
net.peer_mut(2).chain.add_blocks(200, EachBlockWith::Uncle);
|
net.peer_mut(2).chain.add_blocks(20, EachBlockWith::Uncle);
|
||||||
net.peer_mut(1).chain.add_blocks(100, EachBlockWith::Uncle); //fork between 1 and 2
|
net.peer_mut(1).chain.add_blocks(10, EachBlockWith::Uncle); //fork between 1 and 2
|
||||||
net.peer_mut(2).chain.add_blocks(10, EachBlockWith::Nothing);
|
net.peer_mut(2).chain.add_blocks(1, EachBlockWith::Nothing);
|
||||||
// peer 1 has the best chain of 601 blocks
|
// peer 1 has the best chain of 601 blocks
|
||||||
let peer1_chain = net.peer(1).chain.numbers.read().clone();
|
let peer1_chain = net.peer(1).chain.numbers.read().clone();
|
||||||
net.sync();
|
net.sync();
|
||||||
|
Loading…
Reference in New Issue
Block a user