From 4078f94caabbce6ec44fc0dddf126efc419d7f5a Mon Sep 17 00:00:00 2001 From: CalDescent Date: Wed, 9 Mar 2022 19:58:02 +0000 Subject: [PATCH] Modified GetArbitraryDataFileListMessage to allow requesting peer's address to be optionally included. This can ultimately be used to notify the serving peer to expect a direct connection from the requesting peer (to allow it to temporarily bypass maxConnections for long enough for the files to be retrieved). Or it could even possibly be used to trigger a reverse connection (from the serving peer to the requesting peer). --- .../ArbitraryDataFileListManager.java | 7 +++-- .../GetArbitraryDataFileListMessage.java | 29 +++++++++++++------ 2 files changed, 25 insertions(+), 11 deletions(-) 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;