forked from Qortal/qortal
Reorder handshake to increase compat with v1 nodes + request remote peers
This commit is contained in:
parent
bf3f78e718
commit
43eec116b5
@ -28,6 +28,7 @@ import org.qora.network.Network;
|
|||||||
import org.qora.network.Peer;
|
import org.qora.network.Peer;
|
||||||
import org.qora.network.message.BlockMessage;
|
import org.qora.network.message.BlockMessage;
|
||||||
import org.qora.network.message.GetBlockMessage;
|
import org.qora.network.message.GetBlockMessage;
|
||||||
|
import org.qora.network.message.GetPeersMessage;
|
||||||
import org.qora.network.message.GetSignaturesMessage;
|
import org.qora.network.message.GetSignaturesMessage;
|
||||||
import org.qora.network.message.HeightMessage;
|
import org.qora.network.message.HeightMessage;
|
||||||
import org.qora.network.message.Message;
|
import org.qora.network.message.Message;
|
||||||
@ -317,6 +318,9 @@ public class Controller extends Thread {
|
|||||||
|
|
||||||
// Send our current height
|
// Send our current height
|
||||||
network.broadcast(peer -> new HeightMessage(this.getChainHeight()));
|
network.broadcast(peer -> new HeightMessage(this.getChainHeight()));
|
||||||
|
|
||||||
|
// Request peers lists
|
||||||
|
network.broadcast(peer -> new GetPeersMessage());
|
||||||
}
|
}
|
||||||
|
|
||||||
public void onGeneratedBlock(BlockData newBlockData) {
|
public void onGeneratedBlock(BlockData newBlockData) {
|
||||||
|
@ -15,23 +15,11 @@ public enum Handshake {
|
|||||||
STARTED(null) {
|
STARTED(null) {
|
||||||
@Override
|
@Override
|
||||||
public Handshake onMessage(Peer peer, Message message) {
|
public Handshake onMessage(Peer peer, Message message) {
|
||||||
return VERSION;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void action(Peer peer) {
|
|
||||||
}
|
|
||||||
},
|
|
||||||
VERSION(MessageType.VERSION) {
|
|
||||||
@Override
|
|
||||||
public Handshake onMessage(Peer peer, Message message) {
|
|
||||||
peer.setVersionMessage((VersionMessage) message);
|
|
||||||
return SELF_CHECK;
|
return SELF_CHECK;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void action(Peer peer) {
|
public void action(Peer peer) {
|
||||||
sendVersion(peer);
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
SELF_CHECK(MessageType.PEER_ID) {
|
SELF_CHECK(MessageType.PEER_ID) {
|
||||||
@ -63,6 +51,19 @@ public enum Handshake {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return VERSION;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void action(Peer peer) {
|
||||||
|
sendMyId(peer);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
VERSION(MessageType.VERSION) {
|
||||||
|
@Override
|
||||||
|
public Handshake onMessage(Peer peer, Message message) {
|
||||||
|
peer.setVersionMessage((VersionMessage) message);
|
||||||
|
|
||||||
// If we're both version 2 peers then next stage is proof
|
// If we're both version 2 peers then next stage is proof
|
||||||
if (peer.getVersion() >= 2)
|
if (peer.getVersion() >= 2)
|
||||||
return PROOF;
|
return PROOF;
|
||||||
@ -73,7 +74,7 @@ public enum Handshake {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void action(Peer peer) {
|
public void action(Peer peer) {
|
||||||
sendMyId(peer);
|
sendVersion(peer);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
PROOF(MessageType.PROOF) {
|
PROOF(MessageType.PROOF) {
|
||||||
|
@ -27,8 +27,10 @@ import org.apache.logging.log4j.Logger;
|
|||||||
import org.qora.controller.Controller;
|
import org.qora.controller.Controller;
|
||||||
import org.qora.data.network.PeerData;
|
import org.qora.data.network.PeerData;
|
||||||
import org.qora.data.transaction.TransactionData;
|
import org.qora.data.transaction.TransactionData;
|
||||||
|
import org.qora.network.message.GetPeersMessage;
|
||||||
import org.qora.network.message.HeightMessage;
|
import org.qora.network.message.HeightMessage;
|
||||||
import org.qora.network.message.Message;
|
import org.qora.network.message.Message;
|
||||||
|
import org.qora.network.message.Message.MessageType;
|
||||||
import org.qora.network.message.PeersMessage;
|
import org.qora.network.message.PeersMessage;
|
||||||
import org.qora.network.message.PeersV2Message;
|
import org.qora.network.message.PeersV2Message;
|
||||||
import org.qora.network.message.PingMessage;
|
import org.qora.network.message.PingMessage;
|
||||||
@ -306,6 +308,10 @@ public class Network extends Thread {
|
|||||||
|
|
||||||
// Check message type is as expected
|
// Check message type is as expected
|
||||||
if (handshakeStatus.expectedMessageType != null && message.getType() != handshakeStatus.expectedMessageType) {
|
if (handshakeStatus.expectedMessageType != null && message.getType() != handshakeStatus.expectedMessageType) {
|
||||||
|
// v1 nodes are keen on sending PINGs early. Discard as we'll send a PING right after handshake
|
||||||
|
if (message.getType() == MessageType.PING)
|
||||||
|
return;
|
||||||
|
|
||||||
LOGGER.debug(String.format("Unexpected %s message from %s, expected %s", message.getType().name(), peer, handshakeStatus.expectedMessageType));
|
LOGGER.debug(String.format("Unexpected %s message from %s, expected %s", message.getType().name(), peer, handshakeStatus.expectedMessageType));
|
||||||
peer.disconnect();
|
peer.disconnect();
|
||||||
return;
|
return;
|
||||||
@ -429,6 +435,11 @@ public class Network extends Thread {
|
|||||||
} catch (DataException e) {
|
} catch (DataException e) {
|
||||||
LOGGER.error("Repository issue while sending unconfirmed transactions", e);
|
LOGGER.error("Repository issue while sending unconfirmed transactions", e);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Request their peers list
|
||||||
|
Message getPeersMessage = new GetPeersMessage();
|
||||||
|
if (!peer.sendMessage(getPeersMessage))
|
||||||
|
peer.disconnect();
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Returns PEERS message made from peers we've connected to recently, and this node's details */
|
/** Returns PEERS message made from peers we've connected to recently, and this node's details */
|
||||||
|
25
src/main/java/org/qora/network/message/GetPeersMessage.java
Normal file
25
src/main/java/org/qora/network/message/GetPeersMessage.java
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
package org.qora.network.message;
|
||||||
|
|
||||||
|
import java.io.UnsupportedEncodingException;
|
||||||
|
import java.nio.ByteBuffer;
|
||||||
|
|
||||||
|
public class GetPeersMessage extends Message {
|
||||||
|
|
||||||
|
public GetPeersMessage() {
|
||||||
|
this(-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
private GetPeersMessage(int id) {
|
||||||
|
super(id, MessageType.GET_PEERS);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Message fromByteBuffer(int id, ByteBuffer bytes) throws UnsupportedEncodingException {
|
||||||
|
return new GetPeersMessage(id);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected byte[] toData() {
|
||||||
|
return new byte[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user