forked from Qortal/qortal
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).
This commit is contained in:
parent
a12ae8ad24
commit
4078f94caa
@ -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()));
|
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
|
// 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
|
// Save our request into requests map
|
||||||
Triple<String, Peer, Long> requestEntry = new Triple<>(signature58, null, NTP.getTime());
|
Triple<String, Peer, Long> requestEntry = new Triple<>(signature58, null, NTP.getTime());
|
||||||
@ -342,7 +345,7 @@ public class ArbitraryDataFileListManager {
|
|||||||
// This could be optimized in the future
|
// This could be optimized in the future
|
||||||
long timestamp = now - 60000L;
|
long timestamp = now - 60000L;
|
||||||
List<byte[]> hashes = null;
|
List<byte[]> 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
|
// Save our request into requests map
|
||||||
Triple<String, Peer, Long> requestEntry = new Triple<>(signature58, null, NTP.getTime());
|
Triple<String, Peer, Long> requestEntry = new Triple<>(signature58, null, NTP.getTime());
|
||||||
|
@ -2,8 +2,11 @@ package org.qortal.network.message;
|
|||||||
|
|
||||||
import com.google.common.primitives.Ints;
|
import com.google.common.primitives.Ints;
|
||||||
import com.google.common.primitives.Longs;
|
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.Transformer;
|
||||||
import org.qortal.transform.transaction.TransactionTransformer;
|
import org.qortal.transform.transaction.TransactionTransformer;
|
||||||
|
import org.qortal.utils.Serialization;
|
||||||
|
|
||||||
import java.io.ByteArrayOutputStream;
|
import java.io.ByteArrayOutputStream;
|
||||||
import java.io.IOException;
|
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 SIGNATURE_LENGTH = Transformer.SIGNATURE_LENGTH;
|
||||||
private static final int HASH_LENGTH = TransactionTransformer.SHA256_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 final byte[] signature;
|
||||||
private List<byte[]> hashes;
|
private List<byte[]> hashes;
|
||||||
private final long requestTime;
|
private final long requestTime;
|
||||||
private int requestHops;
|
private int requestHops;
|
||||||
|
private String requestingPeer;
|
||||||
|
|
||||||
public GetArbitraryDataFileListMessage(byte[] signature, List<byte[]> hashes, long requestTime, int requestHops) {
|
public GetArbitraryDataFileListMessage(byte[] signature, List<byte[]> hashes, long requestTime, int requestHops, String requestingPeer) {
|
||||||
this(-1, signature, hashes, requestTime, requestHops);
|
this(-1, signature, hashes, requestTime, requestHops, requestingPeer);
|
||||||
}
|
}
|
||||||
|
|
||||||
private GetArbitraryDataFileListMessage(int id, byte[] signature, List<byte[]> hashes, long requestTime, int requestHops) {
|
private GetArbitraryDataFileListMessage(int id, byte[] signature, List<byte[]> hashes, long requestTime, int requestHops, String requestingPeer) {
|
||||||
super(id, MessageType.GET_ARBITRARY_DATA_FILE_LIST);
|
super(id, MessageType.GET_ARBITRARY_DATA_FILE_LIST);
|
||||||
|
|
||||||
this.signature = signature;
|
this.signature = signature;
|
||||||
this.hashes = hashes;
|
this.hashes = hashes;
|
||||||
this.requestTime = requestTime;
|
this.requestTime = requestTime;
|
||||||
this.requestHops = requestHops;
|
this.requestHops = requestHops;
|
||||||
|
this.requestingPeer = requestingPeer;
|
||||||
}
|
}
|
||||||
|
|
||||||
public byte[] getSignature() {
|
public byte[] getSignature() {
|
||||||
@ -46,7 +52,7 @@ public class GetArbitraryDataFileListMessage extends Message {
|
|||||||
return this.hashes;
|
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];
|
byte[] signature = new byte[SIGNATURE_LENGTH];
|
||||||
|
|
||||||
bytes.get(signature);
|
bytes.get(signature);
|
||||||
@ -59,10 +65,6 @@ public class GetArbitraryDataFileListMessage extends Message {
|
|||||||
if (bytes.hasRemaining()) {
|
if (bytes.hasRemaining()) {
|
||||||
int hashCount = bytes.getInt();
|
int hashCount = bytes.getInt();
|
||||||
|
|
||||||
if (bytes.remaining() != hashCount * HASH_LENGTH) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
hashes = new ArrayList<>();
|
hashes = new ArrayList<>();
|
||||||
for (int i = 0; i < hashCount; ++i) {
|
for (int i = 0; i < hashCount; ++i) {
|
||||||
byte[] hash = new byte[HASH_LENGTH];
|
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
|
@Override
|
||||||
@ -93,6 +100,10 @@ public class GetArbitraryDataFileListMessage extends Message {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (this.requestingPeer != null) {
|
||||||
|
Serialization.serializeSizedStringV2(bytes, this.requestingPeer);
|
||||||
|
}
|
||||||
|
|
||||||
return bytes.toByteArray();
|
return bytes.toByteArray();
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
return null;
|
return null;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user