cmd/geth: accountcmd no need to acquire the datadir lock #27084 (#1154)

This commit is contained in:
JukLee0ira 2025-06-26 10:50:28 +08:00 committed by GitHub
parent afa3a4ea5c
commit b15a8ac67e
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 53 additions and 33 deletions

View file

@ -195,10 +195,28 @@ nodes.
} }
) )
// makeAccountManager creates an account manager with backends
func makeAccountManager(ctx *cli.Context) *accounts.Manager {
cfg := loadBaseConfig(ctx)
am := accounts.NewManager(&accounts.Config{InsecureUnlockAllowed: cfg.Node.InsecureUnlockAllowed})
keydir, isEphemeral, err := cfg.Node.GetKeyStoreDir()
if err != nil {
utils.Fatalf("Failed to get the keystore directory: %v", err)
}
if isEphemeral {
utils.Fatalf("Can't use ephemeral directory as keystore path")
}
if err := setAccountManagerBackends(&cfg.Node, am, keydir); err != nil {
utils.Fatalf("Failed to set account manager backends: %v", err)
}
return am
}
func accountList(ctx *cli.Context) error { func accountList(ctx *cli.Context) error {
stack, _ := makeConfigNode(ctx) am := makeAccountManager(ctx)
var index int var index int
for _, wallet := range stack.AccountManager().Wallets() { for _, wallet := range am.Wallets() {
for _, account := range wallet.Accounts() { for _, account := range wallet.Accounts() {
fmt.Printf("Account #%d: {%x} %s\n", index, account.Address, &account.URL) fmt.Printf("Account #%d: {%x} %s\n", index, account.Address, &account.URL)
index++ index++
@ -294,17 +312,13 @@ func ambiguousAddrRecovery(ks *keystore.KeyStore, err *keystore.AmbiguousAddrErr
// accountCreate creates a new account into the keystore defined by the CLI flags. // accountCreate creates a new account into the keystore defined by the CLI flags.
func accountCreate(ctx *cli.Context) error { func accountCreate(ctx *cli.Context) error {
cfg := XDCConfig{Node: defaultNodeConfig()} cfg := loadBaseConfig(ctx)
// Load config file. keydir, isEphemeral, err := cfg.Node.GetKeyStoreDir()
if file := ctx.String(configFileFlag.Name); file != "" {
if err := loadConfig(file, &cfg); err != nil {
utils.Fatalf("%v", err)
}
}
utils.SetNodeConfig(ctx, &cfg.Node)
keydir, err := cfg.Node.KeyDirConfig()
if err != nil { if err != nil {
utils.Fatalf("Failed to read configuration: %v", err) utils.Fatalf("Failed to get the keystore directory: %v", err)
}
if isEphemeral {
utils.Fatalf("Can't use ephemeral directory as keystore path")
} }
scryptN := keystore.StandardScryptN scryptN := keystore.StandardScryptN
scryptP := keystore.StandardScryptP scryptP := keystore.StandardScryptP
@ -336,8 +350,8 @@ func accountUpdate(ctx *cli.Context) error {
if ctx.Args().Len() == 0 { if ctx.Args().Len() == 0 {
utils.Fatalf("No accounts specified to update") utils.Fatalf("No accounts specified to update")
} }
stack, _ := makeConfigNode(ctx) am := makeAccountManager(ctx)
backends := stack.AccountManager().Backends(keystore.KeyStoreType) backends := am.Backends(keystore.KeyStoreType)
if len(backends) == 0 { if len(backends) == 0 {
utils.Fatalf("Keystore is not available") utils.Fatalf("Keystore is not available")
} }
@ -363,14 +377,15 @@ func importWallet(ctx *cli.Context) error {
utils.Fatalf("Could not read wallet file: %v", err) utils.Fatalf("Could not read wallet file: %v", err)
} }
stack, _ := makeConfigNode(ctx) am := makeAccountManager(ctx)
passphrase := getPassPhrase("", false, 0, utils.MakePasswordList(ctx)) backends := am.Backends(keystore.KeyStoreType)
backends := stack.AccountManager().Backends(keystore.KeyStoreType)
if len(backends) == 0 { if len(backends) == 0 {
utils.Fatalf("Keystore is not available") utils.Fatalf("Keystore is not available")
} }
ks := backends[0].(*keystore.KeyStore) ks := backends[0].(*keystore.KeyStore)
passphrase := getPassPhrase("", false, 0, utils.MakePasswordList(ctx))
acct, err := ks.ImportPreSaleKey(keyJson, passphrase) acct, err := ks.ImportPreSaleKey(keyJson, passphrase)
if err != nil { if err != nil {
utils.Fatalf("%v", err) utils.Fatalf("%v", err)
@ -388,14 +403,14 @@ func accountImport(ctx *cli.Context) error {
if err != nil { if err != nil {
utils.Fatalf("Failed to load the private key: %v", err) utils.Fatalf("Failed to load the private key: %v", err)
} }
stack, _ := makeConfigNode(ctx) am := makeAccountManager(ctx)
passphrase := getPassPhrase("Your new account is locked with a password. Please give a password. Do not forget this password.", true, 0, utils.MakePasswordList(ctx)) backends := am.Backends(keystore.KeyStoreType)
backends := stack.AccountManager().Backends(keystore.KeyStoreType)
if len(backends) == 0 { if len(backends) == 0 {
utils.Fatalf("Keystore is not available") utils.Fatalf("Keystore is not available")
} }
ks := backends[0].(*keystore.KeyStore) ks := backends[0].(*keystore.KeyStore)
passphrase := getPassPhrase("Your new account is locked with a password. Please give a password. Do not forget this password.", true, 0, utils.MakePasswordList(ctx))
acct, err := ks.ImportECDSA(key, passphrase) acct, err := ks.ImportECDSA(key, passphrase)
if err != nil { if err != nil {
utils.Fatalf("Could not create the account: %v", err) utils.Fatalf("Could not create the account: %v", err)

View file

@ -30,6 +30,7 @@ import (
"unicode" "unicode"
"github.com/XinFinOrg/XDPoSChain/XDCx" "github.com/XinFinOrg/XDPoSChain/XDCx"
"github.com/XinFinOrg/XDPoSChain/accounts"
"github.com/XinFinOrg/XDPoSChain/accounts/keystore" "github.com/XinFinOrg/XDPoSChain/accounts/keystore"
"github.com/XinFinOrg/XDPoSChain/accounts/scwallet" "github.com/XinFinOrg/XDPoSChain/accounts/scwallet"
"github.com/XinFinOrg/XDPoSChain/accounts/usbwallet" "github.com/XinFinOrg/XDPoSChain/accounts/usbwallet"
@ -130,8 +131,9 @@ func defaultNodeConfig() node.Config {
return cfg return cfg
} }
// makeConfigNode loads geth configuration and creates a blank node instance. // loadBaseConfig loads the gethConfig based on the given command line
func makeConfigNode(ctx *cli.Context) (*node.Node, XDCConfig) { // parameters and config file.
func loadBaseConfig(ctx *cli.Context) XDCConfig {
// Load defaults. // Load defaults.
cfg := XDCConfig{ cfg := XDCConfig{
Eth: ethconfig.Defaults, Eth: ethconfig.Defaults,
@ -186,12 +188,18 @@ func makeConfigNode(ctx *cli.Context) (*node.Node, XDCConfig) {
// Apply flags. // Apply flags.
utils.SetNodeConfig(ctx, &cfg.Node) utils.SetNodeConfig(ctx, &cfg.Node)
return cfg
}
// makeConfigNode loads geth configuration and creates a blank node instance.
func makeConfigNode(ctx *cli.Context) (*node.Node, XDCConfig) {
cfg := loadBaseConfig(ctx)
stack, err := node.New(&cfg.Node) stack, err := node.New(&cfg.Node)
if err != nil { if err != nil {
utils.Fatalf("Failed to create the protocol stack: %v", err) utils.Fatalf("Failed to create the protocol stack: %v", err)
} }
// Node doesn't by default populate account manager backends // Node doesn't by default populate account manager backends
if err := setAccountManagerBackends(stack); err != nil { if err := setAccountManagerBackends(stack.Config(), stack.AccountManager(), stack.KeyStoreDir()); err != nil {
utils.Fatalf("Failed to set account manager backends: %v", err) utils.Fatalf("Failed to set account manager backends: %v", err)
} }
@ -325,10 +333,7 @@ func applyMetricConfig(ctx *cli.Context, cfg *XDCConfig) {
} }
} }
func setAccountManagerBackends(stack *node.Node) error { func setAccountManagerBackends(conf *node.Config, am *accounts.Manager, keydir string) error {
conf := stack.Config()
am := stack.AccountManager()
keydir := stack.KeyStoreDir()
scryptN := keystore.StandardScryptN scryptN := keystore.StandardScryptN
scryptP := keystore.StandardScryptP scryptP := keystore.StandardScryptP
if conf.UseLightweightKDF { if conf.UseLightweightKDF {

View file

@ -436,10 +436,10 @@ func (c *Config) KeyDirConfig() (string, error) {
return keydir, err return keydir, err
} }
// getKeyStoreDir retrieves the key directory and will create // GetKeyStoreDir retrieves the key directory and will create
// and ephemeral one if necessary. // and ephemeral one if necessary.
func getKeyStoreDir(conf *Config) (string, bool, error) { func (c *Config) GetKeyStoreDir() (string, bool, error) {
keydir, err := conf.KeyDirConfig() keydir, err := c.KeyDirConfig()
if err != nil { if err != nil {
return "", false, err return "", false, err
} }

View file

@ -124,7 +124,7 @@ func New(conf *Config) (*Node, error) {
return nil, err return nil, err
} }
keyDir, isEphem, err := getKeyStoreDir(conf) keyDir, isEphem, err := conf.GetKeyStoreDir()
if err != nil { if err != nil {
return nil, err return nil, err
} }