2016-07-08 11:43:36 +03:00
|
|
|
// Copyright 2016 The go-ethereum Authors
|
|
|
|
// This file is part of go-ethereum.
|
|
|
|
//
|
|
|
|
// go-ethereum is free software: you can redistribute it and/or modify
|
|
|
|
// it under the terms of the GNU General Public License as published by
|
|
|
|
// the Free Software Foundation, either version 3 of the License, or
|
|
|
|
// (at your option) any later version.
|
|
|
|
//
|
|
|
|
// go-ethereum is distributed in the hope that it will be useful,
|
|
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
// GNU General Public License for more details.
|
|
|
|
//
|
|
|
|
// You should have received a copy of the GNU General Public License
|
|
|
|
// along with go-ethereum. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
|
|
|
|
package main
|
|
|
|
|
|
|
|
import (
|
|
|
|
"io/ioutil"
|
|
|
|
"os"
|
|
|
|
"path/filepath"
|
|
|
|
"testing"
|
|
|
|
)
|
|
|
|
|
|
|
|
var customGenesisTests = []struct {
|
|
|
|
genesis string
|
|
|
|
query string
|
|
|
|
result string
|
|
|
|
}{
|
|
|
|
// Plain genesis file without anything extra
|
|
|
|
{
|
|
|
|
genesis: `{
|
|
|
|
"alloc" : {},
|
|
|
|
"coinbase" : "0x0000000000000000000000000000000000000000",
|
|
|
|
"difficulty" : "0x20000",
|
|
|
|
"extraData" : "",
|
|
|
|
"gasLimit" : "0x2fefd8",
|
|
|
|
"nonce" : "0x0000000000000042",
|
|
|
|
"mixhash" : "0x0000000000000000000000000000000000000000000000000000000000000000",
|
|
|
|
"parentHash" : "0x0000000000000000000000000000000000000000000000000000000000000000",
|
|
|
|
"timestamp" : "0x00"
|
|
|
|
}`,
|
|
|
|
query: "eth.getBlock(0).nonce",
|
|
|
|
result: "0x0000000000000042",
|
|
|
|
},
|
|
|
|
// Genesis file with an empty chain configuration (ensure missing fields work)
|
|
|
|
{
|
|
|
|
genesis: `{
|
|
|
|
"alloc" : {},
|
|
|
|
"coinbase" : "0x0000000000000000000000000000000000000000",
|
|
|
|
"difficulty" : "0x20000",
|
|
|
|
"extraData" : "",
|
|
|
|
"gasLimit" : "0x2fefd8",
|
|
|
|
"nonce" : "0x0000000000000042",
|
|
|
|
"mixhash" : "0x0000000000000000000000000000000000000000000000000000000000000000",
|
|
|
|
"parentHash" : "0x0000000000000000000000000000000000000000000000000000000000000000",
|
|
|
|
"timestamp" : "0x00",
|
|
|
|
"config" : {}
|
|
|
|
}`,
|
|
|
|
query: "eth.getBlock(0).nonce",
|
|
|
|
result: "0x0000000000000042",
|
|
|
|
},
|
|
|
|
// Genesis file with specific chain configurations
|
|
|
|
{
|
|
|
|
genesis: `{
|
|
|
|
"alloc" : {},
|
|
|
|
"coinbase" : "0x0000000000000000000000000000000000000000",
|
|
|
|
"difficulty" : "0x20000",
|
|
|
|
"extraData" : "",
|
|
|
|
"gasLimit" : "0x2fefd8",
|
|
|
|
"nonce" : "0x0000000000000042",
|
|
|
|
"mixhash" : "0x0000000000000000000000000000000000000000000000000000000000000000",
|
|
|
|
"parentHash" : "0x0000000000000000000000000000000000000000000000000000000000000000",
|
|
|
|
"timestamp" : "0x00",
|
|
|
|
"config" : {
|
|
|
|
"homesteadBlock" : 314,
|
2016-07-08 18:48:17 +03:00
|
|
|
"daoForkBlock" : 141,
|
|
|
|
"daoForkSupport" : true
|
2018-06-21 10:44:39 +03:00
|
|
|
}
|
2016-07-08 11:43:36 +03:00
|
|
|
}`,
|
|
|
|
query: "eth.getBlock(0).nonce",
|
|
|
|
result: "0x0000000000000042",
|
|
|
|
},
|
|
|
|
}
|
|
|
|
|
|
|
|
// Tests that initializing Geth with a custom genesis block and chain definitions
|
|
|
|
// work properly.
|
|
|
|
func TestCustomGenesis(t *testing.T) {
|
|
|
|
for i, tt := range customGenesisTests {
|
|
|
|
// Create a temporary data directory to use and inspect later
|
|
|
|
datadir := tmpdir(t)
|
|
|
|
defer os.RemoveAll(datadir)
|
|
|
|
|
|
|
|
// Initialize the data directory with the custom genesis block
|
|
|
|
json := filepath.Join(datadir, "genesis.json")
|
|
|
|
if err := ioutil.WriteFile(json, []byte(tt.genesis), 0600); err != nil {
|
|
|
|
t.Fatalf("test %d: failed to write genesis file: %v", i, err)
|
|
|
|
}
|
2017-06-21 15:54:23 +03:00
|
|
|
runGeth(t, "--datadir", datadir, "init", json).WaitExit()
|
2016-07-08 11:43:36 +03:00
|
|
|
|
|
|
|
// Query the custom genesis block
|
2016-08-25 17:44:35 +03:00
|
|
|
geth := runGeth(t,
|
|
|
|
"--datadir", datadir, "--maxpeers", "0", "--port", "0",
|
|
|
|
"--nodiscover", "--nat", "none", "--ipcdisable",
|
|
|
|
"--exec", tt.query, "console")
|
2017-06-21 15:54:23 +03:00
|
|
|
geth.ExpectRegexp(tt.result)
|
|
|
|
geth.ExpectExit()
|
2016-07-08 11:43:36 +03:00
|
|
|
}
|
|
|
|
}
|