@ -655,6 +655,29 @@ public class Controller extends Thread {
return lastMisbehaved ! = null & & lastMisbehaved > NTP . getTime ( ) - MISBEHAVIOUR_COOLOFF ;
} ;
/** True if peer has unknown height, lower height or same height and same block signature (unless we don't have their block signature). */
public static Predicate < Peer > hasShorterBlockchain = peer - > {
BlockData highestBlockData = getInstance ( ) . getChainTip ( ) ;
int ourHeight = highestBlockData . getHeight ( ) ;
final PeerChainTipData peerChainTipData = peer . getChainTipData ( ) ;
// Ensure we have chain tip data for this peer
if ( peerChainTipData = = null )
return true ;
// Remove if peer is at a lower height than us
Integer peerHeight = peerChainTipData . getLastHeight ( ) ;
if ( peerHeight = = null | | peerHeight < ourHeight )
return true ;
// Don't remove if peer is on a greater height chain than us, or if we don't have their block signature
if ( peerHeight > ourHeight | | peerChainTipData . getLastBlockSignature ( ) = = null )
return false ;
// Remove if signatures match
return Arrays . equals ( peerChainTipData . getLastBlockSignature ( ) , highestBlockData . getSignature ( ) ) ;
} ;
public static final Predicate < Peer > hasNoRecentBlock = peer - > {
final Long minLatestBlockTimestamp = getMinimumLatestBlockTimestamp ( ) ;
final PeerChainTipData peerChainTipData = peer . getChainTipData ( ) ;