diff --git a/accounts/keystore/keystore.go b/accounts/keystore/keystore.go index 80ccd37419..f7eaae74e3 100644 --- a/accounts/keystore/keystore.go +++ b/accounts/keystore/keystore.go @@ -75,10 +75,19 @@ type unlocked struct { abort chan struct{} } -// NewKeyStore creates a keystore for the given directory. -func NewKeyStore(keydir string, scryptN, scryptP int) *KeyStore { +// NewUninitializedKeyStore creates a keystore for the given directory, but does not load the existing keys +func NewUninitializedKeyStore(keydir string, scryptN, scryptP int) *KeyStore { keydir, _ = filepath.Abs(keydir) ks := &KeyStore{storage: &keyStorePassphrase{keydir, scryptN, scryptP}} + // Initialize the set of unlocked keys and the account cache + ks.unlocked = make(map[common.Address]*unlocked) + ks.cache, ks.changes = newAccountCache(keydir) + return ks +} + +// NewKeyStore creates a keystore for the given directory. +func NewKeyStore(keydir string, scryptN, scryptP int) *KeyStore { + ks := NewUninitializedKeyStore(keydir, scryptN, scryptP) ks.init(keydir) return ks } @@ -88,19 +97,19 @@ func NewKeyStore(keydir string, scryptN, scryptP int) *KeyStore { func NewPlaintextKeyStore(keydir string) *KeyStore { keydir, _ = filepath.Abs(keydir) ks := &KeyStore{storage: &keyStorePlain{keydir}} + // Initialize the set of unlocked keys and the account cache + ks.unlocked = make(map[common.Address]*unlocked) + ks.cache, ks.changes = newAccountCache(keydir) ks.init(keydir) return ks } +// init initalizes the keystore by loading the accounts func (ks *KeyStore) init(keydir string) { // Lock the mutex since the account cache might call back with events ks.mu.Lock() defer ks.mu.Unlock() - // Initialize the set of unlocked keys and the account cache - ks.unlocked = make(map[common.Address]*unlocked) - ks.cache, ks.changes = newAccountCache(keydir) - // TODO: In order for this finalizer to work, there must be no references // to ks. addressCache doesn't keep a reference but unlocked keys do, // so the finalizer will not trigger until all timed unlocks have expired. diff --git a/cmd/geth/accountcmd.go b/cmd/geth/accountcmd.go index 0f53c92b0a..3b767d1cc1 100644 --- a/cmd/geth/accountcmd.go +++ b/cmd/geth/accountcmd.go @@ -291,10 +291,17 @@ 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 { - stack, _ := makeConfigNode(ctx) - password := getPassPhrase("Your new account is locked with a password. Please give a password. Do not forget this password.", true, 0, utils.MakePasswordList(ctx)) + cfg := createConfig(ctx) + scryptN := keystore.StandardScryptN + scryptP := keystore.StandardScryptP + + 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) - ks := stack.AccountManager().Backends(keystore.KeyStoreType)[0].(*keystore.KeyStore) account, err := ks.NewAccount(password) if err != nil { utils.Fatalf("Failed to create account: %v", err) diff --git a/cmd/geth/config.go b/cmd/geth/config.go index 27490c4048..b9a69600d0 100644 --- a/cmd/geth/config.go +++ b/cmd/geth/config.go @@ -109,7 +109,7 @@ func defaultNodeConfig() node.Config { return cfg } -func makeConfigNode(ctx *cli.Context) (*node.Node, gethConfig) { +func createConfig(ctx *cli.Context) gethConfig { // Load defaults. cfg := gethConfig{ Eth: eth.DefaultConfig, @@ -124,9 +124,13 @@ func makeConfigNode(ctx *cli.Context) (*node.Node, gethConfig) { utils.Fatalf("%v", err) } } - // Apply flags. utils.SetNodeConfig(ctx, &cfg.Node) + return cfg +} + +func makeConfigNode(ctx *cli.Context) (*node.Node, gethConfig) { + cfg := createConfig(ctx) stack, err := node.New(&cfg.Node) if err != nil { utils.Fatalf("Failed to create the protocol stack: %v", err)