diff --git a/src/main/java/org/qortal/controller/arbitrary/ArbitraryDataFileListManager.java b/src/main/java/org/qortal/controller/arbitrary/ArbitraryDataFileListManager.java index 21e1c106..a10dd847 100644 --- a/src/main/java/org/qortal/controller/arbitrary/ArbitraryDataFileListManager.java +++ b/src/main/java/org/qortal/controller/arbitrary/ArbitraryDataFileListManager.java @@ -29,6 +29,7 @@ public class ArbitraryDataFileListManager { private static ArbitraryDataFileListManager instance; + private static String MIN_PEER_VERSION_FOR_FILE_LIST_STATS = "3.2.0"; /** * Map of recent incoming requests for ARBITRARY transaction data file lists. @@ -488,6 +489,12 @@ public class ArbitraryDataFileListManager { arbitraryDataFileListMessage.setRequestHops(++requestHops); } + // Remove optional parameters if the requesting peer doesn't support it yet + // A message with less statistical data is better than no message at all + if (!requestingPeer.isAtLeastVersion(MIN_PEER_VERSION_FOR_FILE_LIST_STATS)) { + arbitraryDataFileListMessage.removeOptionalStats(); + } + // Forward to requesting peer LOGGER.debug("Forwarding file list with {} hashes to requesting peer: {}", hashes.size(), requestingPeer); if (!requestingPeer.sendMessage(arbitraryDataFileListMessage)) { @@ -594,6 +601,13 @@ public class ArbitraryDataFileListManager { ArbitraryDataFileListMessage arbitraryDataFileListMessage = new ArbitraryDataFileListMessage(signature, hashes, NTP.getTime(), 0, ourAddress, true); arbitraryDataFileListMessage.setId(message.getId()); + + // Remove optional parameters if the requesting peer doesn't support it yet + // A message with less statistical data is better than no message at all + if (!peer.isAtLeastVersion(MIN_PEER_VERSION_FOR_FILE_LIST_STATS)) { + arbitraryDataFileListMessage.removeOptionalStats(); + } + if (!peer.sendMessage(arbitraryDataFileListMessage)) { LOGGER.debug("Couldn't send list of hashes"); peer.disconnect("failed to send list of hashes"); diff --git a/src/main/java/org/qortal/network/message/ArbitraryDataFileListMessage.java b/src/main/java/org/qortal/network/message/ArbitraryDataFileListMessage.java index 3eef284f..32ba3fa7 100644 --- a/src/main/java/org/qortal/network/message/ArbitraryDataFileListMessage.java +++ b/src/main/java/org/qortal/network/message/ArbitraryDataFileListMessage.java @@ -22,10 +22,10 @@ public class ArbitraryDataFileListMessage extends Message { private final byte[] signature; private final List hashes; - private final Long requestTime; + private Long requestTime; private Integer requestHops; - private final String peerAddress; - private final boolean isRelayPossible; + private String peerAddress; + private Boolean isRelayPossible; public ArbitraryDataFileListMessage(byte[] signature, List hashes, Long requestTime, @@ -109,7 +109,7 @@ public class ArbitraryDataFileListMessage extends Message { bytes.write(hash); } - if (this.requestTime == null) { // Just in case + if (this.requestTime == null) { // To maintain backwards support return bytes.toByteArray(); } @@ -136,15 +136,26 @@ public class ArbitraryDataFileListMessage extends Message { return clone; } + public void removeOptionalStats() { + this.requestTime = null; + this.requestHops = null; + this.peerAddress = null; + this.isRelayPossible = null; + } + public Long getRequestTime() { return this.requestTime; } + public void setRequestTime(Long requestTime) { + this.requestTime = requestTime; + } + public Integer getRequestHops() { return this.requestHops; } - public void setRequestHops(int requestHops) { + public void setRequestHops(Integer requestHops) { this.requestHops = requestHops; } @@ -152,8 +163,16 @@ public class ArbitraryDataFileListMessage extends Message { return this.peerAddress; } - public boolean isRelayPossible() { + public void setPeerAddress(String peerAddress) { + this.peerAddress = peerAddress; + } + + public Boolean isRelayPossible() { return this.isRelayPossible; } + public void setIsRelayPossible(Boolean isRelayPossible) { + this.isRelayPossible = isRelayPossible; + } + }