Merge pull request #15241 from karalabe/puppeth-fork-management
cmd/puppeth: support managing fork block in the chain config
This commit is contained in:
commit
4bc60e3aa8
|
@ -161,6 +161,28 @@ func (w *wizard) readDefaultInt(def int) int {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// readDefaultBigInt reads a single line from stdin, trimming if from spaces,
|
||||||
|
// enforcing it to parse into a big integer. If an empty line is entered, the
|
||||||
|
// default value is returned.
|
||||||
|
func (w *wizard) readDefaultBigInt(def *big.Int) *big.Int {
|
||||||
|
for {
|
||||||
|
fmt.Printf("> ")
|
||||||
|
text, err := w.in.ReadString('\n')
|
||||||
|
if err != nil {
|
||||||
|
log.Crit("Failed to read user input", "err", err)
|
||||||
|
}
|
||||||
|
if text = strings.TrimSpace(text); text == "" {
|
||||||
|
return def
|
||||||
|
}
|
||||||
|
val, ok := new(big.Int).SetString(text, 0)
|
||||||
|
if !ok {
|
||||||
|
log.Error("Invalid input, expected big integer")
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
return val
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
// readFloat reads a single line from stdin, trimming if from spaces, enforcing it
|
// readFloat reads a single line from stdin, trimming if from spaces, enforcing it
|
||||||
// to parse into a float.
|
// to parse into a float.
|
||||||
|
|
|
@ -18,7 +18,9 @@ package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"io/ioutil"
|
||||||
"math/big"
|
"math/big"
|
||||||
"math/rand"
|
"math/rand"
|
||||||
"time"
|
"time"
|
||||||
|
@ -135,3 +137,53 @@ func (w *wizard) makeGenesis() {
|
||||||
// All done, store the genesis and flush to disk
|
// All done, store the genesis and flush to disk
|
||||||
w.conf.genesis = genesis
|
w.conf.genesis = genesis
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// manageGenesis permits the modification of chain configuration parameters in
|
||||||
|
// a genesis config and the export of the entire genesis spec.
|
||||||
|
func (w *wizard) manageGenesis() {
|
||||||
|
// Figure out whether to modify or export the genesis
|
||||||
|
fmt.Println()
|
||||||
|
fmt.Println(" 1. Modify existing fork rules")
|
||||||
|
fmt.Println(" 2. Export genesis configuration")
|
||||||
|
|
||||||
|
choice := w.read()
|
||||||
|
switch {
|
||||||
|
case choice == "1":
|
||||||
|
// Fork rule updating requested, iterate over each fork
|
||||||
|
fmt.Println()
|
||||||
|
fmt.Printf("Which block should Homestead come into effect? (default = %v)\n", w.conf.genesis.Config.HomesteadBlock)
|
||||||
|
w.conf.genesis.Config.HomesteadBlock = w.readDefaultBigInt(w.conf.genesis.Config.HomesteadBlock)
|
||||||
|
|
||||||
|
fmt.Println()
|
||||||
|
fmt.Printf("Which block should EIP150 come into effect? (default = %v)\n", w.conf.genesis.Config.EIP150Block)
|
||||||
|
w.conf.genesis.Config.EIP150Block = w.readDefaultBigInt(w.conf.genesis.Config.EIP150Block)
|
||||||
|
|
||||||
|
fmt.Println()
|
||||||
|
fmt.Printf("Which block should EIP155 come into effect? (default = %v)\n", w.conf.genesis.Config.EIP155Block)
|
||||||
|
w.conf.genesis.Config.EIP155Block = w.readDefaultBigInt(w.conf.genesis.Config.EIP155Block)
|
||||||
|
|
||||||
|
fmt.Println()
|
||||||
|
fmt.Printf("Which block should EIP158 come into effect? (default = %v)\n", w.conf.genesis.Config.EIP158Block)
|
||||||
|
w.conf.genesis.Config.EIP158Block = w.readDefaultBigInt(w.conf.genesis.Config.EIP158Block)
|
||||||
|
|
||||||
|
fmt.Println()
|
||||||
|
fmt.Printf("Which block should Byzantium come into effect? (default = %v)\n", w.conf.genesis.Config.ByzantiumBlock)
|
||||||
|
w.conf.genesis.Config.ByzantiumBlock = w.readDefaultBigInt(w.conf.genesis.Config.ByzantiumBlock)
|
||||||
|
|
||||||
|
out, _ := json.MarshalIndent(w.conf.genesis.Config, "", " ")
|
||||||
|
fmt.Printf("Chain configuration updated:\n\n%s\n", out)
|
||||||
|
|
||||||
|
case choice == "2":
|
||||||
|
// Save whatever genesis configuration we currently have
|
||||||
|
fmt.Println()
|
||||||
|
fmt.Printf("Which file to save the genesis into? (default = %s.json)\n", w.network)
|
||||||
|
out, _ := json.MarshalIndent(w.conf.genesis, "", " ")
|
||||||
|
if err := ioutil.WriteFile(w.readDefaultString(fmt.Sprintf("%s.json", w.network)), out, 0644); err != nil {
|
||||||
|
log.Error("Failed to save genesis file", "err", err)
|
||||||
|
}
|
||||||
|
log.Info("Exported existing genesis block")
|
||||||
|
|
||||||
|
default:
|
||||||
|
log.Error("That's not something I can do")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -98,7 +98,7 @@ func (w *wizard) run() {
|
||||||
if w.conf.genesis == nil {
|
if w.conf.genesis == nil {
|
||||||
fmt.Println(" 2. Configure new genesis")
|
fmt.Println(" 2. Configure new genesis")
|
||||||
} else {
|
} else {
|
||||||
fmt.Println(" 2. Save existing genesis")
|
fmt.Println(" 2. Manage existing genesis")
|
||||||
}
|
}
|
||||||
if len(w.servers) == 0 {
|
if len(w.servers) == 0 {
|
||||||
fmt.Println(" 3. Track new remote server")
|
fmt.Println(" 3. Track new remote server")
|
||||||
|
@ -118,18 +118,10 @@ func (w *wizard) run() {
|
||||||
w.networkStats(false)
|
w.networkStats(false)
|
||||||
|
|
||||||
case choice == "2":
|
case choice == "2":
|
||||||
// If we don't have a genesis, make one
|
|
||||||
if w.conf.genesis == nil {
|
if w.conf.genesis == nil {
|
||||||
w.makeGenesis()
|
w.makeGenesis()
|
||||||
} else {
|
} else {
|
||||||
// Otherwise just save whatever we currently have
|
w.manageGenesis()
|
||||||
fmt.Println()
|
|
||||||
fmt.Printf("Which file to save the genesis into? (default = %s.json)\n", w.network)
|
|
||||||
out, _ := json.MarshalIndent(w.conf.genesis, "", " ")
|
|
||||||
if err := ioutil.WriteFile(w.readDefaultString(fmt.Sprintf("%s.json", w.network)), out, 0644); err != nil {
|
|
||||||
log.Error("Failed to save genesis file", "err", err)
|
|
||||||
}
|
|
||||||
log.Info("Exported existing genesis block")
|
|
||||||
}
|
}
|
||||||
case choice == "3":
|
case choice == "3":
|
||||||
if len(w.servers) == 0 {
|
if len(w.servers) == 0 {
|
||||||
|
|
|
@ -129,7 +129,7 @@ func (w *wizard) networkStats(tips bool) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// If a genesis block was found, load it into our configs
|
// If a genesis block was found, load it into our configs
|
||||||
if protips.genesis != "" {
|
if protips.genesis != "" && w.conf.genesis == nil {
|
||||||
genesis := new(core.Genesis)
|
genesis := new(core.Genesis)
|
||||||
if err := json.Unmarshal([]byte(protips.genesis), genesis); err != nil {
|
if err := json.Unmarshal([]byte(protips.genesis), genesis); err != nil {
|
||||||
log.Error("Failed to parse remote genesis", "err", err)
|
log.Error("Failed to parse remote genesis", "err", err)
|
||||||
|
|
Loading…
Reference in New Issue