@ -26,11 +26,6 @@ import (
"strings"
"sync"
"github.com/ethereum/go-ethereum/accounts"
"github.com/ethereum/go-ethereum/accounts/external"
"github.com/ethereum/go-ethereum/accounts/keystore"
"github.com/ethereum/go-ethereum/accounts/scwallet"
"github.com/ethereum/go-ethereum/accounts/usbwallet"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/crypto"
"github.com/ethereum/go-ethereum/log"
@ -430,15 +425,8 @@ func (c *Config) parsePersistentNodes(w *bool, path string) []*enode.Node {
return nodes
}
// AccountConfig determines the settings for scrypt and keydirectory
func ( c * Config ) AccountConfig ( ) ( int , int , string , error ) {
scryptN := keystore . StandardScryptN
scryptP := keystore . StandardScryptP
if c . UseLightweightKDF {
scryptN = keystore . LightScryptN
scryptP = keystore . LightScryptP
}
// KeyDirConfig determines the settings for keydirectory
func ( c * Config ) KeyDirConfig ( ) ( string , error ) {
var (
keydir string
err error
@ -455,71 +443,31 @@ func (c *Config) AccountConfig() (int, int, string, error) {
case c . KeyStoreDir != "" :
keydir , err = filepath . Abs ( c . KeyStoreDir )
}
return scryptN , scryptP , keydir , err
return keydir , err
}
func makeAccountManager ( conf * Config ) ( * accounts . Manager , string , error ) {
scryptN , scryptP , keydir , err := conf . AccountConfig ( )
var ephemeral string
// getKeyStoreDir retrieves the key directory and will create
// and ephemeral one if necessary.
func getKeyStoreDir ( conf * Config ) ( string , bool , error ) {
keydir , err := conf . KeyDirConfig ( )
if err != nil {
return "" , false , err
}
isEphemeral := false
if keydir == "" {
// There is no datadir.
keydir , err = ioutil . TempDir ( "" , "go-ethereum-keystore" )
ephemeral = keydir
isEphemeral = true
}
if err != nil {
return nil , "" , err
return "" , false , err
}
if err := os . MkdirAll ( keydir , 0700 ) ; err != nil {
return nil , "" , err
}
// Assemble the account manager and supported backends
var backends [ ] accounts . Backend
if len ( conf . ExternalSigner ) > 0 {
log . Info ( "Using external signer" , "url" , conf . ExternalSigner )
if extapi , err := external . NewExternalBackend ( conf . ExternalSigner ) ; err == nil {
backends = append ( backends , extapi )
} else {
return nil , "" , fmt . Errorf ( "error connecting to external signer: %v" , err )
}
}
if len ( backends ) == 0 {
// For now, we're using EITHER external signer OR local signers.
// If/when we implement some form of lockfile for USB and keystore wallets,
// we can have both, but it's very confusing for the user to see the same
// accounts in both externally and locally, plus very racey.
backends = append ( backends , keystore . NewKeyStore ( keydir , scryptN , scryptP ) )
if conf . USB {
// Start a USB hub for Ledger hardware wallets
if ledgerhub , err := usbwallet . NewLedgerHub ( ) ; err != nil {
log . Warn ( fmt . Sprintf ( "Failed to start Ledger hub, disabling: %v" , err ) )
} else {
backends = append ( backends , ledgerhub )
}
// Start a USB hub for Trezor hardware wallets (HID version)
if trezorhub , err := usbwallet . NewTrezorHubWithHID ( ) ; err != nil {
log . Warn ( fmt . Sprintf ( "Failed to start HID Trezor hub, disabling: %v" , err ) )
} else {
backends = append ( backends , trezorhub )
}
// Start a USB hub for Trezor hardware wallets (WebUSB version)
if trezorhub , err := usbwallet . NewTrezorHubWithWebUSB ( ) ; err != nil {
log . Warn ( fmt . Sprintf ( "Failed to start WebUSB Trezor hub, disabling: %v" , err ) )
} else {
backends = append ( backends , trezorhub )
}
}
if len ( conf . SmartCardDaemonPath ) > 0 {
// Start a smart card hub
if schub , err := scwallet . NewHub ( conf . SmartCardDaemonPath , scwallet . Scheme , keydir ) ; err != nil {
log . Warn ( fmt . Sprintf ( "Failed to start smart card hub, disabling: %v" , err ) )
} else {
backends = append ( backends , schub )
}
}
return "" , false , err
}
return accounts . NewManager ( & accounts . Config { InsecureUnlockAllowed : conf . InsecureUnlockAllowed } , backends ... ) , e phemeral, nil
return keydir , isEphemeral , nil
}
var warnLock sync . Mutex