Invalid signatures are now stored as ByteArray instead of String, to avoid regular Base58 encoding and decoding, which is very inefficient.

This commit is contained in:
CalDescent 2022-06-25 13:29:53 +01:00
parent a2568936a0
commit a93bae616e
2 changed files with 10 additions and 14 deletions

View File

@ -724,7 +724,7 @@ public class Controller extends Thread {
public static final Predicate<Peer> hasInvalidBlock = peer -> { public static final Predicate<Peer> hasInvalidBlock = peer -> {
final PeerChainTipData peerChainTipData = peer.getChainTipData(); final PeerChainTipData peerChainTipData = peer.getChainTipData();
Map<String, Long> invalidBlockSignatures = Synchronizer.getInstance().getInvalidBlockSignatures(); Map<ByteArray, Long> invalidBlockSignatures = Synchronizer.getInstance().getInvalidBlockSignatures();
List<byte[]> peerSignatures = new ArrayList<>(); List<byte[]> peerSignatures = new ArrayList<>();
// Add peer's latest block signature // Add peer's latest block signature
@ -748,10 +748,9 @@ public class Controller extends Thread {
} }
// 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 (String invalidSignature58 : invalidBlockSignatures.keySet()) { for (ByteArray invalidSignature : invalidBlockSignatures.keySet()) {
byte[] invalidSignature = Base58.decode(invalidSignature58);
for (byte[] peerSignature : peerSignatures) { for (byte[] peerSignature : peerSignatures) {
if (Arrays.equals(peerSignature, invalidSignature)) { if (Arrays.equals(peerSignature, invalidSignature.value)) {
return true; return true;
} }
} }

View File

@ -81,7 +81,7 @@ public class Synchronizer extends Thread {
private boolean syncRequestPending = false; private boolean syncRequestPending = false;
// Keep track of invalid blocks so that we don't keep trying to sync them // Keep track of invalid blocks so that we don't keep trying to sync them
private Map<String, Long> invalidBlockSignatures = Collections.synchronizedMap(new HashMap<>()); private Map<ByteArray, Long> invalidBlockSignatures = Collections.synchronizedMap(new HashMap<>());
public Long timeValidBlockLastReceived = null; public Long timeValidBlockLastReceived = null;
public Long timeInvalidBlockLastReceived = null; public Long timeInvalidBlockLastReceived = null;
@ -844,7 +844,7 @@ public class Synchronizer extends Thread {
/* Invalid block signature tracking */ /* Invalid block signature tracking */
public Map<String, Long> getInvalidBlockSignatures() { public Map<ByteArray, Long> getInvalidBlockSignatures() {
return this.invalidBlockSignatures; return this.invalidBlockSignatures;
} }
@ -855,8 +855,7 @@ public class Synchronizer extends Thread {
} }
// Add or update existing entry // Add or update existing entry
String sig58 = Base58.encode(signature); invalidBlockSignatures.put(ByteArray.wrap(signature), now);
invalidBlockSignatures.put(sig58, now);
} }
private void deleteOlderInvalidSignatures(Long now) { private void deleteOlderInvalidSignatures(Long now) {
if (now == null) { if (now == null) {
@ -881,11 +880,10 @@ public class Synchronizer extends Thread {
} }
// 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 (String invalidSignature58 : invalidBlockSignatures.keySet()) { for (ByteArray invalidSignature : invalidBlockSignatures.keySet()) {
byte[] invalidSignature = Base58.decode(invalidSignature58);
for (BlockSummaryData blockSummary : blockSummaries) { for (BlockSummaryData blockSummary : blockSummaries) {
byte[] signature = blockSummary.getSignature(); byte[] signature = blockSummary.getSignature();
if (Arrays.equals(signature, invalidSignature)) { if (Arrays.equals(signature, invalidSignature.value)) {
return true; return true;
} }
} }
@ -898,10 +896,9 @@ public class Synchronizer extends Thread {
} }
// Loop through our known invalid blocks and check each one against supplied block signatures // Loop through our known invalid blocks and check each one against supplied block signatures
for (String invalidSignature58 : invalidBlockSignatures.keySet()) { for (ByteArray invalidSignature : invalidBlockSignatures.keySet()) {
byte[] invalidSignature = Base58.decode(invalidSignature58);
for (byte[] signature : blockSignatures) { for (byte[] signature : blockSignatures) {
if (Arrays.equals(signature, invalidSignature)) { if (Arrays.equals(signature, invalidSignature.value)) {
return true; return true;
} }
} }