diff --git a/ethereumj-core/src/main/java/org/ethereum/core/AccountState.java b/ethereumj-core/src/main/java/org/ethereum/core/AccountState.java
index 8570ed52..12ebd026 100644
--- a/ethereumj-core/src/main/java/org/ethereum/core/AccountState.java
+++ b/ethereumj-core/src/main/java/org/ethereum/core/AccountState.java
@@ -1,9 +1,13 @@
package org.ethereum.core;
+import static org.ethereum.crypto.HashUtil.EMTPY_TRIE_HASH;
+import static org.ethereum.util.ByteUtil.EMPTY_BYTE_ARRAY;
import static org.ethereum.crypto.HashUtil.EMPTY_DATA_HASH;
+import org.ethereum.util.ByteUtil;
import org.ethereum.util.RLP;
import org.ethereum.util.RLPList;
+import org.spongycastle.util.Arrays;
import org.spongycastle.util.encoders.Hex;
import java.math.BigInteger;
@@ -30,7 +34,7 @@ public class AccountState {
* I define a convenient equivalence TRIE (σ[a] s ) ≡ σ[a] s .
* It shall be understood that σ[a] s is not a ‘physical’ member
* of the account and does not contribute to its later serialisation */
- private byte[] stateRoot = EMPTY_DATA_HASH;
+ private byte[] stateRoot = EMTPY_TRIE_HASH;
/* The hash of the EVM code of this contract—this is the code
* that gets executed should this address receive a message call;
@@ -53,10 +57,10 @@ public class AccountState {
this.rlpEncoded = rlpData;
RLPList items = (RLPList) RLP.decode2(rlpEncoded).get(0);
- this.nonce = items.get(0).getRLPData() == null ? BigInteger.ZERO
- : new BigInteger(1, items.get(0).getRLPData());
- this.balance = items.get(1).getRLPData() == null ? BigInteger.ZERO
- : new BigInteger(1, items.get(1).getRLPData());
+ this.nonce = new BigInteger(1, ((items.get(0).getRLPData()) == null ? new byte[]{0} :
+ items.get(0).getRLPData()));
+ this.balance = new BigInteger(1, ((items.get(1).getRLPData()) == null ? new byte[]{0} :
+ items.get(1).getRLPData()));
this.stateRoot = items.get(2).getRLPData();
this.codeHash = items.get(3).getRLPData();
}
@@ -116,9 +120,13 @@ public class AccountState {
public String toString() {
String ret = "Nonce: " + this.getNonce().toString() + "\n" +
- "Balance: " + Denomination.toFriendlyString(getBalance()) + "\n" +
- "State Root: " + Hex.toHexString(this.getStateRoot()) + "\n" +
- "Code Hash: " + Hex.toHexString(this.getCodeHash());
+ "Balance: " + Denomination.toFriendlyString(getBalance()) + "\n";
+
+ if(this.getStateRoot()!= null && !Arrays.areEqual(this.getStateRoot(), EMPTY_BYTE_ARRAY))
+ ret += "State Root: " + Hex.toHexString(this.getStateRoot()) + "\n";
+ if(this.getCodeHash() != null && !Arrays.areEqual(this.getCodeHash(), EMPTY_DATA_HASH))
+ ret += "Code Hash: " + Hex.toHexString(this.getCodeHash());
+
return ret;
}
}
diff --git a/ethereumj-core/src/main/java/org/ethereum/core/BlockHeader.java b/ethereumj-core/src/main/java/org/ethereum/core/BlockHeader.java
index 57725cf0..de797a58 100644
--- a/ethereumj-core/src/main/java/org/ethereum/core/BlockHeader.java
+++ b/ethereumj-core/src/main/java/org/ethereum/core/BlockHeader.java
@@ -2,14 +2,17 @@ package org.ethereum.core;
import java.math.BigInteger;
+import static org.ethereum.crypto.HashUtil.EMPTY_DATA_HASH;
+import static org.ethereum.crypto.HashUtil.EMTPY_TRIE_HASH;
import static org.ethereum.util.ByteUtil.*;
-import static org.ethereum.crypto.HashUtil.*;
import org.ethereum.crypto.HashUtil;
+import org.ethereum.crypto.SHA3Helper;
import org.ethereum.manager.WorldManager;
import org.ethereum.util.*;
import org.spongycastle.util.Arrays;
import org.spongycastle.util.BigIntegers;
+import org.spongycastle.util.encoders.Hex;
/**
* Block header is a value object containing
@@ -77,7 +80,7 @@ public class BlockHeader {
this.txTrieRoot = ((RLPItem) rlpHeader.get(4)).getRLPData();
if(this.txTrieRoot == null)
- this.txTrieRoot = EMPTY_DATA_HASH;
+ this.txTrieRoot = EMTPY_TRIE_HASH;
this.recieptTrieRoot = ((RLPItem) rlpHeader.get(5)).getRLPData();
if(this.recieptTrieRoot == null)
@@ -289,10 +292,10 @@ public class BlockHeader {
byte[] stateRoot = RLP.encodeElement(this.stateRoot);
- if (txTrieRoot == null) this.txTrieRoot = EMPTY_DATA_HASH;
+ if (txTrieRoot == null) this.txTrieRoot = EMTPY_TRIE_HASH;
byte[] txTrieRoot = RLP.encodeElement(this.txTrieRoot);
- if (recieptTrieRoot == null) this.recieptTrieRoot = EMPTY_DATA_HASH;
+ if (recieptTrieRoot == null) this.recieptTrieRoot = EMTPY_TRIE_HASH;
byte[] recieptTrieRoot = RLP.encodeElement(this.recieptTrieRoot);
byte[] logsBloom = RLP.encodeElement(this.logsBloom);
@@ -354,23 +357,4 @@ public class BlockHeader {
return toStringBuff.toString();
}
- public String toStylishString() {
-
- toStringBuff.setLength(0);
- toStringBuff.append(", parentHash=" + toHexString(parentHash)).append("
");
- toStringBuff.append(", unclesHash=" + toHexString(unclesHash)).append("
");
- toStringBuff.append(", coinbase=" + toHexString(coinbase)).append("
");
- toStringBuff.append(", stateRoot=" + toHexString(stateRoot)).append("
");
- toStringBuff.append(", txTrieHash=" + toHexString(txTrieRoot)).append("
");
- toStringBuff.append(", difficulty=" + toHexString(difficulty)).append("
");
- toStringBuff.append(", number=" + number).append("
");
- toStringBuff.append(", minGasPrice=" + minGasPrice).append("
");
- toStringBuff.append(", gasLimit=" + gasLimit).append("
");
- toStringBuff.append(", gasUsed=" + gasUsed).append("
");
- toStringBuff.append(", timestamp=" + timestamp + " (" + Utils.longToDateTime(timestamp) + ")").append("
");
- toStringBuff.append(", extraData=" + toHexString(extraData)).append("
");
- toStringBuff.append(", nonce=" + toHexString(nonce)).append("
");
- return toStringBuff.toString();
- }
-
}
diff --git a/ethereumj-core/src/main/java/org/ethereum/core/BlockchainImpl.java b/ethereumj-core/src/main/java/org/ethereum/core/BlockchainImpl.java
index 506db0e7..f9277783 100644
--- a/ethereumj-core/src/main/java/org/ethereum/core/BlockchainImpl.java
+++ b/ethereumj-core/src/main/java/org/ethereum/core/BlockchainImpl.java
@@ -195,17 +195,11 @@ public class BlockchainImpl implements Blockchain {
int i = 0;
long totalGasUsed = 0;
- for (TransactionReceipt txr : block.getTxReceiptList()) {
+ for (Transaction tx : block.getTransactionsList()) {
stateLogger.debug("apply block: [{}] tx: [{}] ", block.getNumber(), i);
- totalGasUsed += applyTransaction(block, txr.getTransaction());
+ totalGasUsed += applyTransaction(block, tx);
if(block.getNumber() >= CONFIG.traceStartBlock())
- repository.dumpState(block, totalGasUsed, i++, txr.getTransaction().getHash());
- if(!Arrays.equals(this.repository.getWorldState().getRootHash(), txr.getPostTxState())) {
- stateLogger.warn("TX: STATE CONFLICT {}..: {}", Hex.toHexString(txr.getTransaction().getHash()).substring(0, 8),
- Hex.toHexString(this.repository.getWorldState().getRootHash()));
-// repository.close();
-// System.exit(-1); // Don't continue
- }
+ repository.dumpState(block, totalGasUsed, i++, tx.getHash());
}
this.addReward(block);
diff --git a/ethereumj-core/src/main/java/org/ethereum/core/Genesis.java b/ethereumj-core/src/main/java/org/ethereum/core/Genesis.java
index cbcabe90..03767be6 100644
--- a/ethereumj-core/src/main/java/org/ethereum/core/Genesis.java
+++ b/ethereumj-core/src/main/java/org/ethereum/core/Genesis.java
@@ -1,14 +1,18 @@
package org.ethereum.core;
-import static org.ethereum.crypto.HashUtil.sha3;
-import static org.ethereum.crypto.HashUtil.EMPTY_LIST_HASH;
-
+import org.ethereum.crypto.HashUtil;
+import org.ethereum.crypto.SHA3Helper;
import org.ethereum.trie.Trie;
import org.ethereum.trie.TrieImpl;
+import org.ethereum.util.ByteUtil;
+import org.ethereum.util.RLP;
import org.spongycastle.util.encoders.Hex;
import java.math.BigInteger;
+import static org.ethereum.crypto.HashUtil.*;
+import static org.ethereum.crypto.HashUtil.EMPTY_DATA_HASH;
+
/**
* The genesis block is the first block in the chain and has fixed values according to
* the protocol specification. The genesis block is 13 items, and is specified thus:
@@ -46,7 +50,7 @@ public class Genesis extends Block {
private static byte[] zeroHash512 = new byte[64];
public static byte[] PARENT_HASH = zeroHash256;
- public static byte[] UNCLES_HASH = EMPTY_LIST_HASH;
+ public static byte[] UNCLES_HASH = EMPTY_DATA_HASH;
public static byte[] COINBASE = zeroHash160;
public static byte[] LOG_BLOOM = zeroHash512;
public static byte[] DIFFICULTY = BigInteger.valueOf(2).pow(17).toByteArray();
@@ -69,7 +73,8 @@ public class Genesis extends Block {
// The proof-of-concept series include a development pre-mine, making the state root hash
// some value stateRoot. The latest documentation should be consulted for the value of the state root.
for (String address : premine) {
- AccountState acctState = new AccountState(BigInteger.ZERO, PREMINE_AMOUNT);
+ AccountState acctState = new AccountState();
+ acctState.addToBalance(PREMINE_AMOUNT);
state.update(Hex.decode(address), acctState.getEncoded());
}
diff --git a/ethereumj-core/src/main/java/org/ethereum/crypto/HashUtil.java b/ethereumj-core/src/main/java/org/ethereum/crypto/HashUtil.java
index fb58f078..23baa2c3 100644
--- a/ethereumj-core/src/main/java/org/ethereum/crypto/HashUtil.java
+++ b/ethereumj-core/src/main/java/org/ethereum/crypto/HashUtil.java
@@ -7,6 +7,7 @@ import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import org.ethereum.db.ByteArrayWrapper;
+import org.ethereum.util.ByteUtil;
import org.ethereum.util.RLP;
import org.ethereum.util.Utils;
import org.spongycastle.crypto.Digest;
@@ -18,8 +19,8 @@ public class HashUtil {
private static final int MAX_ENTRIES = 100; // Should contain most commonly hashed values
private static LRUMap sha3Cache = new LRUMap<>(0, MAX_ENTRIES);
- public static final byte[] EMPTY_DATA_HASH = Hex.decode("c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470");
- public static final byte[] EMPTY_LIST_HASH = Hex.decode("1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347");
+ public static final byte[] EMPTY_DATA_HASH = SHA3Helper.sha3("");
+ public static final byte[] EMTPY_TRIE_HASH = SHA3Helper.sha3(RLP.encodeElement(ByteUtil.EMPTY_BYTE_ARRAY));
private static final MessageDigest sha256digest;
diff --git a/ethereumj-core/src/main/java/org/ethereum/trie/TrieImpl.java b/ethereumj-core/src/main/java/org/ethereum/trie/TrieImpl.java
index bf3049b6..6a09c983 100644
--- a/ethereumj-core/src/main/java/org/ethereum/trie/TrieImpl.java
+++ b/ethereumj-core/src/main/java/org/ethereum/trie/TrieImpl.java
@@ -1,6 +1,7 @@
package org.ethereum.trie;
import static java.util.Arrays.copyOfRange;
+import static org.ethereum.crypto.HashUtil.EMTPY_TRIE_HASH;
import static org.ethereum.util.ByteUtil.matchingNibbleLength;
import static org.ethereum.util.CompactEncoder.binToNibbles;
import static org.ethereum.util.CompactEncoder.packNibbles;
@@ -11,6 +12,7 @@ import java.util.*;
import org.ethereum.crypto.HashUtil;
import org.ethereum.db.ByteArrayWrapper;
+import org.ethereum.util.ByteUtil;
import org.ethereum.util.Value;
import org.iq80.leveldb.DB;
import org.slf4j.Logger;
@@ -154,7 +156,7 @@ public class TrieImpl implements Trie {
if (root == null
|| (root instanceof byte[] && ((byte[]) root).length == 0)
|| (root instanceof String && "".equals((String) root))) {
- return HashUtil.EMPTY_DATA_HASH;
+ return EMTPY_TRIE_HASH;
} else if (root instanceof byte[]) {
return (byte[]) this.getRoot();
} else {
diff --git a/ethereumj-core/src/main/java/org/ethereum/util/ByteUtil.java b/ethereumj-core/src/main/java/org/ethereum/util/ByteUtil.java
index b4cc298b..695457c5 100644
--- a/ethereumj-core/src/main/java/org/ethereum/util/ByteUtil.java
+++ b/ethereumj-core/src/main/java/org/ethereum/util/ByteUtil.java
@@ -6,6 +6,8 @@ import java.math.BigInteger;
import java.nio.ByteBuffer;
import java.util.Arrays;
+import org.ethereum.crypto.SHA3Helper;
+import org.ethereum.trie.TrieImpl;
import org.spongycastle.util.encoders.Hex;
public class ByteUtil {
diff --git a/ethereumj-core/src/test/java/org/ethereum/core/BlockTest.java b/ethereumj-core/src/test/java/org/ethereum/core/BlockTest.java
index 3d2d1d2a..6a1e94be 100644
--- a/ethereumj-core/src/test/java/org/ethereum/core/BlockTest.java
+++ b/ethereumj-core/src/test/java/org/ethereum/core/BlockTest.java
@@ -30,8 +30,8 @@ public class BlockTest {
}
// https://ethereum.etherpad.mozilla.org/12
- private String PoC7_GENESIS_HEX_RLP_ENCODED = "f8abf8a7a00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347940000000000000000000000000000000000000000a0477fd4d3a3bae60913bbb0cbffbc1aae5c57a60f6351f9ed702d97378f851fc680830200008080830f4240808080a004994f67dc55b09e814ab7ffc8df3686b4afb2bb53e60eae97ef043fe03fb829c0c0";
- private String PoC7_GENESIS_HEX_HASH = "c4bcce917758c95695b8a368f920d166b4f9b3572c54ff40385ef84ea6850099";
+ private String PoC7_GENESIS_HEX_RLP_ENCODED = "f9012ff9012aa00000000000000000000000000000000000000000000000000000000000000000a0c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470940000000000000000000000000000000000000000a0c67c70f5d7d3049337d1dcc0503a249881120019a8e7322774dbfe57b463718ca056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b84000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000830200008080830f4240808080a004994f67dc55b09e814ab7ffc8df3686b4afb2bb53e60eae97ef043fe03fb829c0c0";
+ private String PoC7_GENESIS_HEX_HASH = "19039f385f269fae48d497fba579d7079c761cec5643ec1096e98bdda4ffcf00";
String block_2 = "f8b5f8b1a0cf4b25b08b39350304fe12a16e4216c01a426f8f3dbf0d392b5b45"
+ "8ffb6a399da01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a1"
diff --git a/ethereumj-core/src/test/java/org/ethereum/core/StateTest.java b/ethereumj-core/src/test/java/org/ethereum/core/StateTest.java
index db7269a6..d622bdee 100644
--- a/ethereumj-core/src/test/java/org/ethereum/core/StateTest.java
+++ b/ethereumj-core/src/test/java/org/ethereum/core/StateTest.java
@@ -14,7 +14,7 @@ import org.spongycastle.util.encoders.Hex;
public class StateTest {
- private static final String GENESIS_STATE_ROOT = "477fd4d3a3bae60913bbb0cbffbc1aae5c57a60f6351f9ed702d97378f851fc6";
+ private static final String GENESIS_STATE_ROOT = "c67c70f5d7d3049337d1dcc0503a249881120019a8e7322774dbfe57b463718c";
@Test
public void testGenesisAccounts() {
@@ -94,7 +94,7 @@ public class StateTest {
// 4) calc the root
Trie trie = generateGenesisState();
- String expected = "e9d7cff80ac451f10a5212b0e8bb6070d0c2214b9d4943794269be78b13d1fb4";
+ String expected = "6ae5f47b0cc54ca33b4a46537f6cf6673f9138e876f3ac5a33dde173efe28236";
// Get and update sender in world state
byte[] cowAddress = Hex.decode("cd2a3d9f938e13cd947ec05abc7fe734df8dd826");
diff --git a/ethereumj-core/src/test/java/org/ethereum/db/RepositoryTest.java b/ethereumj-core/src/test/java/org/ethereum/db/RepositoryTest.java
index 438a0088..9c6d60f8 100644
--- a/ethereumj-core/src/test/java/org/ethereum/db/RepositoryTest.java
+++ b/ethereumj-core/src/test/java/org/ethereum/db/RepositoryTest.java
@@ -4,12 +4,14 @@ import org.ethereum.core.AccountState;
import org.ethereum.crypto.HashUtil;
import org.ethereum.facade.Repository;
import org.ethereum.vm.DataWord;
-import org.junit.*;
+import org.junit.FixMethodOrder;
+import org.junit.Test;
import org.junit.runners.MethodSorters;
import org.spongycastle.util.encoders.Hex;
import java.math.BigInteger;
+import static org.ethereum.crypto.HashUtil.EMPTY_DATA_HASH;
import static org.junit.Assert.*;
/**
@@ -183,7 +185,7 @@ public class RepositoryTest {
AccountState accountState = repository.getAccountState(addr);
assertTrue(code0 == null);
assertNull(code1);
- assertArrayEquals(HashUtil.EMPTY_DATA_HASH, accountState.getCodeHash());
+ assertEquals(EMPTY_DATA_HASH, accountState.getCodeHash());
} finally {
repository.close();
}
diff --git a/ethereumj-core/src/test/java/org/ethereum/trie/TrieTest.java b/ethereumj-core/src/test/java/org/ethereum/trie/TrieTest.java
index 1e64d57f..800845bd 100644
--- a/ethereumj-core/src/test/java/org/ethereum/trie/TrieTest.java
+++ b/ethereumj-core/src/test/java/org/ethereum/trie/TrieTest.java
@@ -1,5 +1,6 @@
package org.ethereum.trie;
+import static org.ethereum.crypto.HashUtil.EMTPY_TRIE_HASH;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotEquals;
@@ -18,6 +19,7 @@ import org.ethereum.core.AccountState;
import org.ethereum.crypto.HashUtil;
import org.ethereum.db.DatabaseImpl;
import org.ethereum.db.MockDB;
+import org.ethereum.util.ByteUtil;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
@@ -30,7 +32,7 @@ import org.spongycastle.util.encoders.Hex;
public class TrieTest {
private static String LONG_STRING = "1234567890abcdefghijklmnopqrstuvwxxzABCEFGHIJKLMNOPQRSTUVWXYZ";
- private static String ROOT_HASH_EMPTY = Hex.toHexString(HashUtil.EMPTY_DATA_HASH);
+ private static String ROOT_HASH_EMPTY = Hex.toHexString(EMTPY_TRIE_HASH);
private static String c = "c";
private static String ca = "ca";
diff --git a/ethereumj-core/src/test/resources/log4j.properties b/ethereumj-core/src/test/resources/log4j.properties
index b4a5a013..2e780bea 100644
--- a/ethereumj-core/src/test/resources/log4j.properties
+++ b/ethereumj-core/src/test/resources/log4j.properties
@@ -25,4 +25,5 @@ log4j.logger.blockchain = DEBUG
log4j.logger.txs = ERROR
log4j.logger.ui = ERROR
log4j.logger.gas = ERROR
+log4j.logger.test = TRACE
diff --git a/ethereumj-studio/pom.xml b/ethereumj-studio/pom.xml
index 8d3922b8..2c98af46 100644
--- a/ethereumj-studio/pom.xml
+++ b/ethereumj-studio/pom.xml
@@ -71,7 +71,7 @@
org.ethereum
ethereumj
- 0.7.8.20141103.1055
+ 0.7.8.20141103.1355
diff --git a/ethereumj-studio/src/main/resources/system.properties b/ethereumj-studio/src/main/resources/system.properties
index 68f54982..c81f5ea9 100644
--- a/ethereumj-studio/src/main/resources/system.properties
+++ b/ethereumj-studio/src/main/resources/system.properties
@@ -9,8 +9,8 @@ peer.discovery.ip.list = poc-7.ethdev.com:30303,\
185.43.109.23:30303
# Peer Server Zero (poc-7.ethdev.com)
-peer.active.ip = 23.22.211.45
-peer.active.port = 11111
+peer.active.ip = 127.0.0.1
+peer.active.port = 10101
# ZeroGox