Update for genesis cpp mater poc-8 compatibility

This commit is contained in:
Roman Mandeleil 2015-03-24 21:56:13 +02:00
parent 2c2a0f2f37
commit 99d135c034
8 changed files with 79 additions and 33 deletions

View File

@ -7,6 +7,8 @@ import org.spongycastle.util.encoders.Hex;
import java.math.BigInteger;
import static org.ethereum.core.Denomination.FINNEY;
import static org.ethereum.core.Denomination.WEI;
import static org.ethereum.crypto.HashUtil.*;
/**
@ -30,18 +32,25 @@ public class Genesis extends Block {
public final static BigInteger PREMINE_AMOUNT = BigInteger.valueOf(2).pow(200);
private static String[] premine = new String[]{
"dbdbdb2cbd23b783741e8d7fcf51e459b497e4a6",
"e4157b34ea9615cfbde6b4fda419828124b70c78", // # (CH)
"b9c015918bdaba24b4ff057a92a3873d6eb201be", // # (V)
"6c386a4b26f73c802f34673f7248bb118f97424a", // # (HH)
"cd2a3d9f938e13cd947ec05abc7fe734df8dd826", // # (R)
"2ef47100e0787b915105fd5e3f4ff6752079d5cb", // # (M)
"e6716f9544a56c530d868e4bfbacb172315bdead", // # (J)
"1a26338f0d905e295fccb71fa9ea849ffa12aaf4" // # (A)
private static PremineRaw[] premine = new PremineRaw[]{
new PremineRaw(Hex.decode("dbdbdb2cbd23b783741e8d7fcf51e459b497e4a6"), PREMINE_AMOUNT, WEI),
new PremineRaw(Hex.decode("e6716f9544a56c530d868e4bfbacb172315bdead"), PREMINE_AMOUNT, WEI),
new PremineRaw(Hex.decode("b9c015918bdaba24b4ff057a92a3873d6eb201be"), PREMINE_AMOUNT, WEI),
new PremineRaw(Hex.decode("1a26338f0d905e295fccb71fa9ea849ffa12aaf4"), PREMINE_AMOUNT, WEI),
new PremineRaw(Hex.decode("2ef47100e0787b915105fd5e3f4ff6752079d5cb"), PREMINE_AMOUNT, WEI),
new PremineRaw(Hex.decode("cd2a3d9f938e13cd947ec05abc7fe734df8dd826"), PREMINE_AMOUNT, WEI),
new PremineRaw(Hex.decode("6c386a4b26f73c802f34673f7248bb118f97424a"), PREMINE_AMOUNT, WEI),
new PremineRaw(Hex.decode("e4157b34ea9615cfbde6b4fda419828124b70c78"), PREMINE_AMOUNT, WEI),
new PremineRaw(Hex.decode("b0afc46d9ce366d06ab4952ca27db1d9557ae9fd"), new BigInteger("154162184"), FINNEY),
new PremineRaw(Hex.decode("f6b1e9dc460d4d62cc22ec5f987d726929c0f9f0"), new BigInteger("102774789"), FINNEY),
new PremineRaw(Hex.decode("cc45122d8b7fa0b1eaa6b29e0fb561422a9239d0"), new BigInteger("51387394"), FINNEY),
new PremineRaw(Hex.decode("b7576e9d314df41ec5506494293afb1bd5d3f65d"), new BigInteger("69423399"), FINNEY),
};
private static byte[] zeroHash256 = new byte[32];
private static byte[] zeroHash160 = new byte[20];
private static byte[] zeroHash512 = new byte[64];
@ -68,9 +77,11 @@ public class Genesis extends Block {
Trie state = new TrieImpl(null);
// 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);
state.update(Hex.decode(address), acctState.getEncoded());
for (PremineRaw raw : premine) {
AccountState acctState = new AccountState(BigInteger.ZERO,
raw.getValue().multiply(raw.getDenomination().value()));
state.update(raw.getAddr(), acctState.getEncoded());
}
setStateRoot(state.getRootHash());
@ -83,7 +94,9 @@ public class Genesis extends Block {
return instance;
}
public final static String[] getPremine() {
public final static PremineRaw[] getPremine() {
return premine;
}
}

View File

@ -0,0 +1,28 @@
package org.ethereum.core;
import java.math.BigInteger;
public class PremineRaw {
byte[] addr;
BigInteger value;
Denomination denomination;
public PremineRaw(byte[] addr, BigInteger value, Denomination denomination) {
this.addr = addr;
this.value = value;
this.denomination = denomination;
}
public byte[] getAddr() {
return addr;
}
public BigInteger getValue() {
return value;
}
public Denomination getDenomination() {
return denomination;
}
}

View File

@ -1,10 +1,6 @@
package org.ethereum.manager;
import org.ethereum.core.Block;
import org.ethereum.core.Genesis;
import org.ethereum.core.Transaction;
import org.ethereum.core.TransactionReceipt;
import org.ethereum.core.Wallet;
import org.ethereum.core.*;
import org.ethereum.crypto.HashUtil;
import org.ethereum.db.BlockStore;
import org.ethereum.facade.Blockchain;
@ -146,9 +142,10 @@ public class WorldManager {
Block bestBlock = blockStore.getBestBlock();
if (bestBlock == null) {
logger.info("DB is empty - adding Genesis");
for (String address : Genesis.getPremine()) {
repository.createAccount(Hex.decode(address));
repository.addBalance(Hex.decode(address), Genesis.PREMINE_AMOUNT);
for (PremineRaw raw : Genesis.getPremine()) {
repository.createAccount(raw.getAddr());
repository.addBalance(raw.getAddr(), raw.getValue().multiply(raw.getDenomination().value()));
}
blockStore.saveBlock(Genesis.getInstance(), new ArrayList<TransactionReceipt>());

View File

@ -54,7 +54,7 @@ import static org.ethereum.net.message.StaticMessages.GET_TRANSACTIONS_MESSAGE;
@Scope("prototype")
public class EthHandler extends SimpleChannelInboundHandler<EthMessage> {
public final static byte VERSION = 53;
public final static byte VERSION = 54;
public final static byte NETWORK_ID = 0x0;
private final static Logger logger = LoggerFactory.getLogger("net");

View File

@ -55,7 +55,7 @@ import static org.ethereum.net.message.StaticMessages.*;
@Scope("prototype")
public class P2pHandler extends SimpleChannelInboundHandler<P2pMessage> {
public final static byte VERSION = 2;
public final static byte VERSION = 3;
private final static Logger logger = LoggerFactory.getLogger("net");

View File

@ -64,6 +64,9 @@ public class BlockTest {
private String PoC7_GENESIS_HEX_RLP_ENCODED = "f9012ef90129a00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347940000000000000000000000000000000000000000a0156df8ef53c723b40f97aff55dd785489cae8b457495916147687746bd5ee077a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b840000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000080830f4240808080a004994f67dc55b09e814ab7ffc8df3686b4afb2bb53e60eae97ef043fe03fb829c0c0";
private String PoC7_GENESIS_HEX_HASH = "c9cb614fddd89b3bc6e2f0ed1f8e58e8a0d826612a607a6151be6f39c991a941";
private String PoC8_GENESIS_HEX_HASH = "32d9162f861a01bc8274e70b3cdb9d688fd7d8566f2f8c25cf1a882f244081c4";
String block_2 = "f8b5f8b1a0cf4b25b08b39350304fe12a16e4216c01a426f8f3dbf0d392b5b45"
+ "8ffb6a399da01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a1"
+ "42fd40d493479476f5eabe4b342ee56b8ceba6ab2a770c3e2198e7a08a22d58b"
@ -98,7 +101,7 @@ public class BlockTest {
worldManager.reset();
}
@Ignore
@Test /* got from go guy */
public void testGenesisFromRLP() {
// from RLP encoding
@ -117,8 +120,8 @@ public class BlockTest {
logger.info("genesis hash: [{}]", Hex.toHexString(genesis.getHash()));
logger.info("genesis rlp: [{}]", Hex.toHexString(genesis.getEncoded()));
assertEquals(PoC7_GENESIS_HEX_HASH, Hex.toHexString(genesis.getHash()));
assertEquals(PoC7_GENESIS_HEX_RLP_ENCODED, Hex.toHexString(genesis.getEncoded()));
assertEquals(PoC8_GENESIS_HEX_HASH, Hex.toHexString(genesis.getHash()));
// assertEquals(PoC7_GENESIS_HEX_RLP_ENCODED, Hex.toHexString(genesis.getEncoded()));
}
@Test /* block without transactions - block#32 in PoC5 cpp-chain */

View File

@ -1,5 +1,6 @@
package test.ethereum.core;
import org.ethereum.core.PremineRaw;
import test.ethereum.db.MockDB;
import org.ethereum.core.AccountState;
@ -22,7 +23,7 @@ import static org.junit.Assert.assertEquals;
public class StateTest {
private static final String GENESIS_STATE_ROOT = "156df8ef53c723b40f97aff55dd785489cae8b457495916147687746bd5ee077";
private static final String GENESIS_STATE_ROOT = "7e204dc9cfb7acdf062ff0b8052f7fcb0b7e6593754773967932ce458d134af3";
private static final Logger logger = LoggerFactory.getLogger("test");
@ -45,7 +46,7 @@ public class StateTest {
// 4) calc the root
Trie trie = generateGenesisState();
String expected = "aa5dd963f3a1582a0ba0226ad03a076e1e723e87d1a9c28222108ace58a96c97";
String expected = "c12b4d771fbcc0d56ec106f8d465d24b9d4c36d60275bbafa7d69694d6708660";
// Get and update sender in world state
byte[] cowAddress = Hex.decode("cd2a3d9f938e13cd947ec05abc7fe734df8dd826");
@ -113,10 +114,13 @@ public class StateTest {
private Trie generateGenesisState() {
Trie trie = new TrieImpl(new MockDB());
for (String address : Genesis.getPremine()) {
AccountState acct = new AccountState(BigInteger.ZERO, BigInteger.valueOf(2).pow(200));
trie.update(Hex.decode(address), acct.getEncoded());
for (PremineRaw raw : Genesis.getPremine()) {
AccountState acctState = new AccountState(BigInteger.ZERO,
raw.getValue().multiply(raw.getDenomination().value()));
trie.update(raw.getAddr(), acctState.getEncoded());
}
return trie;
}
}

View File

@ -2,6 +2,7 @@ package test.ethereum.db;
import org.ethereum.config.SystemProperties;
import org.ethereum.core.Genesis;
import org.ethereum.core.PremineRaw;
import org.ethereum.crypto.HashUtil;
import org.ethereum.datasource.LevelDbDataSource;
import org.ethereum.db.RepositoryImpl;
@ -348,8 +349,8 @@ public class RepositoryTest {
Repository repository = new RepositoryImpl(new LevelDbDataSource(), new LevelDbDataSource());
Repository track = repository.startTracking();
for (String address : Genesis.getPremine()) {
track.addBalance(Hex.decode(address), Genesis.PREMINE_AMOUNT);
for (PremineRaw raw : Genesis.getPremine()) {
track.addBalance(raw.getAddr(), raw.getValue().multiply(raw.getDenomination().value()));
}
track.commit();