diff --git a/accounts/keystore/keystore.go b/accounts/keystore/keystore.go index f7eaae74e3..25c3663b5c 100644 --- a/accounts/keystore/keystore.go +++ b/accounts/keystore/keystore.go @@ -412,13 +412,23 @@ func (ks *KeyStore) expire(addr common.Address, u *unlocked, timeout time.Durati } } -// NewAccount generates a new key and stores it into the key directory, +// CreateNewAccount generates a new key and stores it into the key directory, // encrypting it with the passphrase. -func (ks *KeyStore) NewAccount(passphrase string) (accounts.Account, error) { +func (ks *KeyStore) CreateNewAccount(passphrase string) (accounts.Account, error) { _, account, err := storeNewKey(ks.storage, crand.Reader, passphrase) if err != nil { return accounts.Account{}, err } + return account, nil +} + +// NewAccount generates a new key and stores it into the key directory, +// encrypting it with the passphrase, and adds it to the cache +func (ks *KeyStore) NewAccount(passphrase string) (accounts.Account, error) { + account, err := ks.CreateNewAccount(passphrase) + if err != nil { + return account, err + } // Add the account to the cache immediately rather // than waiting for file system notifications to pick it up. ks.cache.add(account) diff --git a/cmd/geth/accountcmd.go b/cmd/geth/accountcmd.go index 3b767d1cc1..9dddfc3870 100644 --- a/cmd/geth/accountcmd.go +++ b/cmd/geth/accountcmd.go @@ -26,6 +26,7 @@ import ( "github.com/ethereum/go-ethereum/console" "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/node" "gopkg.in/urfave/cli.v1" ) @@ -292,17 +293,10 @@ func ambiguousAddrRecovery(ks *keystore.KeyStore, err *keystore.AmbiguousAddrErr // accountCreate creates a new account into the keystore defined by the CLI flags. func accountCreate(ctx *cli.Context) error { cfg := createConfig(ctx) - scryptN := keystore.StandardScryptN - scryptP := keystore.StandardScryptP + ks, _, err := node.MakeKeystoreBackend(&cfg.Node, false) - if cfg.Node.UseLightweightKDF { - scryptN = keystore.LightScryptN - scryptP = keystore.LightScryptP - } password := getPassPhrase("Your new account is locked with a password. Please give a password. Do not forget this password.", true, 0, utils.MakePasswordList(ctx)) - ks := keystore.NewUninitializedKeyStore(cfg.Node.KeyStoreDir, scryptN, scryptP) - - account, err := ks.NewAccount(password) + account, err := ks.CreateNewAccount(password) if err != nil { utils.Fatalf("Failed to create account: %v", err) } diff --git a/node/config.go b/node/config.go index be9e21b4fa..135394863c 100644 --- a/node/config.go +++ b/node/config.go @@ -360,7 +360,7 @@ func (c *Config) parsePersistentNodes(path string) []*discover.Node { return nodes } -func makeAccountManager(conf *Config) (*accounts.Manager, string, error) { +func MakeKeystoreBackend(conf *Config, loadKeys bool) (*keystore.KeyStore, string, error) { scryptN := keystore.StandardScryptN scryptP := keystore.StandardScryptP if conf.UseLightweightKDF { @@ -395,10 +395,21 @@ func makeAccountManager(conf *Config) (*accounts.Manager, string, error) { if err := os.MkdirAll(keydir, 0700); err != nil { return nil, "", err } - // Assemble the account manager and supported backends - backends := []accounts.Backend{ - keystore.NewKeyStore(keydir, scryptN, scryptP), + if !loadKeys { + return keystore.NewUninitializedKeyStore(keydir, scryptN, scryptP), ephemeral, nil } + return keystore.NewKeyStore(keydir, scryptN, scryptP), ephemeral, nil +} + +func makeAccountManager(conf *Config) (*accounts.Manager, string, error) { + + ks, ephemeral, err := MakeKeystoreBackend(conf, true) + if err != nil { + return nil, "", err + } + // Assemble the account manager and supported backends + + backends := []accounts.Backend{ks} if !conf.NoUSB { // Start a USB hub for Ledger hardware wallets if ledgerhub, err := usbwallet.NewLedgerHub(); err != nil {