|
|
@ -723,39 +723,41 @@ public class Controller extends Thread { |
|
|
|
}; |
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
public static final Predicate<Peer> hasInvalidBlock = peer -> { |
|
|
|
public static final Predicate<Peer> hasInvalidBlock = peer -> { |
|
|
|
final PeerChainTipData peerChainTipData = peer.getChainTipData(); |
|
|
|
synchronized (peer.peerInfoLock) { |
|
|
|
Map<ByteArray, Long> invalidBlockSignatures = Synchronizer.getInstance().getInvalidBlockSignatures(); |
|
|
|
final PeerChainTipData peerChainTipData = peer.getChainTipData(); |
|
|
|
List<byte[]> peerSignatures = new ArrayList<>(); |
|
|
|
Map<ByteArray, Long> invalidBlockSignatures = Synchronizer.getInstance().getInvalidBlockSignatures(); |
|
|
|
|
|
|
|
List<byte[]> peerSignatures = new ArrayList<>(); |
|
|
|
|
|
|
|
|
|
|
|
// Add peer's latest block signature
|
|
|
|
// Add peer's latest block signature
|
|
|
|
if (peerChainTipData != null) { |
|
|
|
if (peerChainTipData != null) { |
|
|
|
peerSignatures.add(peerChainTipData.getLastBlockSignature()); |
|
|
|
peerSignatures.add(peerChainTipData.getLastBlockSignature()); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// Add peer's blocks since common block
|
|
|
|
// Add peer's blocks since common block
|
|
|
|
if (peer.getCommonBlockData() != null) { |
|
|
|
if (peer.getCommonBlockData() != null) { |
|
|
|
List<BlockSummaryData> peerSummaries = peer.getCommonBlockData().getBlockSummariesAfterCommonBlock(); |
|
|
|
List<BlockSummaryData> peerSummaries = peer.getCommonBlockData().getBlockSummariesAfterCommonBlock(); |
|
|
|
if (peerSummaries != null) { |
|
|
|
if (peerSummaries != null) { |
|
|
|
for (BlockSummaryData blockSummaryData : peerSummaries) { |
|
|
|
for (BlockSummaryData blockSummaryData : peerSummaries) { |
|
|
|
peerSignatures.add(blockSummaryData.getSignature()); |
|
|
|
peerSignatures.add(blockSummaryData.getSignature()); |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Shortcut if no data
|
|
|
|
// Shortcut if no data
|
|
|
|
if (peerSignatures.isEmpty() || invalidBlockSignatures == null || invalidBlockSignatures.isEmpty()) { |
|
|
|
if (peerSignatures.isEmpty() || invalidBlockSignatures == null || invalidBlockSignatures.isEmpty()) { |
|
|
|
return false; |
|
|
|
return false; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// Loop through our known invalid blocks and check each one against supplied block summaries
|
|
|
|
// Loop through our known invalid blocks and check each one against supplied block summaries
|
|
|
|
for (ByteArray invalidSignature : invalidBlockSignatures.keySet()) { |
|
|
|
for (ByteArray invalidSignature : invalidBlockSignatures.keySet()) { |
|
|
|
for (byte[] peerSignature : peerSignatures) { |
|
|
|
for (byte[] peerSignature : peerSignatures) { |
|
|
|
if (Arrays.equals(peerSignature, invalidSignature.value)) { |
|
|
|
if (Arrays.equals(peerSignature, invalidSignature.value)) { |
|
|
|
return true; |
|
|
|
return true; |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
return false; |
|
|
|
} |
|
|
|
} |
|
|
|
return false; |
|
|
|
|
|
|
|
}; |
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
public static final Predicate<Peer> hasNoRecentBlock = peer -> { |
|
|
|
public static final Predicate<Peer> hasNoRecentBlock = peer -> { |
|
|
|