From ee8d406f54bcb7341661724e5df809b6ed8706c2 Mon Sep 17 00:00:00 2001 From: Alexey Akhunov Date: Mon, 18 Jun 2018 22:10:29 +0100 Subject: [PATCH] Writing Ethereum genesis block and reading from it --- Gopkg.lock | 41 +++++++++++++++++++++++++++++++++++++++-- main.go | 31 ++++++++++++++++++++++++++----- 2 files changed, 65 insertions(+), 7 deletions(-) diff --git a/Gopkg.lock b/Gopkg.lock index e31f752f..a56d7983 100644 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -1,6 +1,12 @@ # This file is autogenerated, do not edit; changes may be undone by the next 'dep ensure'. +[[projects]] + branch = "master" + name = "github.com/aristanetworks/goarista" + packages = ["monotime"] + revision = "59944ff78bc1de686b0aba1444dfd380f48f03d4" + [[projects]] branch = "master" name = "github.com/btcsuite/btcd" @@ -29,16 +35,28 @@ "common", "common/hexutil", "common/math", + "common/mclock", + "consensus", + "consensus/misc", + "core", + "core/rawdb", "core/state", "core/types", + "core/vm", "crypto", + "crypto/bn256", + "crypto/bn256/cloudflare", + "crypto/bn256/google", "crypto/secp256k1", "crypto/sha3", "ethdb", + "event", "log", "metrics", + "p2p/netutil", "params", "rlp", + "rpc", "trie" ] revision = "dea1ce052a10cd7d401a5c04f83f371a06fe293c" @@ -124,6 +142,12 @@ revision = "645ef00459ed84a119197bfb8d8205042c6df63d" version = "v0.8.0" +[[projects]] + name = "github.com/rs/cors" + packages = ["."] + revision = "ca016a06a5753f8ba03029c0aa5e54afb1bf713f" + version = "v1.4.0" + [[projects]] branch = "master" name = "github.com/syndtr/goleveldb" @@ -214,7 +238,8 @@ "http2/hpack", "idna", "internal/timeseries", - "trace" + "trace", + "websocket" ] revision = "db08ff08e8622530d9ed3a0e8ac279f6d4c02196" @@ -268,15 +293,27 @@ revision = "5b3c4e850e90a4cf6a20ebd46c8b32a0a3afcb9e" version = "v1.7.5" +[[projects]] + name = "gopkg.in/fatih/set.v0" + packages = ["."] + revision = "57907de300222151a123d29255ed17f5ed43fad3" + version = "v0.1.0" + [[projects]] branch = "v2" name = "gopkg.in/karalabe/cookiejar.v2" packages = ["collections/prque"] revision = "8dcd6a7f4951f6ff3ee9cbb919a06d8925822e57" +[[projects]] + branch = "v2" + name = "gopkg.in/natefinch/npipe.v2" + packages = ["."] + revision = "c1b8fa8bdccecb0b8db834ee0b92fdbcfa606dd6" + [solve-meta] analyzer-name = "dep" analyzer-version = 1 - inputs-digest = "405903b5cdec5fe831757bd4289ad96436109112bb3ef41be36992969312e8f1" + inputs-digest = "471d91e2c0a3b0b799ddfd79266deb2f4e6e46a1721f9c00680c370f1eb5662f" solver-name = "gps-cdcl" solver-version = 1 diff --git a/main.go b/main.go index 4c0c41db..8321e13e 100644 --- a/main.go +++ b/main.go @@ -5,6 +5,7 @@ import ( "fmt" eth_common "github.com/ethereum/go-ethereum/common" + eth_core "github.com/ethereum/go-ethereum/core" eth_state "github.com/ethereum/go-ethereum/core/state" eth_ethdb "github.com/ethereum/go-ethereum/ethdb" eth_trie "github.com/ethereum/go-ethereum/trie" @@ -184,9 +185,7 @@ func main() { lookupDb := dbm.NewDB("lookup" /* name */, dbm.MemDBBackend, "" /* dir */) addrPreimageDb := dbm.NewDB("addrPreimage" /* name */, dbm.MemDBBackend, "" /* dir */) codeDb := dbm.NewDB("code" /* name */, dbm.MemDBBackend, "" /* dir */) - var d eth_state.Database - var err error - d, err = OurNewDatabase(stateDb, lookupDb, addrPreimageDb, codeDb) + d, err := OurNewDatabase(stateDb, lookupDb, addrPreimageDb, codeDb) if err != nil { panic(err) } @@ -196,7 +195,29 @@ func main() { if err != nil { panic(err) } - // Try something - b := statedb.GetBalance(eth_common.HexToAddress("0x829BD824B016326A401d083B33D092293333A830")) + g := eth_core.DefaultGenesisBlock() + for addr, account := range g.Alloc { + statedb.AddBalance(addr, account.Balance) + statedb.SetCode(addr, account.Code) + statedb.SetNonce(addr, account.Nonce) + for key, value := range account.Storage { + statedb.SetState(addr, key, value) + } + } + + // One of the genesis account having 200 ETH + b := statedb.GetBalance(eth_common.HexToAddress("0x756F45E3FA69347A9A973A725E3C98bC4db0b5a0")) fmt.Printf("Balance: %s\n", b) + root, err := statedb.Commit(false /* deleteEmptyObjects */) + if err != nil { + panic(err) + } + fmt.Printf("Genesis state root hash: %x\n", root[:]) + // Try to create a new statedb from genesis hash + genesis_state, err := eth_state.New(root, d) + if err != nil { + panic(err) + } + b1 := genesis_state.GetBalance(eth_common.HexToAddress("0x756F45E3FA69347A9A973A725E3C98bC4db0b5a0")) + fmt.Printf("Balance reloaded: %s\n", b1) } \ No newline at end of file