Unverified Commit 1bea4b0d authored by Felix Lange's avatar Felix Lange Committed by GitHub

miner/stress: initialize account backends explicitly (#23699)

node.Node no longer registers any account manager backends by default,
they need to be registered explicitly.

For ethash-based tests, we actually don't need any accounts in the miner
keystore. Just set the etherbase instead to make mining work. For
clique, the signer account must be in the keystore.

The change also adds interrupt handling in stress tests.
parent ee120ef8
...@@ -23,10 +23,9 @@ import ( ...@@ -23,10 +23,9 @@ import (
"math/big" "math/big"
"math/rand" "math/rand"
"os" "os"
"path/filepath" "os/signal"
"time" "time"
"github.com/ethereum/go-ethereum/accounts/keystore"
"github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/common/fdlimit" "github.com/ethereum/go-ethereum/common/fdlimit"
"github.com/ethereum/go-ethereum/consensus/ethash" "github.com/ethereum/go-ethereum/consensus/ethash"
...@@ -58,12 +57,17 @@ func main() { ...@@ -58,12 +57,17 @@ func main() {
faucets[i], _ = crypto.GenerateKey() faucets[i], _ = crypto.GenerateKey()
} }
// Pre-generate the ethash mining DAG so we don't race // Pre-generate the ethash mining DAG so we don't race
ethash.MakeDataset(1, filepath.Join(os.Getenv("HOME"), ".ethash")) ethash.MakeDataset(1, ethconfig.Defaults.Ethash.DatasetDir)
// Create an Ethash network based off of the Ropsten config // Create an Ethash network based off of the Ropsten config
genesis := makeGenesis(faucets) genesis := makeGenesis(faucets)
// Handle interrupts.
interruptCh := make(chan os.Signal, 5)
signal.Notify(interruptCh, os.Interrupt)
var ( var (
stacks []*node.Node
nodes []*eth.Ethereum nodes []*eth.Ethereum
enodes []*enode.Node enodes []*enode.Node
) )
...@@ -85,12 +89,6 @@ func main() { ...@@ -85,12 +89,6 @@ func main() {
// Start tracking the node and its enode // Start tracking the node and its enode
nodes = append(nodes, ethBackend) nodes = append(nodes, ethBackend)
enodes = append(enodes, stack.Server().Self()) enodes = append(enodes, stack.Server().Self())
// Inject the signer key and start sealing with it
store := stack.AccountManager().Backends(keystore.KeyStoreType)[0].(*keystore.KeyStore)
if _, err := store.NewAccount(""); err != nil {
panic(err)
}
} }
// Iterate over all the nodes and start mining // Iterate over all the nodes and start mining
...@@ -111,6 +109,16 @@ func main() { ...@@ -111,6 +109,16 @@ func main() {
signer = types.LatestSignerForChainID(genesis.Config.ChainID) signer = types.LatestSignerForChainID(genesis.Config.ChainID)
) )
for { for {
// Stop when interrupted.
select {
case <-interruptCh:
for _, node := range stacks {
node.Close()
}
return
default:
}
// Pick a random mining node // Pick a random mining node
index := rand.Intn(len(faucets)) index := rand.Intn(len(faucets))
backend := nodes[index%len(nodes)] backend := nodes[index%len(nodes)]
...@@ -242,9 +250,10 @@ func makeMiner(genesis *core.Genesis) (*node.Node, *eth.Ethereum, error) { ...@@ -242,9 +250,10 @@ func makeMiner(genesis *core.Genesis) (*node.Node, *eth.Ethereum, error) {
GPO: ethconfig.Defaults.GPO, GPO: ethconfig.Defaults.GPO,
Ethash: ethconfig.Defaults.Ethash, Ethash: ethconfig.Defaults.Ethash,
Miner: miner.Config{ Miner: miner.Config{
GasCeil: genesis.GasLimit * 11 / 10, Etherbase: common.Address{1},
GasPrice: big.NewInt(1), GasCeil: genesis.GasLimit * 11 / 10,
Recommit: time.Second, GasPrice: big.NewInt(1),
Recommit: time.Second,
}, },
}) })
if err != nil { if err != nil {
......
...@@ -24,6 +24,7 @@ import ( ...@@ -24,6 +24,7 @@ import (
"math/big" "math/big"
"math/rand" "math/rand"
"os" "os"
"os/signal"
"time" "time"
"github.com/ethereum/go-ethereum/accounts/keystore" "github.com/ethereum/go-ethereum/accounts/keystore"
...@@ -59,11 +60,15 @@ func main() { ...@@ -59,11 +60,15 @@ func main() {
// Create a Clique network based off of the Rinkeby config // Create a Clique network based off of the Rinkeby config
genesis := makeGenesis(faucets, sealers) genesis := makeGenesis(faucets, sealers)
// Handle interrupts.
interruptCh := make(chan os.Signal, 5)
signal.Notify(interruptCh, os.Interrupt)
var ( var (
stacks []*node.Node
nodes []*eth.Ethereum nodes []*eth.Ethereum
enodes []*enode.Node enodes []*enode.Node
) )
for _, sealer := range sealers { for _, sealer := range sealers {
// Start the node and wait until it's up // Start the node and wait until it's up
stack, ethBackend, err := makeSealer(genesis) stack, ethBackend, err := makeSealer(genesis)
...@@ -80,18 +85,20 @@ func main() { ...@@ -80,18 +85,20 @@ func main() {
stack.Server().AddPeer(n) stack.Server().AddPeer(n)
} }
// Start tracking the node and its enode // Start tracking the node and its enode
stacks = append(stacks, stack)
nodes = append(nodes, ethBackend) nodes = append(nodes, ethBackend)
enodes = append(enodes, stack.Server().Self()) enodes = append(enodes, stack.Server().Self())
// Inject the signer key and start sealing with it // Inject the signer key and start sealing with it
store := stack.AccountManager().Backends(keystore.KeyStoreType)[0].(*keystore.KeyStore) ks := keystore.NewKeyStore(stack.KeyStoreDir(), keystore.LightScryptN, keystore.LightScryptP)
signer, err := store.ImportECDSA(sealer, "") signer, err := ks.ImportECDSA(sealer, "")
if err != nil { if err != nil {
panic(err) panic(err)
} }
if err := store.Unlock(signer, ""); err != nil { if err := ks.Unlock(signer, ""); err != nil {
panic(err) panic(err)
} }
stack.AccountManager().AddBackend(ks)
} }
// Iterate over all the nodes and start signing on them // Iterate over all the nodes and start signing on them
...@@ -106,6 +113,16 @@ func main() { ...@@ -106,6 +113,16 @@ func main() {
// Start injecting transactions from the faucet like crazy // Start injecting transactions from the faucet like crazy
nonces := make([]uint64, len(faucets)) nonces := make([]uint64, len(faucets))
for { for {
// Stop when interrupted.
select {
case <-interruptCh:
for _, node := range stacks {
node.Close()
}
return
default:
}
// Pick a random signer node // Pick a random signer node
index := rand.Intn(len(faucets)) index := rand.Intn(len(faucets))
backend := nodes[index%len(nodes)] backend := nodes[index%len(nodes)]
......
...@@ -23,10 +23,9 @@ import ( ...@@ -23,10 +23,9 @@ import (
"math/big" "math/big"
"math/rand" "math/rand"
"os" "os"
"path/filepath" "os/signal"
"time" "time"
"github.com/ethereum/go-ethereum/accounts/keystore"
"github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/common/fdlimit" "github.com/ethereum/go-ethereum/common/fdlimit"
"github.com/ethereum/go-ethereum/consensus/ethash" "github.com/ethereum/go-ethereum/consensus/ethash"
...@@ -54,12 +53,17 @@ func main() { ...@@ -54,12 +53,17 @@ func main() {
faucets[i], _ = crypto.GenerateKey() faucets[i], _ = crypto.GenerateKey()
} }
// Pre-generate the ethash mining DAG so we don't race // Pre-generate the ethash mining DAG so we don't race
ethash.MakeDataset(1, filepath.Join(os.Getenv("HOME"), ".ethash")) ethash.MakeDataset(1, ethconfig.Defaults.Ethash.DatasetDir)
// Create an Ethash network based off of the Ropsten config // Create an Ethash network based off of the Ropsten config
genesis := makeGenesis(faucets) genesis := makeGenesis(faucets)
// Handle interrupts.
interruptCh := make(chan os.Signal, 5)
signal.Notify(interruptCh, os.Interrupt)
var ( var (
stacks []*node.Node
nodes []*eth.Ethereum nodes []*eth.Ethereum
enodes []*enode.Node enodes []*enode.Node
) )
...@@ -79,14 +83,9 @@ func main() { ...@@ -79,14 +83,9 @@ func main() {
stack.Server().AddPeer(n) stack.Server().AddPeer(n)
} }
// Start tracking the node and its enode // Start tracking the node and its enode
stacks = append(stacks, stack)
nodes = append(nodes, ethBackend) nodes = append(nodes, ethBackend)
enodes = append(enodes, stack.Server().Self()) enodes = append(enodes, stack.Server().Self())
// Inject the signer key and start sealing with it
store := stack.AccountManager().Backends(keystore.KeyStoreType)[0].(*keystore.KeyStore)
if _, err := store.NewAccount(""); err != nil {
panic(err)
}
} }
// Iterate over all the nodes and start mining // Iterate over all the nodes and start mining
...@@ -101,6 +100,16 @@ func main() { ...@@ -101,6 +100,16 @@ func main() {
// Start injecting transactions from the faucets like crazy // Start injecting transactions from the faucets like crazy
nonces := make([]uint64, len(faucets)) nonces := make([]uint64, len(faucets))
for { for {
// Stop when interrupted.
select {
case <-interruptCh:
for _, node := range stacks {
node.Close()
}
return
default:
}
// Pick a random mining node // Pick a random mining node
index := rand.Intn(len(faucets)) index := rand.Intn(len(faucets))
backend := nodes[index%len(nodes)] backend := nodes[index%len(nodes)]
...@@ -171,9 +180,10 @@ func makeMiner(genesis *core.Genesis) (*node.Node, *eth.Ethereum, error) { ...@@ -171,9 +180,10 @@ func makeMiner(genesis *core.Genesis) (*node.Node, *eth.Ethereum, error) {
GPO: ethconfig.Defaults.GPO, GPO: ethconfig.Defaults.GPO,
Ethash: ethconfig.Defaults.Ethash, Ethash: ethconfig.Defaults.Ethash,
Miner: miner.Config{ Miner: miner.Config{
GasCeil: genesis.GasLimit * 11 / 10, Etherbase: common.Address{1},
GasPrice: big.NewInt(1), GasCeil: genesis.GasLimit * 11 / 10,
Recommit: time.Second, GasPrice: big.NewInt(1),
Recommit: time.Second,
}, },
}) })
if err != nil { if err != nil {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment