From 8dc0a56644655515b01fd0b5c327a816110e9866 Mon Sep 17 00:00:00 2001 From: romanman Date: Tue, 8 Jul 2014 20:25:32 +0100 Subject: [PATCH] Net layer packet interfere bug: + temporary turn off all the parallel traffic, in order to fully download the chain --- .../net/client/EthereumFrameDecoder.java | 12 ++++++++++- .../net/client/EthereumProtocolHandler.java | 20 +++++++++++++++++-- 2 files changed, 29 insertions(+), 3 deletions(-) diff --git a/ethereumj-core/src/main/java/org/ethereum/net/client/EthereumFrameDecoder.java b/ethereumj-core/src/main/java/org/ethereum/net/client/EthereumFrameDecoder.java index 190ffaa6..d53eb1b1 100644 --- a/ethereumj-core/src/main/java/org/ethereum/net/client/EthereumFrameDecoder.java +++ b/ethereumj-core/src/main/java/org/ethereum/net/client/EthereumFrameDecoder.java @@ -3,6 +3,9 @@ package org.ethereum.net.client; import io.netty.buffer.ByteBuf; import io.netty.channel.ChannelHandlerContext; import io.netty.handler.codec.ByteToMessageDecoder; +import io.netty.handler.codec.CorruptedFrameException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import java.util.List; @@ -13,6 +16,8 @@ import java.util.List; */ public class EthereumFrameDecoder extends ByteToMessageDecoder { + private Logger logger = LoggerFactory.getLogger("wire"); + @Override protected void decode(ChannelHandlerContext ctx, ByteBuf in, List out) throws Exception { @@ -27,21 +32,26 @@ public class EthereumFrameDecoder extends ByteToMessageDecoder { (magicBytes >> 8 & 0xFF) == 0x08 && (magicBytes & 0xFF) == 0x91 )) { + logger.error("abandon garbage, wrong magic bytes: [ {} ] msgSize: [ {} ]", magicBytes, msgSize); ctx.close(); } // Don't have the full packet yet if (msgSize > in.readableBytes()) { + + logger.debug("msg decode: magicBytes: [ {} ], readBytes: [ {} ] / msgSize: [ {} ] ", magicBytes, in.readableBytes(), msgSize); in.resetReaderIndex(); return; } + logger.debug("message fully constructed go handle it: readBytes: [ {} ] / msgSize: [ {} ]", in.readableBytes(), msgSize); + byte[] decoded = new byte[(int)msgSize]; in.readBytes(decoded); out.add(decoded); - // Chop the achieved data. in.markReaderIndex(); + } } \ No newline at end of file diff --git a/ethereumj-core/src/main/java/org/ethereum/net/client/EthereumProtocolHandler.java b/ethereumj-core/src/main/java/org/ethereum/net/client/EthereumProtocolHandler.java index 54463143..d5c91dff 100644 --- a/ethereumj-core/src/main/java/org/ethereum/net/client/EthereumProtocolHandler.java +++ b/ethereumj-core/src/main/java/org/ethereum/net/client/EthereumProtocolHandler.java @@ -43,7 +43,7 @@ public class EthereumProtocolHandler extends ChannelInboundHandlerAdapter { private Logger logger = LoggerFactory.getLogger("wire"); private Timer chainAskTimer = new Timer(); - private int secToAskForChain = 1; + private int secToAskForChain = 7; private final Timer timer = new Timer(); private final static byte[] MAGIC_PREFIX = {(byte)0x22, (byte)0x40, (byte)0x08, (byte)0x91}; @@ -76,6 +76,7 @@ public class EthereumProtocolHandler extends ChannelInboundHandlerAdapter { ctx.writeAndFlush(buffer); // sample for pinging in background +/* timer.scheduleAtFixedRate(new TimerTask() { public void run() { @@ -94,7 +95,9 @@ public class EthereumProtocolHandler extends ChannelInboundHandlerAdapter { sendPing(ctx); } }, 2000, 5000); +*/ +/* timer.scheduleAtFixedRate(new TimerTask() { public void run() { @@ -110,14 +113,18 @@ public class EthereumProtocolHandler extends ChannelInboundHandlerAdapter { sendGetTransactions(ctx); } }, 2000, 30000); +*/ +/* chainAskTimer.schedule(new TimerTask() { public void run() { - logger.info("[Send: GET_CHAIN]"); sendGetChain(ctx); } }, 3000, secToAskForChain * 1000); +*/ + + sendGetChain(ctx); } @@ -128,6 +135,7 @@ public class EthereumProtocolHandler extends ChannelInboundHandlerAdapter { logger.info("[Recv msg: [{}] ]", Hex.toHexString(payload)); byte command = RLP.getCommandCode(payload); + // got HELLO if (Command.fromInt(command) == HELLO) { logger.info("[Recv: HELLO]" ); @@ -223,6 +231,7 @@ public class EthereumProtocolHandler extends ChannelInboundHandlerAdapter { // If we get one block from a peer // we ask less greedy +/* if (blockList.size() <= 1 && secToAskForChain != 10) { logger.info("Now we ask for a chain each 10 seconds"); @@ -239,9 +248,11 @@ public class EthereumProtocolHandler extends ChannelInboundHandlerAdapter { } }, 3000, secToAskForChain * 1000); } +*/ // If we get more blocks from a peer // we ask more greedy +/* if (blockList.size() > 2 && secToAskForChain != 1) { logger.info("Now we ask for a chain each 1 seconds"); @@ -258,9 +269,13 @@ public class EthereumProtocolHandler extends ChannelInboundHandlerAdapter { } }, 3000, secToAskForChain * 1000); } +*/ WorldManager.getInstance().getBlockChain().addBlocks(blockList); if (peerListener != null) peerListener.console(blocksMessage.toString()); + + if (blockList.size() > 1) + sendGetChain(ctx); } // got GETCHAIN @@ -359,6 +374,7 @@ public class EthereumProtocolHandler extends ChannelInboundHandlerAdapter { private void sendGetChain(ChannelHandlerContext ctx) { + logger.info("[Send: GET_CHAIN]"); byte[] hash = WorldManager.getInstance().getBlockChain().getLastBlock().getHash(); GetChainMessage chainMessage = new GetChainMessage((byte)100, hash); chainMessage.toString();