|
|
@ -531,76 +531,6 @@ public class ArbitraryDataManager extends Thread { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Handle incoming arbitrary signatures messages
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public void onNetworkArbitrarySignaturesMessage(Peer peer, Message message) { |
|
|
|
|
|
|
|
// Don't process if QDN is disabled
|
|
|
|
|
|
|
|
if (!Settings.getInstance().isQdnEnabled()) { |
|
|
|
|
|
|
|
return; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
LOGGER.debug("Received arbitrary signature list from peer {}", peer); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ArbitrarySignaturesMessage arbitrarySignaturesMessage = (ArbitrarySignaturesMessage) message; |
|
|
|
|
|
|
|
List<byte[]> signatures = arbitrarySignaturesMessage.getSignatures(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
String peerAddress = peer.getPeerData().getAddress().toString(); |
|
|
|
|
|
|
|
if (arbitrarySignaturesMessage.getPeerAddress() != null && !arbitrarySignaturesMessage.getPeerAddress().isEmpty()) { |
|
|
|
|
|
|
|
// This message is about a different peer than the one that sent it
|
|
|
|
|
|
|
|
peerAddress = arbitrarySignaturesMessage.getPeerAddress(); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
boolean containsNewEntry = false; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Synchronize peer data lookups to make this process thread safe. Otherwise we could broadcast
|
|
|
|
|
|
|
|
// the same data multiple times, due to more than one thread processing the same message from different peers
|
|
|
|
|
|
|
|
synchronized (this.peerDataLock) { |
|
|
|
|
|
|
|
try (final Repository repository = RepositoryManager.getRepository()) { |
|
|
|
|
|
|
|
for (byte[] signature : signatures) { |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Check if a record already exists for this hash/host combination
|
|
|
|
|
|
|
|
// The port is not checked here - only the host/ip - in order to avoid duplicates
|
|
|
|
|
|
|
|
// from filling up the db due to dynamic/ephemeral ports
|
|
|
|
|
|
|
|
ArbitraryPeerData existingEntry = repository.getArbitraryRepository() |
|
|
|
|
|
|
|
.getArbitraryPeerDataForSignatureAndHost(signature, peer.getPeerData().getAddress().getHost()); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (existingEntry == null) { |
|
|
|
|
|
|
|
// We haven't got a record of this mapping yet, so add it
|
|
|
|
|
|
|
|
ArbitraryPeerData arbitraryPeerData = new ArbitraryPeerData(signature, peerAddress); |
|
|
|
|
|
|
|
repository.discardChanges(); |
|
|
|
|
|
|
|
if (arbitraryPeerData.isPeerAddressValid()) { |
|
|
|
|
|
|
|
LOGGER.debug("Adding arbitrary peer: {} for signature {}", peerAddress, Base58.encode(signature)); |
|
|
|
|
|
|
|
repository.getArbitraryRepository().save(arbitraryPeerData); |
|
|
|
|
|
|
|
repository.saveChanges(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Remember that this data is new, so that it can be rebroadcast later
|
|
|
|
|
|
|
|
containsNewEntry = true; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// If at least one signature in this batch was new to us, we should rebroadcast the message to the
|
|
|
|
|
|
|
|
// network in case some peers haven't received it yet
|
|
|
|
|
|
|
|
if (containsNewEntry) { |
|
|
|
|
|
|
|
int requestHops = arbitrarySignaturesMessage.getRequestHops(); |
|
|
|
|
|
|
|
arbitrarySignaturesMessage.setRequestHops(++requestHops); |
|
|
|
|
|
|
|
if (requestHops < ARBITRARY_SIGNATURES_REQUEST_MAX_HOPS) { |
|
|
|
|
|
|
|
LOGGER.debug("Rebroadcasting arbitrary signature list for peer {}. requestHops: {}", peerAddress, requestHops); |
|
|
|
|
|
|
|
Network.getInstance().broadcast(broadcastPeer -> broadcastPeer == peer ? null : arbitrarySignaturesMessage); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} else { |
|
|
|
|
|
|
|
// Don't rebroadcast as otherwise we could get into a loop
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// If anything needed saving, it would already have called saveChanges() above
|
|
|
|
|
|
|
|
repository.discardChanges(); |
|
|
|
|
|
|
|
} catch (DataException e) { |
|
|
|
|
|
|
|
LOGGER.error(String.format("Repository issue while processing arbitrary transaction signature list from peer %s", peer), e); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public int getPowDifficulty() { |
|
|
|
public int getPowDifficulty() { |
|
|
|
return this.powDifficulty; |
|
|
|
return this.powDifficulty; |
|
|
|
} |
|
|
|
} |
|
|
|