aboutsummaryrefslogtreecommitdiffstats
path: root/cmd/puppeth
diff options
context:
space:
mode:
Diffstat (limited to 'cmd/puppeth')
-rw-r--r--cmd/puppeth/wizard.go22
-rw-r--r--cmd/puppeth/wizard_genesis.go52
-rw-r--r--cmd/puppeth/wizard_intro.go12
-rw-r--r--cmd/puppeth/wizard_netstats.go2
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)