diff --git a/src/main/java/org/qortal/controller/Controller.java b/src/main/java/org/qortal/controller/Controller.java index 0a323cb2..182889f5 100644 --- a/src/main/java/org/qortal/controller/Controller.java +++ b/src/main/java/org/qortal/controller/Controller.java @@ -752,6 +752,19 @@ public class Controller extends Thread { return peerChainTipData == null || peerChainTipData.getSignature() == null || inferiorChainTips.contains(ByteArray.wrap(peerChainTipData.getSignature())); }; + /** + * If a peer has a recent block timestamp, but its height is more than 25 blocks behind ours, + * we can assume it has a significantly inferior chain, and is most likely too divergent. + * Early filtering of these peers prevents a lot of very expensive chain weight comparisons. + */ + public static final Predicate hasInferiorChain = peer -> { + final Long minLatestBlockTimestamp = getMinimumLatestBlockTimestamp(); + final int ourHeight = Controller.getInstance().getChainHeight(); + final BlockSummaryData peerChainTipData = peer.getChainTipData(); + boolean peerUpToDate = peerChainTipData != null && peerChainTipData.getTimestamp() != null && peerChainTipData.getTimestamp() >= minLatestBlockTimestamp; + return peerUpToDate && ourHeight - peerChainTipData.getHeight() > 25; + }; + public static final Predicate hasOldVersion = peer -> { final String minPeerVersion = Settings.getInstance().getMinPeerVersion(); return peer.isAtLeastVersion(minPeerVersion) == false; diff --git a/src/main/java/org/qortal/controller/Synchronizer.java b/src/main/java/org/qortal/controller/Synchronizer.java index e3ace9ed..54b13580 100644 --- a/src/main/java/org/qortal/controller/Synchronizer.java +++ b/src/main/java/org/qortal/controller/Synchronizer.java @@ -247,6 +247,9 @@ public class Synchronizer extends Thread { // Disregard peers that are on the same block as last sync attempt and we didn't like their chain peers.removeIf(Controller.hasInferiorChainTip); + // Disregard peers that are on a very inferior chain, based on their heights and timestamps + peers.removeIf(Controller.hasInferiorChain); + // Disregard peers that have a block with an invalid signer peers.removeIf(Controller.hasInvalidSigner);