From 4d765dcf2bc569ab187d86ea77733f4e7822809e Mon Sep 17 00:00:00 2001 From: Jae Kwon Date: Fri, 14 Aug 2015 10:49:44 -0700 Subject: [PATCH] Generate account from seed --- cmd/tendermint/gen_account.go | 32 +++++++++++++++++++++++++++----- common/os.go | 17 +++++++++++++++++ config/config.go | 20 -------------------- config/tendermint/config.go | 4 ++-- config/tendermint_test/config.go | 4 ++-- 5 files changed, 48 insertions(+), 29 deletions(-) diff --git a/cmd/tendermint/gen_account.go b/cmd/tendermint/gen_account.go index 2f9a4811d..fa35d0ea7 100644 --- a/cmd/tendermint/gen_account.go +++ b/cmd/tendermint/gen_account.go @@ -4,17 +4,39 @@ import ( "fmt" acm "github.com/tendermint/tendermint/account" + . "github.com/tendermint/tendermint/common" "github.com/tendermint/tendermint/wire" ) func gen_account() { - privAccount := acm.GenPrivAccount() - privAccountJSONBytes := wire.JSONBytes(privAccount) - fmt.Printf(`Generated a new account! + + seed, err := Prompt(`Enter your desired seed, or just hit to generate a random account. +IMPORTANT: If you don't know what a dictionary attack is, just hit Enter +> `, "") + if err != nil { + Exit(Fmt("Not sure what happened: %v", err)) + } + + if seed == "" { + privAccount := acm.GenPrivAccount() + privAccountJSONBytes := wire.JSONBytes(privAccount) + fmt.Printf(`Generated a new random account! %v `, - string(privAccountJSONBytes), - ) + string(privAccountJSONBytes), + ) + } else { + privAccount := acm.GenPrivAccountFromSecret([]byte(seed)) + privAccountJSONBytes := wire.JSONBytes(privAccount) + fmt.Printf(`Generated a new account from seed: [%v]! + +%v + +`, + seed, + string(privAccountJSONBytes), + ) + } } diff --git a/common/os.go b/common/os.go index efd2a55a9..887b406a0 100644 --- a/common/os.go +++ b/common/os.go @@ -1,10 +1,12 @@ package common import ( + "bufio" "fmt" "io/ioutil" "os" "os/signal" + "strings" "sync" "time" ) @@ -206,3 +208,18 @@ func Tempfile(prefix string) (*os.File, string) { } return file, file.Name() } + +func Prompt(prompt string, defaultValue string) (string, error) { + fmt.Print(prompt) + reader := bufio.NewReader(os.Stdin) + line, err := reader.ReadString('\n') + if err != nil { + return defaultValue, err + } else { + line = strings.TrimSpace(line) + if line == "" { + return defaultValue, nil + } + return line, nil + } +} diff --git a/config/config.go b/config/config.go index 27e2037a5..43963e25a 100644 --- a/config/config.go +++ b/config/config.go @@ -1,30 +1,10 @@ package config import ( - "bufio" - "fmt" - "os" - "strings" "sync" "time" ) -func Prompt(prompt string, defaultValue string) string { - fmt.Print(prompt) - reader := bufio.NewReader(os.Stdin) - line, err := reader.ReadString('\n') - if err != nil { - log.Warn("Error reading stdin", "err", err) - return defaultValue - } else { - line = strings.TrimSpace(line) - if line == "" { - return defaultValue - } - return line - } -} - type Config interface { Get(key string) interface{} GetBool(key string) bool diff --git a/config/tendermint/config.go b/config/tendermint/config.go index b9af14463..6358d878b 100644 --- a/config/tendermint/config.go +++ b/config/tendermint/config.go @@ -30,8 +30,8 @@ func initTMRoot(rootDir string) { // Write default config file if missing. if !FileExists(configFilePath) { // Ask user for moniker - moniker := cfg.Prompt("Type hostname: ", "anonymous") - MustWriteFile(configFilePath, []byte(defaultConfig(moniker))) + // moniker := cfg.Prompt("Type hostname: ", "anonymous") + MustWriteFile(configFilePath, []byte(defaultConfig("anonymous"))) } if !FileExists(genesisFilePath) { MustWriteFile(genesisFilePath, []byte(defaultGenesis)) diff --git a/config/tendermint_test/config.go b/config/tendermint_test/config.go index 5d8d09358..6d3c3e326 100644 --- a/config/tendermint_test/config.go +++ b/config/tendermint_test/config.go @@ -35,8 +35,8 @@ func initTMRoot(rootDir string) { // Write default config file if missing. if !FileExists(configFilePath) { // Ask user for moniker - moniker := cfg.Prompt("Type hostname: ", "anonymous") - MustWriteFile(configFilePath, []byte(defaultConfig(moniker))) + // moniker := cfg.Prompt("Type hostname: ", "anonymous") + MustWriteFile(configFilePath, []byte(defaultConfig("anonymous"))) } if !FileExists(genesisFilePath) { MustWriteFile(genesisFilePath, []byte(defaultGenesis))