Use Command enum for Protocol
This commit is contained in:
parent
1f55856067
commit
2c1c17f8f1
|
@ -63,8 +63,8 @@ public class ConnectionConsole extends JFrame implements PeerListener{
|
||||||
|
|
||||||
Thread t = new Thread() {
|
Thread t = new Thread() {
|
||||||
public void run() {
|
public void run() {
|
||||||
new ClientPeer(thisConsole).connect("54.204.10.41", 30303);
|
// new ClientPeer(thisConsole).connect("54.204.10.41", 30303);
|
||||||
// new ClientPeer(thisConsole).connect("54.201.28.117", 30303);
|
new ClientPeer(thisConsole).connect("54.201.28.117", 30303);
|
||||||
// new ClientPeer(thisConsole).connect("82.217.72.169", 30303);
|
// new ClientPeer(thisConsole).connect("82.217.72.169", 30303);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
@ -0,0 +1,40 @@
|
||||||
|
package org.ethereum.net;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
public enum Command {
|
||||||
|
|
||||||
|
HELLO(0x00),
|
||||||
|
DISCONNECT(0x01),
|
||||||
|
PING(0x02),
|
||||||
|
PONG(0x03),
|
||||||
|
GET_PEERS(0x10),
|
||||||
|
PEERS(0x11),
|
||||||
|
TRANSACTIONS(0x12),
|
||||||
|
BLOCKS(0x13),
|
||||||
|
GET_CHAIN(0x14),
|
||||||
|
NOT_IN_CHAIN(0x15),
|
||||||
|
GET_TRANSACTIONS(0x16),
|
||||||
|
UNKNOWN(0xFF);
|
||||||
|
|
||||||
|
private int cmd;
|
||||||
|
|
||||||
|
private static final Map<Integer, Command> intToTypeMap = new HashMap<Integer, Command>();
|
||||||
|
static {
|
||||||
|
for (Command type : Command.values()) {
|
||||||
|
intToTypeMap.put(type.cmd, type);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private Command(int cmd) {
|
||||||
|
this.cmd = cmd;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Command fromInt(int i) {
|
||||||
|
Command type = intToTypeMap.get(Integer.valueOf(i));
|
||||||
|
if (type == null)
|
||||||
|
return Command.UNKNOWN;
|
||||||
|
return type;
|
||||||
|
}
|
||||||
|
}
|
|
@ -6,9 +6,11 @@ import io.netty.channel.ChannelHandlerContext;
|
||||||
import io.netty.channel.ChannelInboundHandlerAdapter;
|
import io.netty.channel.ChannelInboundHandlerAdapter;
|
||||||
import io.netty.channel.ChannelOption;
|
import io.netty.channel.ChannelOption;
|
||||||
import io.netty.channel.FixedRecvByteBufAllocator;
|
import io.netty.channel.FixedRecvByteBufAllocator;
|
||||||
|
|
||||||
import org.bouncycastle.util.encoders.Hex;
|
import org.bouncycastle.util.encoders.Hex;
|
||||||
import org.ethereum.gui.PeerListener;
|
import org.ethereum.gui.PeerListener;
|
||||||
import org.ethereum.manager.MainData;
|
import org.ethereum.manager.MainData;
|
||||||
|
import org.ethereum.net.Command;
|
||||||
import org.ethereum.net.RLP;
|
import org.ethereum.net.RLP;
|
||||||
import org.ethereum.net.message.*;
|
import org.ethereum.net.message.*;
|
||||||
import org.ethereum.net.rlp.RLPList;
|
import org.ethereum.net.rlp.RLPList;
|
||||||
|
@ -17,6 +19,7 @@ import org.ethereum.util.Utils;
|
||||||
|
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
|
||||||
|
import static org.ethereum.net.Command.*;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* www.ethereumJ.com
|
* www.ethereumJ.com
|
||||||
|
@ -58,10 +61,8 @@ public class EthereumProtocolHandler extends ChannelInboundHandlerAdapter {
|
||||||
|
|
||||||
// TODO: send hello
|
// TODO: send hello
|
||||||
// TODO: send ping schedule another ping
|
// TODO: send ping schedule another ping
|
||||||
|
|
||||||
// TODO: ByteBuf vs Stream vs new byte ???
|
// TODO: ByteBuf vs Stream vs new byte ???
|
||||||
|
|
||||||
|
|
||||||
final ByteBuf buffer = ctx.alloc().buffer(HELLO_MESSAGE.length + 8);
|
final ByteBuf buffer = ctx.alloc().buffer(HELLO_MESSAGE.length + 8);
|
||||||
|
|
||||||
buffer.writeBytes(MAGIC_PREFIX);
|
buffer.writeBytes(MAGIC_PREFIX);
|
||||||
|
@ -69,7 +70,6 @@ public class EthereumProtocolHandler extends ChannelInboundHandlerAdapter {
|
||||||
buffer.writeBytes(HELLO_MESSAGE);
|
buffer.writeBytes(HELLO_MESSAGE);
|
||||||
ctx.writeAndFlush(buffer);
|
ctx.writeAndFlush(buffer);
|
||||||
|
|
||||||
|
|
||||||
// sample for pinging in background
|
// sample for pinging in background
|
||||||
timer.scheduleAtFixedRate(new TimerTask() {
|
timer.scheduleAtFixedRate(new TimerTask() {
|
||||||
|
|
||||||
|
@ -121,7 +121,6 @@ public class EthereumProtocolHandler extends ChannelInboundHandlerAdapter {
|
||||||
sendGetChain(ctx);
|
sendGetChain(ctx);
|
||||||
}
|
}
|
||||||
}, 10000);
|
}, 10000);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
timer.schedule(new TimerTask() {
|
timer.schedule(new TimerTask() {
|
||||||
|
|
||||||
|
@ -132,23 +131,19 @@ public class EthereumProtocolHandler extends ChannelInboundHandlerAdapter {
|
||||||
}
|
}
|
||||||
}, 10000);
|
}, 10000);
|
||||||
*/
|
*/
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
|
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
|
||||||
|
|
||||||
|
|
||||||
byte[] payload = (byte[]) msg;
|
byte[] payload = (byte[]) msg;
|
||||||
|
|
||||||
System.out.print("msg: ");
|
System.out.print("msg: ");
|
||||||
Utils.printHexStringForByteArray(payload);
|
Utils.printHexStringForByteArray(payload);
|
||||||
|
|
||||||
byte command = RLP.getCommandCode(payload);
|
byte command = RLP.getCommandCode(payload);
|
||||||
|
|
||||||
// got HELLO
|
// got HELLO
|
||||||
if ((int) (command & 0xFF) == 0x00) {
|
if (Command.fromInt(command) == HELLO) {
|
||||||
|
|
||||||
System.out.println("[Recv: HELLO]" );
|
System.out.println("[Recv: HELLO]" );
|
||||||
RLPList rlpList = new RLPList();
|
RLPList rlpList = new RLPList();
|
||||||
|
@ -164,12 +159,10 @@ public class EthereumProtocolHandler extends ChannelInboundHandlerAdapter {
|
||||||
|
|
||||||
System.out.println(helloMessage.toString());
|
System.out.println(helloMessage.toString());
|
||||||
if (peerListener != null) peerListener.console(helloMessage.toString());
|
if (peerListener != null) peerListener.console(helloMessage.toString());
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// got DISCONNECT
|
// got DISCONNECT
|
||||||
if ((int) (command & 0xFF) == 0x01) {
|
if (Command.fromInt(command) == DISCONNECT) {
|
||||||
|
|
||||||
System.out.println("[Recv: DISCONNECT]");
|
System.out.println("[Recv: DISCONNECT]");
|
||||||
if (peerListener != null) peerListener.console("[Recv: DISCONNECT]");
|
if (peerListener != null) peerListener.console("[Recv: DISCONNECT]");
|
||||||
|
@ -180,34 +173,27 @@ public class EthereumProtocolHandler extends ChannelInboundHandlerAdapter {
|
||||||
|
|
||||||
System.out.println(disconnectMessage);
|
System.out.println(disconnectMessage);
|
||||||
if (peerListener != null) peerListener.console(disconnectMessage.toString());
|
if (peerListener != null) peerListener.console(disconnectMessage.toString());
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// got PING send pong
|
// got PING send pong
|
||||||
if ((int) (command & 0xFF) == 0x02) {
|
if (Command.fromInt(command) == PING) {
|
||||||
|
|
||||||
System.out.println("[Recv: PING]");
|
System.out.println("[Recv: PING]");
|
||||||
if (peerListener != null) peerListener.console("[Recv: PING]");
|
if (peerListener != null) peerListener.console("[Recv: PING]");
|
||||||
|
|
||||||
sendPong(ctx);
|
sendPong(ctx);
|
||||||
}
|
}
|
||||||
|
|
||||||
// got PONG mark it
|
// got PONG mark it
|
||||||
if ((int) (command & 0xFF) == 0x03) {
|
if (Command.fromInt(command) == PONG) {
|
||||||
|
|
||||||
System.out.println("[Recv: PONG]" );
|
System.out.println("[Recv: PONG]" );
|
||||||
if (peerListener != null) peerListener.console("[Recv: PONG]");
|
if (peerListener != null) peerListener.console("[Recv: PONG]");
|
||||||
|
|
||||||
this.lastPongTime = System.currentTimeMillis();
|
this.lastPongTime = System.currentTimeMillis();
|
||||||
}
|
}
|
||||||
|
|
||||||
// got GETPEERS send peers
|
// got GETPEERS send peers
|
||||||
if ((int) (command & 0xFF) == 0x10) {
|
if (Command.fromInt(command) == GET_PEERS) {
|
||||||
|
|
||||||
System.out.println("[Recv: GETPEERS]" );
|
System.out.println("[Recv: GETPEERS]" );
|
||||||
if (peerListener != null) peerListener.console("[Recv: GETPEERS]");
|
if (peerListener != null) peerListener.console("[Recv: GETPEERS]");
|
||||||
|
|
||||||
|
|
||||||
String answer = "22 40 08 91 00 00 00 50 F8 4E 11 F8 4B C5 36 81 " +
|
String answer = "22 40 08 91 00 00 00 50 F8 4E 11 F8 4B C5 36 81 " +
|
||||||
"CC 0A 29 82 76 5F B8 40 D8 D6 0C 25 80 FA 79 5C " +
|
"CC 0A 29 82 76 5F B8 40 D8 D6 0C 25 80 FA 79 5C " +
|
||||||
"FC 03 13 EF DE BA 86 9D 21 94 E7 9E 7C B2 B5 22 " +
|
"FC 03 13 EF DE BA 86 9D 21 94 E7 9E 7C B2 B5 22 " +
|
||||||
|
@ -225,14 +211,13 @@ public class EthereumProtocolHandler extends ChannelInboundHandlerAdapter {
|
||||||
answer = "22 40 08 91 00 00 00 02 C1 10 ";
|
answer = "22 40 08 91 00 00 00 02 C1 10 ";
|
||||||
|
|
||||||
answerBytes = Utils.hexStringToByteArr(answer);
|
answerBytes = Utils.hexStringToByteArr(answer);
|
||||||
|
|
||||||
buffer = ctx.alloc().buffer(answerBytes.length);
|
buffer = ctx.alloc().buffer(answerBytes.length);
|
||||||
buffer.writeBytes(answerBytes);
|
buffer.writeBytes(answerBytes);
|
||||||
ctx.writeAndFlush(buffer);
|
ctx.writeAndFlush(buffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
// got PEERS
|
// got PEERS
|
||||||
if ((int) (command & 0xFF) == 0x11) {
|
if (Command.fromInt(command) == PEERS) {
|
||||||
|
|
||||||
System.out.println("[Recv: PEERS]");
|
System.out.println("[Recv: PEERS]");
|
||||||
if (peerListener != null) peerListener.console("[Recv: PEERS]");
|
if (peerListener != null) peerListener.console("[Recv: PEERS]");
|
||||||
|
@ -248,7 +233,7 @@ public class EthereumProtocolHandler extends ChannelInboundHandlerAdapter {
|
||||||
}
|
}
|
||||||
|
|
||||||
// got TRANSACTIONS
|
// got TRANSACTIONS
|
||||||
if ((int) (command & 0xFF) == 0x12) {
|
if (Command.fromInt(command) == TRANSACTIONS) {
|
||||||
|
|
||||||
System.out.println("Recv: TRANSACTIONS]");
|
System.out.println("Recv: TRANSACTIONS]");
|
||||||
if (peerListener != null) peerListener.console("Recv: TRANSACTIONS]");
|
if (peerListener != null) peerListener.console("Recv: TRANSACTIONS]");
|
||||||
|
@ -265,7 +250,7 @@ public class EthereumProtocolHandler extends ChannelInboundHandlerAdapter {
|
||||||
}
|
}
|
||||||
|
|
||||||
// got BLOCKS
|
// got BLOCKS
|
||||||
if ((int) (command & 0xFF) == 0x13) {
|
if (Command.fromInt(command) == BLOCKS) {
|
||||||
System.out.println("[Recv: BLOCKS]");
|
System.out.println("[Recv: BLOCKS]");
|
||||||
if (peerListener != null) peerListener.console("[Recv: BLOCKS]");
|
if (peerListener != null) peerListener.console("[Recv: BLOCKS]");
|
||||||
|
|
||||||
|
@ -281,7 +266,7 @@ public class EthereumProtocolHandler extends ChannelInboundHandlerAdapter {
|
||||||
}
|
}
|
||||||
|
|
||||||
// got GETCHAIN
|
// got GETCHAIN
|
||||||
if ((int) (command & 0xFF) == 0x14) {
|
if (Command.fromInt(command) == GET_CHAIN) {
|
||||||
System.out.println("[Recv: GET_CHAIN]");
|
System.out.println("[Recv: GET_CHAIN]");
|
||||||
if (peerListener != null) peerListener.console("[Recv: GET_CHAIN]");
|
if (peerListener != null) peerListener.console("[Recv: GET_CHAIN]");
|
||||||
|
|
||||||
|
@ -294,7 +279,7 @@ public class EthereumProtocolHandler extends ChannelInboundHandlerAdapter {
|
||||||
}
|
}
|
||||||
|
|
||||||
// got NOTINCHAIN
|
// got NOTINCHAIN
|
||||||
if ((int) (command & 0xFF) == 0x15) {
|
if (Command.fromInt(command) == NOT_IN_CHAIN) {
|
||||||
System.out.println("[Recv: NOT_IN_CHAIN]");
|
System.out.println("[Recv: NOT_IN_CHAIN]");
|
||||||
if (peerListener != null) peerListener.console("[Recv: NOT_IN_CHAIN]");
|
if (peerListener != null) peerListener.console("[Recv: NOT_IN_CHAIN]");
|
||||||
|
|
||||||
|
@ -307,7 +292,7 @@ public class EthereumProtocolHandler extends ChannelInboundHandlerAdapter {
|
||||||
}
|
}
|
||||||
|
|
||||||
// got GETTRANSACTIONS
|
// got GETTRANSACTIONS
|
||||||
if ((int) (command & 0xFF) == 0x16) {
|
if (Command.fromInt(command) == GET_TRANSACTIONS) {
|
||||||
System.out.println("[Recv: GET_TRANSACTIONS]");
|
System.out.println("[Recv: GET_TRANSACTIONS]");
|
||||||
if (peerListener != null) peerListener.console("[Recv: GET_TRANSACTIONS]");
|
if (peerListener != null) peerListener.console("[Recv: GET_TRANSACTIONS]");
|
||||||
|
|
||||||
|
|
|
@ -65,7 +65,7 @@ public class StaticMessages {
|
||||||
|
|
||||||
byte[] peerIdBytes = Utils.hexStringToByteArr(peerId);
|
byte[] peerIdBytes = Utils.hexStringToByteArr(peerId);
|
||||||
|
|
||||||
HELLO_MESSAGE = new HelloMessage((byte)0x0C, (byte)0x00, "EthereumJ [v0.0.1] pure java [by Roman Mandeleil]",
|
HELLO_MESSAGE = new HelloMessage((byte)0x0E, (byte)0x00, "EthereumJ [v0.0.1] pure java [by Roman Mandeleil]",
|
||||||
(byte)0b00000111, (short)30303, peerIdBytes);
|
(byte)0b00000111, (short)30303, peerIdBytes);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
Loading…
Reference in New Issue