Merge pull request #1 from romanman/cleanup

Cleanup pull-request test
This commit is contained in:
romanman 2014-05-11 20:21:59 +01:00
commit 0c8f1f40e3
17 changed files with 530 additions and 596 deletions

View File

@ -45,7 +45,6 @@
<groupId>com.cedarsoftware</groupId>
<artifactId>java-util</artifactId>
<version>1.8.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.fifesoft</groupId>

View File

@ -293,14 +293,14 @@ public class ECKey implements Serializable {
this.s = s;
}
public static ECDSASignature fromComponents(byte[] r, byte[] s) {
private static ECDSASignature fromComponents(byte[] r, byte[] s) {
return new ECDSASignature(new BigInteger(r), new BigInteger(s));
}
public static ECDSASignature fromComponents(byte[] r, byte[] s, byte v) {
ECDSASignature signature = new ECDSASignature(new BigInteger(r), new BigInteger(s));
signature.v = v;
return signature;
ECDSASignature signature = fromComponents(r, s);
signature.v = v;
return signature;
}
/**

View File

@ -30,7 +30,7 @@ public enum Command {
private Command(int cmd) {
this.cmd = cmd;
}
public static Command fromInt(int i) {
Command type = intToTypeMap.get(Integer.valueOf(i));
if (type == null)

View File

@ -9,7 +9,7 @@ public class MessageDeserializer {
/**
* Get exactly one message payload
*/
public static void deserialize(byte [] msgData, int level, int startPos, int endPos){
private static void deserialize(byte [] msgData, int level, int startPos, int endPos){
if (msgData == null || msgData.length == 0) return ;
int pos = startPos;

View File

@ -0,0 +1,42 @@
package org.ethereum.net;
import java.util.HashMap;
import java.util.Map;
public enum ReasonCode {
REASON_DISCONNECT_REQUESTED(0x00),
REASON_TCP_ERROR(0x01),
REASON_BAD_PROTOCOL(0x02),
REASON_USELESS_PEER(0x03),
REASON_TOO_MANY_PEERS(0x04),
REASON_ALREADY_CONNECTED(0x05),
REASON_WRONG_GENESIS(0x06),
REASON_INCOMPATIBLE_PROTOCOL(0x07),
REASON_PEER_QUITING(0x08),
UNKNOWN(0xFF);
private int reason;
private static final Map<Integer, ReasonCode> intToTypeMap = new HashMap<Integer, ReasonCode>();
static {
for (ReasonCode type : ReasonCode.values()) {
intToTypeMap.put(type.reason, type);
}
}
private ReasonCode(int reason) {
this.reason = reason;
}
public static ReasonCode fromInt(int i) {
ReasonCode type = intToTypeMap.get(Integer.valueOf(i));
if (type == null)
return ReasonCode.UNKNOWN;
return type;
}
public byte asByte() {
return (byte) reason;
}
}

View File

@ -31,7 +31,6 @@ public class ClientPeer {
EventLoopGroup workerGroup = new NioEventLoopGroup();
try {
Bootstrap b = new Bootstrap();
b.group(workerGroup);
b.channel(NioSocketChannel.class);
@ -58,18 +57,14 @@ public class ClientPeer {
// Start the client.
ChannelFuture f = b.connect(host, port).sync(); // (5)
// Wait until the connection is closed.
f.channel().closeFuture().sync();
} catch (InterruptedException ie){
System.out.println("-- ClientPeer: catch (InterruptedException ie) --");
ie.printStackTrace();
} finally {
workerGroup.shutdownGracefully();
}
}
}

View File

@ -1,6 +1,6 @@
package org.ethereum.net.client;
import static org.ethereum.net.Command.BLOCKS;
import static org.ethereum.net.Command.*;
import static org.ethereum.net.Command.DISCONNECT;
import static org.ethereum.net.Command.GET_CHAIN;
import static org.ethereum.net.Command.GET_PEERS;
@ -55,16 +55,6 @@ public class EthereumProtocolHandler extends ChannelInboundHandlerAdapter {
private long lastPongTime = 0;
private boolean tearDown = false;
// hello data
private boolean handShaked = false;
private byte protocolVersion;
private byte networkId;
private String clientId;
private byte capabilities;
private short peerPort;
private byte[] peerId;
private PeerListener peerListener;
public EthereumProtocolHandler() { }
@ -75,7 +65,6 @@ public class EthereumProtocolHandler extends ChannelInboundHandlerAdapter {
@Override
public void channelActive(final ChannelHandlerContext ctx) {
// TODO: send hello
// TODO: send ping schedule another ping
// TODO: ByteBuf vs Stream vs new byte ???
@ -96,12 +85,10 @@ public class EthereumProtocolHandler extends ChannelInboundHandlerAdapter {
long currTime = System.currentTimeMillis();
if (currTime - lastPongTime > 30000){
System.out.println("No ping answer for [30 sec]");
throw new Error("No ping return for 30 [sec]");
// TODO: shutdown the handler
}
System.out.println("[Send: PING]");
if (peerListener != null) peerListener.console("[Send: PING]");
sendPing(ctx);
@ -111,7 +98,6 @@ public class EthereumProtocolHandler extends ChannelInboundHandlerAdapter {
timer.scheduleAtFixedRate(new TimerTask() {
public void run() {
System.out.println("[Send: GET_PEERS]");
sendGetPeers(ctx);
}
@ -120,7 +106,6 @@ public class EthereumProtocolHandler extends ChannelInboundHandlerAdapter {
timer.scheduleAtFixedRate(new TimerTask() {
public void run() {
System.out.println("[Send: GET_TRANSACTIONS]");
sendGetTransactions(ctx);
}
@ -129,7 +114,6 @@ public class EthereumProtocolHandler extends ChannelInboundHandlerAdapter {
timer.schedule(new TimerTask() {
public void run() {
System.out.println("[Send: GET_CHAIN]");
sendGetChain(ctx);
}
@ -138,7 +122,6 @@ public class EthereumProtocolHandler extends ChannelInboundHandlerAdapter {
timer.schedule(new TimerTask() {
public void run() {
System.out.println("[Send: TX]");
sendTx(ctx);
}
@ -156,26 +139,16 @@ public class EthereumProtocolHandler extends ChannelInboundHandlerAdapter {
byte command = RLP.getCommandCode(payload);
// got HELLO
if (Command.fromInt(command) == HELLO) {
System.out.println("[Recv: HELLO]" );
RLPList rlpList = new RLPList();
RLP.parseObjects(payload, rlpList);
HelloMessage helloMessage = new HelloMessage(rlpList);
this.protocolVersion = helloMessage.getProtocolVersion();
this.networkId = helloMessage.getNetworkId();
this.clientId = helloMessage.getClientId();
this.capabilities = helloMessage.getCapabilities();
this.peerPort = helloMessage.getPeerPort();
this.peerId = helloMessage.getPeerId();
System.out.println(helloMessage.toString());
if (peerListener != null) peerListener.console(helloMessage.toString());
}
// got DISCONNECT
if (Command.fromInt(command) == DISCONNECT) {
System.out.println("[Recv: DISCONNECT]");
if (peerListener != null) peerListener.console("[Recv: DISCONNECT]");
@ -186,21 +159,18 @@ public class EthereumProtocolHandler extends ChannelInboundHandlerAdapter {
System.out.println(disconnectMessage);
if (peerListener != null) peerListener.console(disconnectMessage.toString());
}
// got PING send pong
if (Command.fromInt(command) == PING) {
System.out.println("[Recv: PING]");
if (peerListener != null) peerListener.console("[Recv: PING]");
sendPong(ctx);
}
// got PONG mark it
if (Command.fromInt(command) == PONG) {
System.out.println("[Recv: PONG]" );
if (peerListener != null) peerListener.console("[Recv: PONG]");
this.lastPongTime = System.currentTimeMillis();
}
// got GETPEERS send peers
if (Command.fromInt(command) == GET_PEERS) {
System.out.println("[Recv: GETPEERS]" );
@ -223,10 +193,8 @@ public class EthereumProtocolHandler extends ChannelInboundHandlerAdapter {
buffer.writeBytes(answerBytes);
ctx.writeAndFlush(buffer);
}
// got PEERS
if (Command.fromInt(command) == PEERS) {
System.out.println("[Recv: PEERS]");
if (peerListener != null) peerListener.console("[Recv: PEERS]");
@ -239,10 +207,8 @@ public class EthereumProtocolHandler extends ChannelInboundHandlerAdapter {
System.out.println(peersMessage);
if (peerListener != null) peerListener.console(peersMessage.toString());
}
// got TRANSACTIONS
if (Command.fromInt(command) == TRANSACTIONS) {
System.out.println("Recv: TRANSACTIONS]");
if (peerListener != null) peerListener.console("Recv: TRANSACTIONS]");
@ -254,9 +220,7 @@ public class EthereumProtocolHandler extends ChannelInboundHandlerAdapter {
// todo: if you got transactions send it to your peers
System.out.println(transactionsMessage);
if (peerListener != null) peerListener.console(transactionsMessage.toString());
}
// got BLOCKS
if (Command.fromInt(command) == BLOCKS) {
System.out.println("[Recv: BLOCKS]");
@ -272,7 +236,6 @@ public class EthereumProtocolHandler extends ChannelInboundHandlerAdapter {
System.out.println(blocksMessage);
if (peerListener != null) peerListener.console(blocksMessage.toString());
}
// got GETCHAIN
if (Command.fromInt(command) == GET_CHAIN) {
System.out.println("[Recv: GET_CHAIN]");
@ -285,7 +248,6 @@ public class EthereumProtocolHandler extends ChannelInboundHandlerAdapter {
System.out.println(getChainMessage);
if (peerListener != null) peerListener.console(getChainMessage.toString());
}
// got NOTINCHAIN
if (Command.fromInt(command) == NOT_IN_CHAIN) {
System.out.println("[Recv: NOT_IN_CHAIN]");
@ -298,15 +260,12 @@ public class EthereumProtocolHandler extends ChannelInboundHandlerAdapter {
System.out.println(notInChainMessage);
if (peerListener != null) peerListener.console(notInChainMessage.toString());
}
// got GETTRANSACTIONS
if (Command.fromInt(command) == GET_TRANSACTIONS) {
System.out.println("[Recv: GET_TRANSACTIONS]");
if (peerListener != null) peerListener.console("[Recv: GET_TRANSACTIONS]");
// todo: send the queue of the transactions
}
}
@Override
@ -337,7 +296,6 @@ public class EthereumProtocolHandler extends ChannelInboundHandlerAdapter {
ctx.writeAndFlush(buffer);
}
private void sendPing(ChannelHandlerContext ctx){
ByteBuf buffer = ctx.alloc().buffer(StaticMessages.PING.length);
buffer.writeBytes(StaticMessages.PING);

View File

@ -61,7 +61,6 @@ public class BlocksMessage extends Message {
sb.append("[").append(transactionData).append("]\n");
}
}
return "Blocks Message [\n" +
sb.toString()
+ " ]";

View File

@ -56,7 +56,7 @@ public class TransactionsMessage extends Message {
public String toString() {
if(!parsed) parseRLP();
StringBuffer sb = new StringBuffer();
for (Transaction transactionData : transactions) {
for (Transaction transactionData : transactions){
sb.append(" ").append(transactionData).append("\n");
}
return "Transactions Message [\n" + sb.toString() + " ]";

File diff suppressed because it is too large Load Diff

View File

@ -20,12 +20,10 @@ public class RLPList implements RLPElement{
}
public void addItem(RLPElement element){
list.add(element);
}
public RLPElement getElement(int index){
return list.get(index);
}
@ -52,17 +50,13 @@ public class RLPList implements RLPElement{
if (element instanceof RLPList) {
RLPList rlpList = (RLPList) element;
System.out.print("[");
System.out.print("[");
for (RLPElement singleElement : rlpList.getList()) {
recursivePrint(singleElement);
}
System.out.print("]");
} else {
String hex = Utils.toHexString(((RLPItem) element).getData());
System.out.print(hex + ", ");
}
}

View File

@ -23,7 +23,7 @@ public class Block {
private static double EMA_FACTOR = 1.5;
/* A scalar value equal to the current limit of gas expenditure per block */
private static int GAS_LIMIT = (int) Math.pow(10, 6);
private RLPList rawData;
private boolean parsed = false;
@ -76,7 +76,7 @@ public class Block {
}
// [parent_hash, uncles_hash, coinbase, state_root, tx_list_hash, difficulty, timestamp, extradata, nonce]
private void parseRLP(){
private void parseRLP() {
this.hash = HashUtil.sha3(rawData.getRLPData());
@ -110,7 +110,6 @@ public class Block {
}
public byte[] getHash(){
if (!parsed) parseRLP();
return hash;
}

View File

@ -66,13 +66,13 @@ public class PeerData {
@Override
public String toString() {
return "Peer: [ ip=" + getInetAddress()+ ", port=" + getPort() + ", peerId=" + Hex.toHexString( getPeerId() ) + "]";
return "Peer: [ip=" + getInetAddress() + ", port=" + getPort() + ", peerId=" + Hex.toHexString(getPeerId()) + "]";
}
@Override
public boolean equals(Object obj) {
PeerData peerData2 = (PeerData)obj;
return this.getInetAddress().equals(peerData2.getInetAddress());
PeerData peerData = (PeerData) obj;
return this.getInetAddress().equals(peerData.getInetAddress());
}
@Override

View File

@ -70,7 +70,6 @@ public class Transaction {
}
public void rlpParse(){
this.hash = HashUtil.sha3(rawData.getRLPData());
this.nonce = ((RLPItem) rawData.getElement(0)).getData();
this.value = ((RLPItem) rawData.getElement(1)).getData();
@ -91,7 +90,6 @@ public class Transaction {
byte[] s = ((RLPItem) rawData.getElement(9)).getData();
this.signature = ECDSASignature.fromComponents(r, s, v);
} else throw new Error("Wrong tx data element list size");
this.parsed = true;
}
@ -148,6 +146,10 @@ public class Transaction {
return signature;
}
public boolean isContract() {
return this.receiveAddress.length == 0;
}
/*********
* Crypto
*/
@ -172,7 +174,7 @@ public class Transaction {
ECKey key = ECKey.fromPrivate(privKeyBytes);
this.signature = key.sign(hash);
}
@Override
public String toString() {
if (!parsed) rlpParse();

View File

@ -0,0 +1,159 @@
package org.ethereum.vm;
import java.util.HashMap;
import java.util.Map;
/**
* Instruction set for the Ethereum Virtual Machine
*/
public enum OpCode {
/**
* Stop and Arithmetic Operations
*/
STOP(0x00),
ADD(0x01),
MUL(0x02),
SUB(0x03),
DIV(0x04),
SDIV(0x05),
MOD(0x06),
SMOD(0x07),
EXP(0x08),
NEG(0x09),
LT(0x0a),
GT(0x0b),
EQ(0x0c),
NOT(0x0d),
/**
* Bitwise Logic Operations
*/
AND(0x10),
OR(0x11),
XOR(0x12),
BYTE(0x13),
/**
* SHA3
*/
SHA3(0x20),
/**
* Environmental Information
*/
ADDRESS(0x30),
BALANCE(0x31),
ORIGIN(0x32),
CALLER(0x33),
CALLVALUE(0x34),
CALLDATALOAD(0x35),
CALLDATASIZE(0x36),
CALLDATACOPY(0x37),
CODESIZE(0x38),
CODECOPY(0x39),
GASPRICE(0x3a),
/**
* Block Information
*/
PREVHASH(0x40),
COINBASE(0x41),
TIMESTAMP(0x42),
NUMBER(0x43),
DIFFICULTY(0x44),
GASLIMIT(0x45),
/**
* Memory, Storage and Flow Operations
*/
POP(0x50),
DUP(0x51),
SWAP(0x52),
MLOAD(0x53),
MSTORE(0x54),
MSTORE8(0x55),
SLOAD(0x56),
SSTORE(0x57),
JUMP(0x58),
JUMPI(0x59),
PC(0x5a),
MSIZE(0x5b),
GAS(0x5c),
/**
* Push Operations
*/
PUSH1(0x60),
PUSH2(0x61),
PUSH3(0x62),
PUSH4(0x63),
PUSH5(0x64),
PUSH6(0x65),
PUSH7(0x66),
PUSH8(0x67),
PUSH9(0x68),
PUSH10(0x69),
PUSH11(0x6a),
PUSH12(0x6b),
PUSH13(0x6c),
PUSH14(0x6d),
PUSH15(0x6e),
PUSH16(0x6f),
PUSH17(0x70),
PUSH18(0x71),
PUSH19(0x72),
PUSH20(0x73),
PUSH21(0x74),
PUSH22(0x75),
PUSH23(0x76),
PUSH24(0x77),
PUSH25(0x78),
PUSH26(0x79),
PUSH27(0x7a),
PUSH28(0x7b),
PUSH29(0x7c),
PUSH30(0x7d),
PUSH31(0x7e),
PUSH32(0x7f),
/**
* System operations
*/
CREATE(0xf0),
CALL(0xf1),
RETURN(0xf2),
SUICIDE(0xff);
private byte opcode;
private static final Map<Byte, OpCode> intToTypeMap = new HashMap<Byte, OpCode>();
static {
for (OpCode type : OpCode.values()) {
intToTypeMap.put(type.opcode, type);
}
}
private OpCode(int op) {
this.opcode = (byte) op;
}
public static OpCode fromInt(int i) {
OpCode type = intToTypeMap.get(i);
if (type == null)
return OpCode.STOP;
return type;
}
public int asInt() {
return opcode;
}
}

View File

@ -117,8 +117,7 @@ public class ECKeyTest {
ECKey key = ECKey.fromPublicOnly(pubKey);
BigInteger r = new BigInteger("28157690258821599598544026901946453245423343069728565040002908283498585537001");
BigInteger s = new BigInteger("30212485197630673222315826773656074299979444367665131281281249560925428307087");
ECDSASignature sig = ECDSASignature.fromComponents(r.toByteArray(), s.toByteArray());
sig.v = 28;
ECDSASignature sig = ECDSASignature.fromComponents(r.toByteArray(), s.toByteArray(), (byte) 28);
key.verify(HashUtil.sha3(exampleMessage.getBytes()), sig);
}
@ -126,8 +125,7 @@ public class ECKeyTest {
public void testVerifySignature2() {
BigInteger r = new BigInteger("c52c114d4f5a3ba904a9b3036e5e118fe0dbb987fe3955da20f2cd8f6c21ab9c", 16);
BigInteger s = new BigInteger("6ba4c2874299a55ad947dbc98a25ee895aabf6b625c26c435e84bfd70edf2f69", 16);
ECDSASignature sig = ECDSASignature.fromComponents(r.toByteArray(), s.toByteArray());
sig.v = 0x1b;
ECDSASignature sig = ECDSASignature.fromComponents(r.toByteArray(), s.toByteArray(), (byte) 0x1b);
byte[] rawtx = Hex.decode("f82804881bc16d674ec8000094cd2a3d9f938e13cd947ec05abc7fe734df8dd8268609184e72a0006480");
try {
ECKey key = ECKey.signatureToKey(HashUtil.sha3(rawtx), sig.toBase64());

View File

@ -378,7 +378,6 @@ public class MessagesTest {
List<Block> list = blocksMessage.getBlockDataList();
System.out.println(blocksMessage);
assertEquals(32, list.size());
Block block = list.get(31);