From edba5e9854dcef9b4dcb6d75c06d5b5c7e5b8856 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A9ter=20Szil=C3=A1gyi?= Date: Wed, 4 Oct 2017 12:15:58 +0300 Subject: [PATCH] cmd/puppeth: support managing fork block in the chain config --- cmd/puppeth/wizard.go | 22 ++++++++++++++ cmd/puppeth/wizard_genesis.go | 52 ++++++++++++++++++++++++++++++++++ cmd/puppeth/wizard_intro.go | 12 ++------ cmd/puppeth/wizard_netstats.go | 2 +- 4 files changed, 77 insertions(+), 11 deletions(-) diff --git a/cmd/puppeth/wizard.go b/cmd/puppeth/wizard.go index 518741279..3fdd639f8 100644 --- a/cmd/puppeth/wizard.go +++ b/cmd/puppeth/wizard.go @@ -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 // to parse into a float. diff --git a/cmd/puppeth/wizard_genesis.go b/cmd/puppeth/wizard_genesis.go index 43dae9c20..222fc2a7c 100644 --- a/cmd/puppeth/wizard_genesis.go +++ b/cmd/puppeth/wizard_genesis.go @@ -18,7 +18,9 @@ package main import ( "bytes" + "encoding/json" "fmt" + "io/ioutil" "math/big" "math/rand" "time" @@ -135,3 +137,53 @@ func (w *wizard) makeGenesis() { // All done, store the genesis and flush to disk 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") + } +} diff --git a/cmd/puppeth/wizard_intro.go b/cmd/puppeth/wizard_intro.go index c3eaf5324..2d9a097ee 100644 --- a/cmd/puppeth/wizard_intro.go +++ b/cmd/puppeth/wizard_intro.go @@ -98,7 +98,7 @@ func (w *wizard) run() { if w.conf.genesis == nil { fmt.Println(" 2. Configure new genesis") } else { - fmt.Println(" 2. Save existing genesis") + fmt.Println(" 2. Manage existing genesis") } if len(w.servers) == 0 { fmt.Println(" 3. Track new remote server") @@ -118,18 +118,10 @@ func (w *wizard) run() { w.networkStats(false) case choice == "2": - // If we don't have a genesis, make one if w.conf.genesis == nil { w.makeGenesis() } else { - // Otherwise just save whatever 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") + w.manageGenesis() } case choice == "3": if len(w.servers) == 0 { diff --git a/cmd/puppeth/wizard_netstats.go b/cmd/puppeth/wizard_netstats.go index ab8078698..c06972198 100644 --- a/cmd/puppeth/wizard_netstats.go +++ b/cmd/puppeth/wizard_netstats.go @@ -129,7 +129,7 @@ func (w *wizard) networkStats(tips bool) { } } // 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) if err := json.Unmarshal([]byte(protips.genesis), genesis); err != nil { log.Error("Failed to parse remote genesis", "err", err)