diff --git a/beacon_node/network/src/sync/manager.rs b/beacon_node/network/src/sync/manager.rs index e5c035b7f0..0029d6ed0a 100644 --- a/beacon_node/network/src/sync/manager.rs +++ b/beacon_node/network/src/sync/manager.rs @@ -260,11 +260,19 @@ impl SyncManager { "local_finalized_epoch" => local_peer_info.finalized_epoch, ); - // if we don't know about the peer's chain add it to the range sync, otherwise - // consider it synced (it can be the case that the peer seems ahead of us, but we - // reject its chain). + // There are few cases to handle here: + // + // - A peer could appear advanced if our fork choice has rejected their version of + // the chain. If we know of their head slot, we consider this peer fully synced. + // - A peer could have just advanced to the next epoch and have a new finalized + // epoch that is currently ahead of ours. If their finalized epoch is ahead of ours + // by one and their head_slot is within the slot tolerance, consider this peer + // fully synced. - if self.chain.fork_choice.contains_block(&remote.head_root) { + if (self.chain.fork_choice.contains_block(&remote.head_root)) || // the first case + (remote.finalized_epoch.sub(local_peer_info.finalized_epoch) == 1 && remote.head_slot.sub(local_peer_info.head_slot) < SLOT_IMPORT_TOLERANCE as u64) + // the second case + { self.synced_peer(&peer_id, remote); // notify the range sync that a peer has been added self.range_sync.fully_synced_peer_found(); @@ -544,7 +552,7 @@ impl SyncManager { self.update_sync_state(); } - /// Updates the syncing state of a peer to be behind. + /// Updates the syncing state of a peer to be advanced. fn advanced_peer(&mut self, peer_id: &PeerId, sync_info: PeerSyncInfo) { if let Some(peer_info) = self.network_globals.peers.write().peer_info_mut(peer_id) { let head_slot = sync_info.head_slot; diff --git a/beacon_node/network/src/sync/peer_sync_info.rs b/beacon_node/network/src/sync/peer_sync_info.rs index 78d91282a5..2897b04476 100644 --- a/beacon_node/network/src/sync/peer_sync_info.rs +++ b/beacon_node/network/src/sync/peer_sync_info.rs @@ -21,7 +21,7 @@ pub struct PeerSyncInfo { pub enum PeerSyncType { /// The peer is on our chain and is fully synced with respect to our chain. FullySynced, - /// The peer has a greater knowledge of the chain that us that warrants a full sync. + /// The peer has a greater knowledge of the chain than us that warrants a full sync. Advanced, /// A peer is behind in the sync and not useful to us for downloading blocks. Behind, @@ -56,8 +56,8 @@ impl PeerSyncInfo { Some(Self::from(status_message(chain)?)) } - /// Given another peer's `PeerSyncInfo` this will determine how useful that peer is for us in - /// regards to syncing. This returns the peer sync type that can then be handled by the + /// Given another peer's `PeerSyncInfo` this will determine how useful that peer is to us in + /// regards to syncing. This returns the peer sync type that can then be handled by the /// `SyncManager`. pub fn peer_sync_type(&self, remote_peer_sync_info: &PeerSyncInfo) -> PeerSyncType { // check if the peer is fully synced with our current chain