mirror of https://github.com/poanetwork/quorum.git
Added a validateConsensus() which exits geth if no consensus is speci… (#540)
Validate for a Quorum supported consensus and exit if no consensus is specified.
This commit is contained in:
parent
40f7d2b8b4
commit
2ad2e0b4bf
|
@ -264,3 +264,17 @@ func RegisterRaftService(stack *node.Node, ctx *cli.Context, cfg gethConfig, eth
|
|||
}
|
||||
|
||||
}
|
||||
|
||||
// quorumValidateConsensus checks if a consensus was used. The node is killed if consensus was not used
|
||||
func quorumValidateConsensus(stack *node.Node, isRaft bool) {
|
||||
var ethereum *eth.Ethereum
|
||||
|
||||
err := stack.Service(ðereum)
|
||||
if err != nil {
|
||||
utils.Fatalf("Error retrieving Ethereum service: %v", err)
|
||||
}
|
||||
|
||||
if !isRaft && ethereum.ChainConfig().Istanbul == nil && ethereum.ChainConfig().Clique == nil {
|
||||
utils.Fatalf("Consensus not specified. Exiting!!")
|
||||
}
|
||||
}
|
||||
|
|
|
@ -18,6 +18,7 @@ package main
|
|||
|
||||
import (
|
||||
"crypto/rand"
|
||||
"io/ioutil"
|
||||
"math/big"
|
||||
"os"
|
||||
"path/filepath"
|
||||
|
@ -31,18 +32,52 @@ import (
|
|||
)
|
||||
|
||||
const (
|
||||
ipcAPIs = "admin:1.0 debug:1.0 eth:1.0 miner:1.0 net:1.0 personal:1.0 rpc:1.0 shh:1.0 txpool:1.0 web3:1.0"
|
||||
ipcAPIs = "admin:1.0 debug:1.0 eth:1.0 istanbul:1.0 miner:1.0 net:1.0 personal:1.0 rpc:1.0 shh:1.0 txpool:1.0 web3:1.0"
|
||||
httpAPIs = "eth:1.0 net:1.0 rpc:1.0 web3:1.0"
|
||||
nodeKey = "b68c0338aa4b266bf38ebe84c6199ae9fac8b29f32998b3ed2fbeafebe8d65c9"
|
||||
)
|
||||
|
||||
var genesis = `{
|
||||
"config": {
|
||||
"chainId": 2017,
|
||||
"homesteadBlock": 1,
|
||||
"eip150Block": 2,
|
||||
"eip150Hash": "0x0000000000000000000000000000000000000000000000000000000000000000",
|
||||
"eip155Block": 3,
|
||||
"eip158Block": 3,
|
||||
"istanbul": {
|
||||
"epoch": 30000,
|
||||
"policy": 0
|
||||
}
|
||||
},
|
||||
"nonce": "0x0",
|
||||
"timestamp": "0x0",
|
||||
"gasLimit": "0x47b760",
|
||||
"difficulty": "0x1",
|
||||
"mixHash": "0x63746963616c2062797a616e74696e65206661756c7420746f6c6572616e6365",
|
||||
"coinbase": "0x0000000000000000000000000000000000000000",
|
||||
"alloc": {
|
||||
"491937757d1b26e29c507b8d4c0b233c2747e68d": {
|
||||
"balance": "0x446c3b15f9926687d2c40534fdb564000000000000"
|
||||
}
|
||||
},
|
||||
"number": "0x0",
|
||||
"gasUsed": "0x0",
|
||||
"parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000"
|
||||
}
|
||||
`
|
||||
|
||||
// Tests that a node embedded within a console can be started up properly and
|
||||
// then terminated by closing the input stream.
|
||||
func TestConsoleWelcome(t *testing.T) {
|
||||
coinbase := "0x8605cdbbdb6d264aa742e77020dcbc58fcdce182"
|
||||
coinbase := "0x491937757d1b26e29c507b8d4c0b233c2747e68d"
|
||||
|
||||
datadir := setupIstanbul(t)
|
||||
defer os.RemoveAll(datadir)
|
||||
|
||||
// Start a geth console, make sure it's cleaned up and terminate the console
|
||||
geth := runGeth(t,
|
||||
"--port", "0", "--maxpeers", "0", "--nodiscover", "--nat", "none",
|
||||
"--datadir", datadir, "--port", "0", "--maxpeers", "0", "--nodiscover", "--nat", "none",
|
||||
"--etherbase", coinbase, "--shh",
|
||||
"console")
|
||||
|
||||
|
@ -72,19 +107,22 @@ at block: 0 ({{niltime}})
|
|||
// Tests that a console can be attached to a running node via various means.
|
||||
func TestIPCAttachWelcome(t *testing.T) {
|
||||
// Configure the instance for IPC attachement
|
||||
coinbase := "0x8605cdbbdb6d264aa742e77020dcbc58fcdce182"
|
||||
coinbase := "0x491937757d1b26e29c507b8d4c0b233c2747e68d"
|
||||
var ipc string
|
||||
|
||||
datadir := setupIstanbul(t)
|
||||
defer os.RemoveAll(datadir)
|
||||
|
||||
if runtime.GOOS == "windows" {
|
||||
ipc = `\\.\pipe\geth` + strconv.Itoa(trulyRandInt(100000, 999999))
|
||||
} else {
|
||||
ws := tmpdir(t)
|
||||
defer os.RemoveAll(ws)
|
||||
ipc = filepath.Join(ws, "geth.ipc")
|
||||
ipc = filepath.Join(datadir, "geth.ipc")
|
||||
}
|
||||
|
||||
// Note: we need --shh because testAttachWelcome checks for default
|
||||
// list of ipc modules and shh is included there.
|
||||
geth := runGeth(t,
|
||||
"--port", "0", "--maxpeers", "0", "--nodiscover", "--nat", "none",
|
||||
"--datadir", datadir, "--port", "0", "--maxpeers", "0", "--nodiscover", "--nat", "none",
|
||||
"--etherbase", coinbase, "--shh", "--ipcpath", ipc)
|
||||
|
||||
time.Sleep(2 * time.Second) // Simple way to wait for the RPC endpoint to open
|
||||
|
@ -95,10 +133,14 @@ func TestIPCAttachWelcome(t *testing.T) {
|
|||
}
|
||||
|
||||
func TestHTTPAttachWelcome(t *testing.T) {
|
||||
coinbase := "0x8605cdbbdb6d264aa742e77020dcbc58fcdce182"
|
||||
coinbase := "0x491937757d1b26e29c507b8d4c0b233c2747e68d"
|
||||
port := strconv.Itoa(trulyRandInt(1024, 65536)) // Yeah, sometimes this will fail, sorry :P
|
||||
|
||||
datadir := setupIstanbul(t)
|
||||
defer os.RemoveAll(datadir)
|
||||
|
||||
geth := runGeth(t,
|
||||
"--port", "0", "--maxpeers", "0", "--nodiscover", "--nat", "none",
|
||||
"--datadir", datadir, "--port", "0", "--maxpeers", "0", "--nodiscover", "--nat", "none",
|
||||
"--etherbase", coinbase, "--rpc", "--rpcport", port)
|
||||
|
||||
time.Sleep(2 * time.Second) // Simple way to wait for the RPC endpoint to open
|
||||
|
@ -109,11 +151,14 @@ func TestHTTPAttachWelcome(t *testing.T) {
|
|||
}
|
||||
|
||||
func TestWSAttachWelcome(t *testing.T) {
|
||||
coinbase := "0x8605cdbbdb6d264aa742e77020dcbc58fcdce182"
|
||||
coinbase := "0x491937757d1b26e29c507b8d4c0b233c2747e68d"
|
||||
port := strconv.Itoa(trulyRandInt(1024, 65536)) // Yeah, sometimes this will fail, sorry :P
|
||||
|
||||
datadir := setupIstanbul(t)
|
||||
defer os.RemoveAll(datadir)
|
||||
|
||||
geth := runGeth(t,
|
||||
"--port", "0", "--maxpeers", "0", "--nodiscover", "--nat", "none",
|
||||
"--datadir", datadir, "--port", "0", "--maxpeers", "0", "--nodiscover", "--nat", "none",
|
||||
"--etherbase", coinbase, "--ws", "--wsport", port)
|
||||
|
||||
time.Sleep(2 * time.Second) // Simple way to wait for the RPC endpoint to open
|
||||
|
@ -161,3 +206,26 @@ func trulyRandInt(lo, hi int) int {
|
|||
num, _ := rand.Int(rand.Reader, big.NewInt(int64(hi-lo)))
|
||||
return int(num.Int64()) + lo
|
||||
}
|
||||
|
||||
// setupIstanbul creates a temporary directory and copies nodekey and genesis.json.
|
||||
// It initializes istanbul by calling geth init
|
||||
func setupIstanbul(t *testing.T) string {
|
||||
datadir := tmpdir(t)
|
||||
gethPath := filepath.Join(datadir, "geth")
|
||||
os.Mkdir(gethPath, 0700)
|
||||
|
||||
// Initialize the data directory with the custom genesis block
|
||||
json := filepath.Join(datadir, "genesis.json")
|
||||
if err := ioutil.WriteFile(json, []byte(genesis), 0600); err != nil {
|
||||
t.Fatalf("failed to write genesis file: %v", err)
|
||||
}
|
||||
|
||||
nodeKeyFile := filepath.Join(gethPath, "nodekey")
|
||||
if err := ioutil.WriteFile(nodeKeyFile, []byte(nodeKey), 0600); err != nil {
|
||||
t.Fatalf("failed to write nodekey file: %v", err)
|
||||
}
|
||||
|
||||
runGeth(t, "--datadir", datadir, "init", json).WaitExit()
|
||||
|
||||
return datadir
|
||||
}
|
||||
|
|
|
@ -216,6 +216,10 @@ func main() {
|
|||
func geth(ctx *cli.Context) error {
|
||||
node := makeFullNode(ctx)
|
||||
startNode(ctx, node)
|
||||
|
||||
// Check if a valid consensus is used
|
||||
quorumValidateConsensus(node, ctx.GlobalBool(utils.RaftModeFlag.Name))
|
||||
|
||||
node.Wait()
|
||||
return nil
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue