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 (
|
2023-02-09 11:48:34 +03:00
|
|
|
"fmt"
|
2022-05-16 12:59:35 +03:00
|
|
|
"os"
|
2016-07-08 11:43:36 +03:00
|
|
|
"path/filepath"
|
2023-02-09 11:48:34 +03:00
|
|
|
"strconv"
|
2016-07-08 11:43:36 +03:00
|
|
|
"testing"
|
|
|
|
)
|
|
|
|
|
|
|
|
var customGenesisTests = []struct {
|
|
|
|
genesis string
|
|
|
|
query string
|
|
|
|
result string
|
|
|
|
}{
|
|
|
|
// Genesis file with an empty chain configuration (ensure missing fields work)
|
|
|
|
{
|
|
|
|
genesis: `{
|
|
|
|
"alloc" : {},
|
|
|
|
"coinbase" : "0x0000000000000000000000000000000000000000",
|
|
|
|
"difficulty" : "0x20000",
|
|
|
|
"extraData" : "",
|
|
|
|
"gasLimit" : "0x2fefd8",
|
2020-04-02 13:27:44 +03:00
|
|
|
"nonce" : "0x0000000000001338",
|
2016-07-08 11:43:36 +03:00
|
|
|
"mixhash" : "0x0000000000000000000000000000000000000000000000000000000000000000",
|
|
|
|
"parentHash" : "0x0000000000000000000000000000000000000000000000000000000000000000",
|
|
|
|
"timestamp" : "0x00",
|
2023-05-03 12:58:39 +03:00
|
|
|
"config" : {
|
|
|
|
"terminalTotalDifficultyPassed": true
|
|
|
|
}
|
2016-07-08 11:43:36 +03:00
|
|
|
}`,
|
|
|
|
query: "eth.getBlock(0).nonce",
|
2020-04-02 13:27:44 +03:00
|
|
|
result: "0x0000000000001338",
|
2016-07-08 11:43:36 +03:00
|
|
|
},
|
|
|
|
// Genesis file with specific chain configurations
|
|
|
|
{
|
|
|
|
genesis: `{
|
|
|
|
"alloc" : {},
|
|
|
|
"coinbase" : "0x0000000000000000000000000000000000000000",
|
|
|
|
"difficulty" : "0x20000",
|
|
|
|
"extraData" : "",
|
|
|
|
"gasLimit" : "0x2fefd8",
|
2020-04-02 13:27:44 +03:00
|
|
|
"nonce" : "0x0000000000001339",
|
2016-07-08 11:43:36 +03:00
|
|
|
"mixhash" : "0x0000000000000000000000000000000000000000000000000000000000000000",
|
|
|
|
"parentHash" : "0x0000000000000000000000000000000000000000000000000000000000000000",
|
|
|
|
"timestamp" : "0x00",
|
|
|
|
"config" : {
|
2023-05-03 12:58:39 +03:00
|
|
|
"homesteadBlock" : 42,
|
|
|
|
"daoForkBlock" : 141,
|
|
|
|
"daoForkSupport" : true,
|
|
|
|
"terminalTotalDifficultyPassed" : true
|
2018-06-21 10:44:39 +03:00
|
|
|
}
|
2016-07-08 11:43:36 +03:00
|
|
|
}`,
|
|
|
|
query: "eth.getBlock(0).nonce",
|
2020-04-02 13:27:44 +03:00
|
|
|
result: "0x0000000000001339",
|
2016-07-08 11:43:36 +03:00
|
|
|
},
|
|
|
|
}
|
|
|
|
|
|
|
|
// Tests that initializing Geth with a custom genesis block and chain definitions
|
|
|
|
// work properly.
|
|
|
|
func TestCustomGenesis(t *testing.T) {
|
2023-02-09 11:48:34 +03:00
|
|
|
t.Parallel()
|
2016-07-08 11:43:36 +03:00
|
|
|
for i, tt := range customGenesisTests {
|
|
|
|
// Create a temporary data directory to use and inspect later
|
2022-04-08 16:44:55 +03:00
|
|
|
datadir := t.TempDir()
|
2016-07-08 11:43:36 +03:00
|
|
|
|
|
|
|
// Initialize the data directory with the custom genesis block
|
|
|
|
json := filepath.Join(datadir, "genesis.json")
|
2022-05-16 12:59:35 +03:00
|
|
|
if err := os.WriteFile(json, []byte(tt.genesis), 0600); err != nil {
|
2016-07-08 11:43:36 +03:00
|
|
|
t.Fatalf("test %d: failed to write genesis file: %v", i, err)
|
|
|
|
}
|
2021-01-13 13:14:36 +03:00
|
|
|
runGeth(t, "--datadir", datadir, "init", json).WaitExit()
|
2016-07-08 11:43:36 +03:00
|
|
|
|
|
|
|
// Query the custom genesis block
|
2021-05-27 11:13:35 +03:00
|
|
|
geth := runGeth(t, "--networkid", "1337", "--syncmode=full", "--cache", "16",
|
2022-07-23 10:56:02 +03:00
|
|
|
"--datadir", datadir, "--maxpeers", "0", "--port", "0", "--authrpc.port", "0",
|
2016-08-25 17:44:35 +03:00
|
|
|
"--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
|
|
|
}
|
|
|
|
}
|
2023-02-09 11:48:34 +03:00
|
|
|
|
|
|
|
// TestCustomBackend that the backend selection and detection (leveldb vs pebble) works properly.
|
|
|
|
func TestCustomBackend(t *testing.T) {
|
|
|
|
t.Parallel()
|
|
|
|
// Test pebble, but only on 64-bit platforms
|
|
|
|
if strconv.IntSize != 64 {
|
|
|
|
t.Skip("Custom backends are only available on 64-bit platform")
|
|
|
|
}
|
|
|
|
genesis := `{
|
|
|
|
"alloc" : {},
|
|
|
|
"coinbase" : "0x0000000000000000000000000000000000000000",
|
|
|
|
"difficulty" : "0x20000",
|
|
|
|
"extraData" : "",
|
|
|
|
"gasLimit" : "0x2fefd8",
|
|
|
|
"nonce" : "0x0000000000001338",
|
|
|
|
"mixhash" : "0x0000000000000000000000000000000000000000000000000000000000000000",
|
|
|
|
"parentHash" : "0x0000000000000000000000000000000000000000000000000000000000000000",
|
|
|
|
"timestamp" : "0x00",
|
2023-05-03 12:58:39 +03:00
|
|
|
"config" : {
|
|
|
|
"terminalTotalDifficultyPassed": true
|
|
|
|
}
|
|
|
|
}`
|
2023-02-09 11:48:34 +03:00
|
|
|
type backendTest struct {
|
|
|
|
initArgs []string
|
|
|
|
initExpect string
|
|
|
|
execArgs []string
|
|
|
|
execExpect string
|
|
|
|
}
|
|
|
|
testfunc := func(t *testing.T, tt backendTest) error {
|
|
|
|
// Create a temporary data directory to use and inspect later
|
|
|
|
datadir := t.TempDir()
|
|
|
|
|
|
|
|
// Initialize the data directory with the custom genesis block
|
|
|
|
json := filepath.Join(datadir, "genesis.json")
|
|
|
|
if err := os.WriteFile(json, []byte(genesis), 0600); err != nil {
|
|
|
|
return fmt.Errorf("failed to write genesis file: %v", err)
|
|
|
|
}
|
|
|
|
{ // Init
|
|
|
|
args := append(tt.initArgs, "--datadir", datadir, "init", json)
|
|
|
|
geth := runGeth(t, args...)
|
|
|
|
geth.ExpectRegexp(tt.initExpect)
|
|
|
|
geth.ExpectExit()
|
|
|
|
}
|
|
|
|
{ // Exec + query
|
|
|
|
args := append(tt.execArgs, "--networkid", "1337", "--syncmode=full", "--cache", "16",
|
|
|
|
"--datadir", datadir, "--maxpeers", "0", "--port", "0", "--authrpc.port", "0",
|
|
|
|
"--nodiscover", "--nat", "none", "--ipcdisable",
|
|
|
|
"--exec", "eth.getBlock(0).nonce", "console")
|
|
|
|
geth := runGeth(t, args...)
|
|
|
|
geth.ExpectRegexp(tt.execExpect)
|
|
|
|
geth.ExpectExit()
|
|
|
|
}
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
for i, tt := range []backendTest{
|
2023-09-07 11:39:29 +03:00
|
|
|
{ // When not specified, it should default to leveldb
|
|
|
|
execArgs: []string{"--db.engine", "leveldb"},
|
2023-02-09 11:48:34 +03:00
|
|
|
execExpect: "0x0000000000001338",
|
|
|
|
},
|
|
|
|
{ // Explicit leveldb
|
|
|
|
initArgs: []string{"--db.engine", "leveldb"},
|
|
|
|
execArgs: []string{"--db.engine", "leveldb"},
|
|
|
|
execExpect: "0x0000000000001338",
|
|
|
|
},
|
|
|
|
{ // Explicit leveldb first, then autodiscover
|
|
|
|
initArgs: []string{"--db.engine", "leveldb"},
|
|
|
|
execExpect: "0x0000000000001338",
|
|
|
|
},
|
|
|
|
{ // Explicit pebble
|
|
|
|
initArgs: []string{"--db.engine", "pebble"},
|
|
|
|
execArgs: []string{"--db.engine", "pebble"},
|
|
|
|
execExpect: "0x0000000000001338",
|
|
|
|
},
|
|
|
|
{ // Explicit pebble, then auto-discover
|
|
|
|
initArgs: []string{"--db.engine", "pebble"},
|
|
|
|
execExpect: "0x0000000000001338",
|
|
|
|
},
|
|
|
|
{ // Can't start pebble on top of leveldb
|
|
|
|
initArgs: []string{"--db.engine", "leveldb"},
|
|
|
|
execArgs: []string{"--db.engine", "pebble"},
|
all: activate pbss as experimental feature from eth (#26274)
* all: activate pbss
* core/rawdb: fix compilation error
* cma, core, eth, les, trie: address comments
* cmd, core, eth, trie: polish code
* core, cmd, eth: address comments
* cmd, core, eth, les, light, tests: address comment
* cmd/utils: shorten log message
* trie/triedb/pathdb: limit node buffer size to 1gb
* cmd/utils: fix opening non-existing db
* cmd/utils: rename flag name
* cmd, core: group chain history flags and fix tests
* core, eth, trie: fix memory leak in snapshot generation
* cmd, eth, internal: deprecate flags
* all: enable state tests for pathdb, fixes
* cmd, core: polish code
* trie/triedb/pathdb: limit the node buffer size to 256mb
---------
Co-authored-by: Martin Holst Swende <martin@swende.se>
Co-authored-by: Péter Szilágyi <peterke@gmail.com>
2023-08-10 22:21:36 +03:00
|
|
|
execExpect: `Fatal: Could not open database: db.engine choice was pebble but found pre-existing leveldb database in specified data directory`,
|
2023-02-09 11:48:34 +03:00
|
|
|
},
|
|
|
|
{ // Can't start leveldb on top of pebble
|
|
|
|
initArgs: []string{"--db.engine", "pebble"},
|
|
|
|
execArgs: []string{"--db.engine", "leveldb"},
|
all: activate pbss as experimental feature from eth (#26274)
* all: activate pbss
* core/rawdb: fix compilation error
* cma, core, eth, les, trie: address comments
* cmd, core, eth, trie: polish code
* core, cmd, eth: address comments
* cmd, core, eth, les, light, tests: address comment
* cmd/utils: shorten log message
* trie/triedb/pathdb: limit node buffer size to 1gb
* cmd/utils: fix opening non-existing db
* cmd/utils: rename flag name
* cmd, core: group chain history flags and fix tests
* core, eth, trie: fix memory leak in snapshot generation
* cmd, eth, internal: deprecate flags
* all: enable state tests for pathdb, fixes
* cmd, core: polish code
* trie/triedb/pathdb: limit the node buffer size to 256mb
---------
Co-authored-by: Martin Holst Swende <martin@swende.se>
Co-authored-by: Péter Szilágyi <peterke@gmail.com>
2023-08-10 22:21:36 +03:00
|
|
|
execExpect: `Fatal: Could not open database: db.engine choice was leveldb but found pre-existing pebble database in specified data directory`,
|
2023-02-09 11:48:34 +03:00
|
|
|
},
|
|
|
|
{ // Reject invalid backend choice
|
|
|
|
initArgs: []string{"--db.engine", "mssql"},
|
|
|
|
initExpect: `Fatal: Invalid choice for db.engine 'mssql', allowed 'leveldb' or 'pebble'`,
|
|
|
|
// Since the init fails, this will return the (default) mainnet genesis
|
|
|
|
// block nonce
|
|
|
|
execExpect: `0x0000000000000042`,
|
|
|
|
},
|
|
|
|
} {
|
|
|
|
if err := testfunc(t, tt); err != nil {
|
|
|
|
t.Fatalf("test %d-leveldb: %v", i, err)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|