mirror of
https://github.com/status-im/ethereumj-personal.git
synced 2025-02-18 06:36:25 +00:00
Put back missing Repository import
This commit is contained in:
parent
bddcda09f2
commit
3873dc98b5
@ -0,0 +1,214 @@
|
|||||||
|
package org.ethereum.net.peerdiscovery;
|
||||||
|
|
||||||
|
import static org.ethereum.net.message.StaticMessages.PING_MESSAGE;
|
||||||
|
import static org.ethereum.net.message.StaticMessages.PONG_MESSAGE;
|
||||||
|
import static org.ethereum.net.message.StaticMessages.HELLO_MESSAGE;
|
||||||
|
import static org.ethereum.net.message.StaticMessages.GET_PEERS_MESSAGE;
|
||||||
|
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.Timer;
|
||||||
|
import java.util.TimerTask;
|
||||||
|
|
||||||
|
import io.netty.buffer.ByteBuf;
|
||||||
|
import io.netty.channel.ChannelHandlerContext;
|
||||||
|
import io.netty.channel.ChannelInboundHandlerAdapter;
|
||||||
|
import io.netty.channel.ChannelOption;
|
||||||
|
import io.netty.channel.FixedRecvByteBufAllocator;
|
||||||
|
|
||||||
|
import org.ethereum.listener.EthereumListener;
|
||||||
|
import org.ethereum.manager.WorldManager;
|
||||||
|
import org.ethereum.net.Command;
|
||||||
|
import org.ethereum.net.MessageQueue;
|
||||||
|
import org.ethereum.net.PeerListener;
|
||||||
|
import org.ethereum.net.client.PeerData;
|
||||||
|
import org.ethereum.net.message.DisconnectMessage;
|
||||||
|
import org.ethereum.net.message.HelloMessage;
|
||||||
|
import org.ethereum.net.message.Message;
|
||||||
|
import org.ethereum.net.message.PeersMessage;
|
||||||
|
import org.ethereum.net.message.StaticMessages;
|
||||||
|
import org.ethereum.net.message.StatusMessage;
|
||||||
|
import org.ethereum.util.RLP;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Process the basic messages between every peer on the network.
|
||||||
|
*
|
||||||
|
* Peers can
|
||||||
|
* <ul>
|
||||||
|
* <li>HELLO : Announce themselves to the work</li>
|
||||||
|
* <li>DISCONNECT: Disconnect themselves from the network</li>
|
||||||
|
* <li>GET_PEERS : Request a list of other knows peers</li>
|
||||||
|
* <li>PEERS : Send a list of know peers</li>
|
||||||
|
* <li>PING : Check if another peer is still alive</li>
|
||||||
|
* <li>PONG : Confirm that they themseves are still alive</li>
|
||||||
|
* </ul>
|
||||||
|
*
|
||||||
|
* www.ethereumJ.com
|
||||||
|
* @author: Roman Mandeleil
|
||||||
|
* Created on: 10/04/14 08:19
|
||||||
|
*/
|
||||||
|
public class PeerProtocolHandler extends ChannelInboundHandlerAdapter {
|
||||||
|
|
||||||
|
private final static Logger logger = LoggerFactory.getLogger("peerdiscovery");
|
||||||
|
|
||||||
|
private long lastPongTime;;
|
||||||
|
private boolean tearDown = false;
|
||||||
|
private HelloMessage handshake = null;
|
||||||
|
|
||||||
|
protected PeerListener peerListener;
|
||||||
|
protected MessageQueue msgQueue = null;
|
||||||
|
protected final Timer timer = new Timer("MiscMessageTimer");
|
||||||
|
|
||||||
|
public PeerProtocolHandler() {}
|
||||||
|
|
||||||
|
public PeerProtocolHandler(PeerListener peerListener) {
|
||||||
|
this.peerListener = peerListener;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void channelActive(final ChannelHandlerContext ctx) {
|
||||||
|
|
||||||
|
msgQueue = new MessageQueue(ctx);
|
||||||
|
msgQueue.sendMessage(StaticMessages.HELLO_MESSAGE);
|
||||||
|
sendPing();
|
||||||
|
|
||||||
|
// sample for pinging in background
|
||||||
|
timer.scheduleAtFixedRate(new TimerTask() {
|
||||||
|
public void run() {
|
||||||
|
if (tearDown) this.cancel();
|
||||||
|
sendPing();
|
||||||
|
}
|
||||||
|
}, 2000, 5000);
|
||||||
|
|
||||||
|
timer.scheduleAtFixedRate(new TimerTask() {
|
||||||
|
public void run() {
|
||||||
|
sendGetPeers();
|
||||||
|
}
|
||||||
|
}, 2000, 60000);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void channelRead(final ChannelHandlerContext ctx, Object msg) throws InterruptedException {
|
||||||
|
byte[] payload = (byte[]) msg;
|
||||||
|
|
||||||
|
EthereumListener listener = WorldManager.getInstance().getListener();
|
||||||
|
Command receivedCommand = Command.fromInt(RLP.getCommandCode(payload));
|
||||||
|
if (peerListener != null) peerListener.console("[Recv: " + receivedCommand.name() + "]");
|
||||||
|
|
||||||
|
switch(receivedCommand) {
|
||||||
|
case HELLO:
|
||||||
|
HelloMessage helloMessage = new HelloMessage(payload);
|
||||||
|
if (peerListener != null) peerListener.console(helloMessage.toString());
|
||||||
|
msgQueue.receivedMessage(helloMessage);
|
||||||
|
handshake = helloMessage;
|
||||||
|
if (listener != null)
|
||||||
|
listener.onRecvMessage(helloMessage);
|
||||||
|
sendGetPeers();
|
||||||
|
break;
|
||||||
|
case STATUS:
|
||||||
|
StatusMessage statusMessage = new StatusMessage(payload);
|
||||||
|
if (peerListener != null) peerListener.console(statusMessage.toString());
|
||||||
|
if (listener != null)
|
||||||
|
listener.onRecvMessage(statusMessage);
|
||||||
|
msgQueue.receivedMessage(statusMessage);
|
||||||
|
case DISCONNECT:
|
||||||
|
DisconnectMessage disconnectMessage = new DisconnectMessage(payload);
|
||||||
|
msgQueue.receivedMessage(disconnectMessage);
|
||||||
|
if (peerListener != null) peerListener.console(disconnectMessage.toString());
|
||||||
|
if (listener != null)
|
||||||
|
listener.onRecvMessage(disconnectMessage);
|
||||||
|
break;
|
||||||
|
case PING:
|
||||||
|
msgQueue.receivedMessage(StaticMessages.PING_MESSAGE);
|
||||||
|
sendPong();
|
||||||
|
if (listener != null)
|
||||||
|
listener.onRecvMessage(PING_MESSAGE);
|
||||||
|
break;
|
||||||
|
case PONG:
|
||||||
|
msgQueue.receivedMessage(StaticMessages.PONG_MESSAGE);
|
||||||
|
this.lastPongTime = System.currentTimeMillis();
|
||||||
|
if (listener != null)
|
||||||
|
listener.onRecvMessage(PONG_MESSAGE);
|
||||||
|
break;
|
||||||
|
case GET_PEERS:
|
||||||
|
msgQueue.receivedMessage(StaticMessages.GET_PEERS_MESSAGE);
|
||||||
|
sendPeers();
|
||||||
|
if (listener != null)
|
||||||
|
listener.onRecvMessage(GET_PEERS_MESSAGE);
|
||||||
|
break;
|
||||||
|
case PEERS:
|
||||||
|
PeersMessage peersMessage = new PeersMessage(payload);
|
||||||
|
msgQueue.receivedMessage(peersMessage);
|
||||||
|
if (peerListener != null) peerListener.console(peersMessage.toString());
|
||||||
|
|
||||||
|
WorldManager.getInstance().addPeers(peersMessage.getPeers());
|
||||||
|
// sendDisconnectNice(ctx);
|
||||||
|
if (listener != null)
|
||||||
|
listener.onRecvMessage(peersMessage);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void handlerAdded(ChannelHandlerContext ctx) throws Exception {
|
||||||
|
// limit the size of recieving buffer to 1024
|
||||||
|
ctx.channel().config().setRecvByteBufAllocator(new FixedRecvByteBufAllocator(32368));
|
||||||
|
ctx.channel().config().setOption(ChannelOption.SO_RCVBUF, 32368);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
|
||||||
|
this.tearDown = true;
|
||||||
|
logger.info("Lost connection to the server");
|
||||||
|
logger.error(cause.getMessage(), cause);
|
||||||
|
|
||||||
|
ctx.close().sync();
|
||||||
|
ctx.disconnect().sync();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void sendMsg(Message msg) {
|
||||||
|
msgQueue.sendMessage(msg);
|
||||||
|
|
||||||
|
EthereumListener listener = WorldManager.getInstance().getListener();
|
||||||
|
if (listener != null)
|
||||||
|
listener.onSendMessage(msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void sendHello(ChannelHandlerContext ctx) {
|
||||||
|
sendMsg(HELLO_MESSAGE);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void sendPing() {
|
||||||
|
sendMsg(PING_MESSAGE);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void sendPong() {
|
||||||
|
sendMsg(PONG_MESSAGE);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void sendGetPeers() {
|
||||||
|
sendMsg(GET_PEERS_MESSAGE);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void sendPeers() {
|
||||||
|
Set<PeerData> peers = WorldManager.getInstance().getPeers();
|
||||||
|
PeersMessage peersMessage = new PeersMessage(peers);
|
||||||
|
sendMsg(peersMessage);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void sendDisconnectNice(ChannelHandlerContext ctx) throws InterruptedException {
|
||||||
|
logger.info("[Send: DISCONNECT]");
|
||||||
|
ByteBuf buffer = ctx.alloc().buffer(StaticMessages.DISCONNECT_PEER_QUITTING.length);
|
||||||
|
buffer.writeBytes(StaticMessages.DISCONNECT_PEER_QUITTING);
|
||||||
|
ctx.writeAndFlush(buffer);
|
||||||
|
ctx.close().sync();
|
||||||
|
ctx.disconnect().sync();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected HelloMessage getHandshake() {
|
||||||
|
return this.handshake;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,31 @@
|
|||||||
|
package org.ethereum.net;
|
||||||
|
|
||||||
|
import static org.junit.Assert.assertEquals;
|
||||||
|
|
||||||
|
import org.ethereum.net.message.PingMessage;
|
||||||
|
import org.ethereum.net.message.PongMessage;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
public class PingPongMessageTest {
|
||||||
|
|
||||||
|
/* PING_MESSAGE & PONG_MESSAGE */
|
||||||
|
|
||||||
|
@Test /* PingMessage */
|
||||||
|
public void testPing() {
|
||||||
|
|
||||||
|
PingMessage pingMessage = new PingMessage();
|
||||||
|
System.out.println(pingMessage);
|
||||||
|
|
||||||
|
assertEquals(PongMessage.class, pingMessage.getAnswerMessage());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test /* PongMessage */
|
||||||
|
public void testPong() {
|
||||||
|
|
||||||
|
PongMessage pongMessage = new PongMessage();
|
||||||
|
System.out.println(pongMessage);
|
||||||
|
|
||||||
|
assertEquals(null, pongMessage.getAnswerMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,56 @@
|
|||||||
|
package org.ethereum.net;
|
||||||
|
|
||||||
|
import static org.junit.Assert.assertEquals;
|
||||||
|
|
||||||
|
import org.ethereum.net.message.HelloMessage;
|
||||||
|
import org.ethereum.net.message.StatusMessage;
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.spongycastle.util.encoders.Hex;
|
||||||
|
|
||||||
|
public class StatusMessageTest {
|
||||||
|
|
||||||
|
/* STATUS_MESSAGE */
|
||||||
|
|
||||||
|
@Test /* StatusMessage 1 from PeerServer */
|
||||||
|
public void testPeer() {
|
||||||
|
String statusMessageRaw = "";
|
||||||
|
|
||||||
|
byte[] payload = Hex.decode(statusMessageRaw);
|
||||||
|
|
||||||
|
StatusMessage statusMessage = new StatusMessage(payload);
|
||||||
|
System.out.println(statusMessage);
|
||||||
|
|
||||||
|
assertEquals(0, statusMessage.getGenesisHash());
|
||||||
|
assertEquals(0, statusMessage.getNetworkId());
|
||||||
|
assertEquals(0, statusMessage.getProtocolVersion());
|
||||||
|
assertEquals(0, statusMessage.getTotalDifficulty());
|
||||||
|
assertEquals(0, statusMessage.getBestHash());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test /* HelloMessage 2 from Node */
|
||||||
|
public void testNode() {
|
||||||
|
String helloMessageRaw = "F8 80 80 80 B7 45 74 68 " +
|
||||||
|
"65 72 65 75 6D 28 2B 2B 29 2F 50 65 65 72 20 53 " +
|
||||||
|
"65 72 76 65 72 20 5A 65 72 6F 2F 76 30 2E 36 2E " +
|
||||||
|
"38 64 2F 52 65 6C 65 61 73 65 2F 4C 69 6E 75 78 " +
|
||||||
|
"2F 67 2B 2B C0 82 76 5F B8 40 20 17 B9 5D 55 86 " +
|
||||||
|
"AD D0 53 E7 C5 DC C8 11 2D B1 D5 57 ED 83 58 9C " +
|
||||||
|
"4E 0B D2 54 42 F3 9E 41 11 65 5A 48 72 57 AA 7E " +
|
||||||
|
"4E D3 09 E8 B4 D5 5B E5 FA 8D 8D 6E 97 B7 2C 67 " +
|
||||||
|
"D7 6A A0 3E B6 9A D9 81 ED 60";
|
||||||
|
|
||||||
|
byte[] payload = Hex.decode(helloMessageRaw);
|
||||||
|
HelloMessage helloMessage = new HelloMessage(payload);
|
||||||
|
helloMessage.parse();
|
||||||
|
System.out.println(helloMessage);
|
||||||
|
|
||||||
|
assertEquals(0, helloMessage.getP2PVersion());
|
||||||
|
assertEquals("Ethereum(++)/Nick/v0.6.8d/Release/Linux/g++", helloMessage.getClientId());
|
||||||
|
assertEquals(3, helloMessage.getCapabilities().size());
|
||||||
|
assertEquals(30303, helloMessage.getListenPort());
|
||||||
|
assertEquals(
|
||||||
|
"2017B95D5586ADD053E7C5DCC8112DB1D557ED83589C4E0BD25442F39E4111655A487257AA7E4ED309E8B4D55BE5FA8D8D6E97B72C67D76AA03EB69AD981ED60",
|
||||||
|
Hex.toHexString(helloMessage.getPeerId()).toUpperCase() );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -2,7 +2,7 @@ package org.ethereum.gui;
|
|||||||
|
|
||||||
import org.ethereum.core.Block;
|
import org.ethereum.core.Block;
|
||||||
import org.ethereum.core.Transaction;
|
import org.ethereum.core.Transaction;
|
||||||
import org.ethereum.db.RepositoryImpl;
|
import org.ethereum.facade.Repository;
|
||||||
import org.ethereum.manager.WorldManager;
|
import org.ethereum.manager.WorldManager;
|
||||||
import org.ethereum.vm.*;
|
import org.ethereum.vm.*;
|
||||||
import org.spongycastle.util.encoders.Hex;
|
import org.spongycastle.util.encoders.Hex;
|
||||||
@ -37,9 +37,8 @@ public class ProgramPlayDialog extends JPanel implements ActionListener,
|
|||||||
}
|
}
|
||||||
|
|
||||||
public ProgramPlayDialog(byte[] code, Transaction tx, Block lastBlock) {
|
public ProgramPlayDialog(byte[] code, Transaction tx, Block lastBlock) {
|
||||||
this(code, ProgramInvokeFactory.createProgramInvoke(tx,
|
this(code, ProgramInvokeFactory.createProgramInvoke(tx, lastBlock,
|
||||||
lastBlock,
|
WorldManager.getInstance().getRepository()));
|
||||||
WorldManager.getInstance().getRepository()));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public ProgramPlayDialog(byte[] code, ProgramInvoke programInvoke) {
|
public ProgramPlayDialog(byte[] code, ProgramInvoke programInvoke) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user