diff --git a/src/main/java/org/qortal/controller/arbitrary/ArbitraryDataFileListManager.java b/src/main/java/org/qortal/controller/arbitrary/ArbitraryDataFileListManager.java index 36b3f8b6..5c07275c 100644 --- a/src/main/java/org/qortal/controller/arbitrary/ArbitraryDataFileListManager.java +++ b/src/main/java/org/qortal/controller/arbitrary/ArbitraryDataFileListManager.java @@ -283,8 +283,11 @@ public class ArbitraryDataFileListManager { LOGGER.debug(String.format("Sending data file list request for signature %s with %d hashes to %d peers...", signature58, hashCount, handshakedPeers.size())); + // FUTURE: send our address as requestingPeer once enough peers have switched to the new protocol + String requestingPeer = null; // Network.getInstance().getOurExternalIpAddressAndPort(); + // Build request - Message getArbitraryDataFileListMessage = new GetArbitraryDataFileListMessage(signature, missingHashes, now, 0); + Message getArbitraryDataFileListMessage = new GetArbitraryDataFileListMessage(signature, missingHashes, now, 0, requestingPeer); // Save our request into requests map Triple requestEntry = new Triple<>(signature58, null, NTP.getTime()); @@ -342,7 +345,7 @@ public class ArbitraryDataFileListManager { // This could be optimized in the future long timestamp = now - 60000L; List hashes = null; - Message getArbitraryDataFileListMessage = new GetArbitraryDataFileListMessage(signature, hashes, timestamp, 0); + Message getArbitraryDataFileListMessage = new GetArbitraryDataFileListMessage(signature, hashes, timestamp, 0, null); // Save our request into requests map Triple requestEntry = new Triple<>(signature58, null, NTP.getTime()); diff --git a/src/main/java/org/qortal/network/message/GetArbitraryDataFileListMessage.java b/src/main/java/org/qortal/network/message/GetArbitraryDataFileListMessage.java index af19eec1..dade8cac 100644 --- a/src/main/java/org/qortal/network/message/GetArbitraryDataFileListMessage.java +++ b/src/main/java/org/qortal/network/message/GetArbitraryDataFileListMessage.java @@ -2,8 +2,11 @@ package org.qortal.network.message; import com.google.common.primitives.Ints; import com.google.common.primitives.Longs; +import org.qortal.data.network.PeerData; +import org.qortal.transform.TransformationException; import org.qortal.transform.Transformer; import org.qortal.transform.transaction.TransactionTransformer; +import org.qortal.utils.Serialization; import java.io.ByteArrayOutputStream; import java.io.IOException; @@ -19,23 +22,26 @@ public class GetArbitraryDataFileListMessage extends Message { private static final int SIGNATURE_LENGTH = Transformer.SIGNATURE_LENGTH; private static final int HASH_LENGTH = TransactionTransformer.SHA256_LENGTH; + private static final int MAX_PEER_ADDRESS_LENGTH = PeerData.MAX_PEER_ADDRESS_SIZE; private final byte[] signature; private List hashes; private final long requestTime; private int requestHops; + private String requestingPeer; - public GetArbitraryDataFileListMessage(byte[] signature, List hashes, long requestTime, int requestHops) { - this(-1, signature, hashes, requestTime, requestHops); + public GetArbitraryDataFileListMessage(byte[] signature, List hashes, long requestTime, int requestHops, String requestingPeer) { + this(-1, signature, hashes, requestTime, requestHops, requestingPeer); } - private GetArbitraryDataFileListMessage(int id, byte[] signature, List hashes, long requestTime, int requestHops) { + private GetArbitraryDataFileListMessage(int id, byte[] signature, List hashes, long requestTime, int requestHops, String requestingPeer) { super(id, MessageType.GET_ARBITRARY_DATA_FILE_LIST); this.signature = signature; this.hashes = hashes; this.requestTime = requestTime; this.requestHops = requestHops; + this.requestingPeer = requestingPeer; } public byte[] getSignature() { @@ -46,7 +52,7 @@ public class GetArbitraryDataFileListMessage extends Message { return this.hashes; } - public static Message fromByteBuffer(int id, ByteBuffer bytes) throws UnsupportedEncodingException { + public static Message fromByteBuffer(int id, ByteBuffer bytes) throws UnsupportedEncodingException, TransformationException { byte[] signature = new byte[SIGNATURE_LENGTH]; bytes.get(signature); @@ -59,10 +65,6 @@ public class GetArbitraryDataFileListMessage extends Message { if (bytes.hasRemaining()) { int hashCount = bytes.getInt(); - if (bytes.remaining() != hashCount * HASH_LENGTH) { - return null; - } - hashes = new ArrayList<>(); for (int i = 0; i < hashCount; ++i) { byte[] hash = new byte[HASH_LENGTH]; @@ -71,7 +73,12 @@ public class GetArbitraryDataFileListMessage extends Message { } } - return new GetArbitraryDataFileListMessage(id, signature, hashes, requestTime, requestHops); + String requestingPeer = null; + if (bytes.hasRemaining()) { + requestingPeer = Serialization.deserializeSizedStringV2(bytes, MAX_PEER_ADDRESS_LENGTH); + } + + return new GetArbitraryDataFileListMessage(id, signature, hashes, requestTime, requestHops, requestingPeer); } @Override @@ -93,6 +100,10 @@ public class GetArbitraryDataFileListMessage extends Message { } } + if (this.requestingPeer != null) { + Serialization.serializeSizedStringV2(bytes, this.requestingPeer); + } + return bytes.toByteArray(); } catch (IOException e) { return null;