Listen for account changes only when required (#8503)

* initial implementation

* remove listening for changes from wallet creation

* goimports

* test fix

* more goimports

* listen for changes when initializing wallet through gRPC

Co-authored-by: Raul Jordan <raul@prysmaticlabs.com>
Co-authored-by: prylabs-bulldozer[bot] <58059840+prylabs-bulldozer[bot]@users.noreply.github.com>
This commit is contained in:
Radosław Kapka
2021-02-24 19:05:46 +01:00
committed by GitHub
parent 08b938982b
commit 4d28d5e4d2
34 changed files with 119 additions and 63 deletions

View File

@@ -37,6 +37,7 @@ go_library(
"//shared/petnames:go_default_library",
"//shared/promptutil:go_default_library",
"//shared/tos:go_default_library",
"//validator/accounts/iface:go_default_library",
"//validator/accounts/prompt:go_default_library",
"//validator/accounts/wallet:go_default_library",
"//validator/client:go_default_library",
@@ -86,6 +87,7 @@ go_test(
"//shared/testutil/assert:go_default_library",
"//shared/testutil/require:go_default_library",
"//shared/timeutils:go_default_library",
"//validator/accounts/iface:go_default_library",
"//validator/accounts/wallet:go_default_library",
"//validator/flags:go_default_library",
"//validator/keymanager:go_default_library",

View File

@@ -17,6 +17,7 @@ import (
"github.com/prysmaticlabs/prysm/shared/fileutil"
"github.com/prysmaticlabs/prysm/shared/petnames"
"github.com/prysmaticlabs/prysm/shared/promptutil"
"github.com/prysmaticlabs/prysm/validator/accounts/iface"
"github.com/prysmaticlabs/prysm/validator/accounts/prompt"
"github.com/prysmaticlabs/prysm/validator/accounts/wallet"
"github.com/prysmaticlabs/prysm/validator/flags"
@@ -51,7 +52,7 @@ func BackupAccountsCli(cliCtx *cli.Context) error {
"remote wallets cannot backup accounts",
)
}
km, err := w.InitializeKeymanager(cliCtx.Context)
km, err := w.InitializeKeymanager(cliCtx.Context, iface.InitKeymanagerConfig{ListenForChanges: false})
if err != nil {
return errors.Wrap(err, ErrCouldNotInitializeKeymanager)
}

View File

@@ -16,6 +16,7 @@ import (
"github.com/prysmaticlabs/prysm/shared/params"
"github.com/prysmaticlabs/prysm/shared/testutil/assert"
"github.com/prysmaticlabs/prysm/shared/testutil/require"
"github.com/prysmaticlabs/prysm/validator/accounts/iface"
"github.com/prysmaticlabs/prysm/validator/accounts/wallet"
"github.com/prysmaticlabs/prysm/validator/keymanager"
"github.com/prysmaticlabs/prysm/validator/keymanager/derived"
@@ -63,7 +64,7 @@ func TestBackupAccounts_Noninteractive_Derived(t *testing.T) {
})
require.NoError(t, err)
km, err := w.InitializeKeymanager(cliCtx.Context)
km, err := w.InitializeKeymanager(cliCtx.Context, iface.InitKeymanagerConfig{ListenForChanges: false})
require.NoError(t, err)
// Create 2 accounts
derivedKM, ok := km.(*derived.Keymanager)

View File

@@ -9,6 +9,7 @@ import (
"github.com/pkg/errors"
"github.com/prysmaticlabs/prysm/shared/bytesutil"
"github.com/prysmaticlabs/prysm/shared/promptutil"
"github.com/prysmaticlabs/prysm/validator/accounts/iface"
"github.com/prysmaticlabs/prysm/validator/accounts/prompt"
"github.com/prysmaticlabs/prysm/validator/accounts/wallet"
"github.com/prysmaticlabs/prysm/validator/flags"
@@ -27,7 +28,7 @@ func DeleteAccountCli(cliCtx *cli.Context) error {
if err != nil {
return errors.Wrap(err, "could not open wallet")
}
kManager, err := w.InitializeKeymanager(cliCtx.Context)
kManager, err := w.InitializeKeymanager(cliCtx.Context, iface.InitKeymanagerConfig{ListenForChanges: false})
if err != nil {
return errors.Wrap(err, ErrCouldNotInitializeKeymanager)
}

View File

@@ -63,7 +63,8 @@ func TestDeleteAccounts_Noninteractive(t *testing.T) {
keymanager, err := imported.NewKeymanager(
cliCtx.Context,
&imported.SetupConfig{
Wallet: w,
Wallet: w,
ListenForChanges: false,
},
)
require.NoError(t, err)

View File

@@ -8,6 +8,7 @@ import (
"github.com/pkg/errors"
"github.com/prysmaticlabs/prysm/shared/bytesutil"
"github.com/prysmaticlabs/prysm/shared/promptutil"
"github.com/prysmaticlabs/prysm/validator/accounts/iface"
"github.com/prysmaticlabs/prysm/validator/accounts/prompt"
"github.com/prysmaticlabs/prysm/validator/accounts/wallet"
"github.com/prysmaticlabs/prysm/validator/flags"
@@ -23,7 +24,7 @@ func DisableAccountsCli(cliCtx *cli.Context) error {
if err != nil {
return errors.Wrap(err, "could not open wallet")
}
km, err := w.InitializeKeymanager(cliCtx.Context)
km, err := w.InitializeKeymanager(cliCtx.Context, iface.InitKeymanagerConfig{ListenForChanges: false})
if err != nil {
return errors.Wrap(err, ErrCouldNotInitializeKeymanager)
}
@@ -100,7 +101,7 @@ func EnableAccountsCli(cliCtx *cli.Context) error {
if err != nil {
return errors.Wrap(err, "could not open wallet")
}
km, err := w.InitializeKeymanager(cliCtx.Context)
km, err := w.InitializeKeymanager(cliCtx.Context, iface.InitKeymanagerConfig{ListenForChanges: false})
if err != nil {
return errors.Wrap(err, ErrCouldNotInitializeKeymanager)
}

View File

@@ -14,6 +14,7 @@ import (
"github.com/prysmaticlabs/prysm/shared/bytesutil"
"github.com/prysmaticlabs/prysm/shared/testutil/assert"
"github.com/prysmaticlabs/prysm/shared/testutil/require"
"github.com/prysmaticlabs/prysm/validator/accounts/iface"
"github.com/prysmaticlabs/prysm/validator/accounts/wallet"
"github.com/prysmaticlabs/prysm/validator/keymanager"
)
@@ -63,7 +64,7 @@ func TestDisableAccounts_Noninteractive(t *testing.T) {
// We attempt to disable the accounts specified.
require.NoError(t, DisableAccountsCli(cliCtx))
keymanager, err := w.InitializeKeymanager(cliCtx.Context)
keymanager, err := w.InitializeKeymanager(cliCtx.Context, iface.InitKeymanagerConfig{ListenForChanges: false})
require.NoError(t, err)
remainingAccounts, err := keymanager.FetchValidatingPublicKeys(cliCtx.Context)
require.NoError(t, err)
@@ -119,7 +120,7 @@ func TestEnableAccounts_Noninteractive(t *testing.T) {
// We attempt to disable the accounts specified.
require.NoError(t, DisableAccountsCli(cliCtx))
km, err := w.InitializeKeymanager(cliCtx.Context)
km, err := w.InitializeKeymanager(cliCtx.Context, iface.InitKeymanagerConfig{ListenForChanges: false})
require.NoError(t, err)
remainingAccounts, err := km.FetchValidatingPublicKeys(cliCtx.Context)
require.NoError(t, err)
@@ -128,7 +129,7 @@ func TestEnableAccounts_Noninteractive(t *testing.T) {
// We attempt to enable the accounts specified.
require.NoError(t, EnableAccountsCli(cliCtx))
km, err = w.InitializeKeymanager(cliCtx.Context)
km, err = w.InitializeKeymanager(cliCtx.Context, iface.InitKeymanagerConfig{ListenForChanges: false})
require.NoError(t, err)
remainingAccounts, err = km.FetchValidatingPublicKeys(cliCtx.Context)
require.NoError(t, err)

View File

@@ -15,6 +15,7 @@ import (
"github.com/prysmaticlabs/prysm/shared/grpcutils"
"github.com/prysmaticlabs/prysm/shared/params"
"github.com/prysmaticlabs/prysm/shared/promptutil"
"github.com/prysmaticlabs/prysm/validator/accounts/iface"
"github.com/prysmaticlabs/prysm/validator/accounts/prompt"
"github.com/prysmaticlabs/prysm/validator/accounts/wallet"
"github.com/prysmaticlabs/prysm/validator/client"
@@ -79,7 +80,7 @@ func prepareWallet(cliCtx *cli.Context) (validatingPublicKeys [][48]byte, km key
return nil, nil, errors.Wrap(err, "could not open wallet")
}
km, err = w.InitializeKeymanager(cliCtx.Context)
km, err = w.InitializeKeymanager(cliCtx.Context, iface.InitKeymanagerConfig{ListenForChanges: false})
if err != nil {
return nil, nil, errors.Wrap(err, ErrCouldNotInitializeKeymanager)
}

View File

@@ -18,6 +18,7 @@ import (
"github.com/prysmaticlabs/prysm/shared/bytesutil"
"github.com/prysmaticlabs/prysm/shared/fileutil"
"github.com/prysmaticlabs/prysm/shared/promptutil"
"github.com/prysmaticlabs/prysm/validator/accounts/iface"
"github.com/prysmaticlabs/prysm/validator/accounts/prompt"
"github.com/prysmaticlabs/prysm/validator/accounts/wallet"
"github.com/prysmaticlabs/prysm/validator/flags"
@@ -99,7 +100,7 @@ func ImportAccountsCli(cliCtx *cli.Context) error {
return errors.Wrap(err, "could not initialize wallet")
}
km, err := w.InitializeKeymanager(cliCtx.Context)
km, err := w.InitializeKeymanager(cliCtx.Context, iface.InitKeymanagerConfig{ListenForChanges: false})
if err != nil {
return err
}

View File

@@ -19,6 +19,7 @@ import (
"github.com/prysmaticlabs/prysm/shared/testutil/assert"
"github.com/prysmaticlabs/prysm/shared/testutil/require"
"github.com/prysmaticlabs/prysm/shared/timeutils"
"github.com/prysmaticlabs/prysm/validator/accounts/iface"
"github.com/prysmaticlabs/prysm/validator/accounts/wallet"
"github.com/prysmaticlabs/prysm/validator/keymanager"
"github.com/prysmaticlabs/prysm/validator/keymanager/imported"
@@ -50,7 +51,8 @@ func TestImport_Noninteractive(t *testing.T) {
keymanager, err := imported.NewKeymanager(
cliCtx.Context,
&imported.SetupConfig{
Wallet: w,
Wallet: w,
ListenForChanges: false,
},
)
require.NoError(t, err)
@@ -72,7 +74,7 @@ func TestImport_Noninteractive(t *testing.T) {
WalletPassword: password,
})
require.NoError(t, err)
km, err := w.InitializeKeymanager(cliCtx.Context)
km, err := w.InitializeKeymanager(cliCtx.Context, iface.InitKeymanagerConfig{ListenForChanges: false})
require.NoError(t, err)
keys, err := km.FetchValidatingPublicKeys(cliCtx.Context)
require.NoError(t, err)
@@ -120,7 +122,7 @@ func TestImport_DuplicateKeys(t *testing.T) {
WalletPassword: password,
})
require.NoError(t, err)
km, err := w.InitializeKeymanager(cliCtx.Context)
km, err := w.InitializeKeymanager(cliCtx.Context, iface.InitKeymanagerConfig{ListenForChanges: false})
require.NoError(t, err)
keys, err := km.FetchValidatingPublicKeys(cliCtx.Context)
require.NoError(t, err)
@@ -181,7 +183,8 @@ func TestImport_Noninteractive_RandomName(t *testing.T) {
keymanager, err := imported.NewKeymanager(
cliCtx.Context,
&imported.SetupConfig{
Wallet: w,
Wallet: w,
ListenForChanges: false,
},
)
require.NoError(t, err)
@@ -203,7 +206,7 @@ func TestImport_Noninteractive_RandomName(t *testing.T) {
WalletPassword: password,
})
require.NoError(t, err)
km, err := w.InitializeKeymanager(cliCtx.Context)
km, err := w.InitializeKeymanager(cliCtx.Context, iface.InitKeymanagerConfig{ListenForChanges: false})
require.NoError(t, err)
keys, err := km.FetchValidatingPublicKeys(cliCtx.Context)
require.NoError(t, err)
@@ -237,7 +240,8 @@ func TestImport_Noninteractive_Filepath(t *testing.T) {
keymanager, err := imported.NewKeymanager(
cliCtx.Context,
&imported.SetupConfig{
Wallet: w,
Wallet: w,
ListenForChanges: false,
},
)
require.NoError(t, err)
@@ -254,7 +258,7 @@ func TestImport_Noninteractive_Filepath(t *testing.T) {
WalletPassword: password,
})
require.NoError(t, err)
km, err := w.InitializeKeymanager(cliCtx.Context)
km, err := w.InitializeKeymanager(cliCtx.Context, iface.InitKeymanagerConfig{ListenForChanges: false})
require.NoError(t, err)
keys, err := km.FetchValidatingPublicKeys(cliCtx.Context)
require.NoError(t, err)
@@ -358,7 +362,8 @@ func Test_importPrivateKeyAsAccount(t *testing.T) {
keymanager, err := imported.NewKeymanager(
cliCtx.Context,
&imported.SetupConfig{
Wallet: wallet,
Wallet: wallet,
ListenForChanges: false,
},
)
require.NoError(t, err)
@@ -368,7 +373,8 @@ func Test_importPrivateKeyAsAccount(t *testing.T) {
keymanager, err = imported.NewKeymanager(
cliCtx.Context,
&imported.SetupConfig{
Wallet: wallet,
Wallet: wallet,
ListenForChanges: false,
},
)
require.NoError(t, err)

View File

@@ -10,6 +10,7 @@ import (
"github.com/pkg/errors"
"github.com/prysmaticlabs/prysm/shared/bytesutil"
"github.com/prysmaticlabs/prysm/shared/petnames"
"github.com/prysmaticlabs/prysm/validator/accounts/iface"
"github.com/prysmaticlabs/prysm/validator/accounts/wallet"
"github.com/prysmaticlabs/prysm/validator/flags"
"github.com/prysmaticlabs/prysm/validator/keymanager"
@@ -27,7 +28,7 @@ func ListAccountsCli(cliCtx *cli.Context) error {
if err != nil {
return errors.Wrap(err, "could not open wallet")
}
km, err := w.InitializeKeymanager(cliCtx.Context)
km, err := w.InitializeKeymanager(cliCtx.Context, iface.InitKeymanagerConfig{ListenForChanges: false})
if err != nil && strings.Contains(err.Error(), "invalid checksum") {
return errors.New("wrong wallet password entered")
}

View File

@@ -83,7 +83,8 @@ func TestListAccounts_ImportedKeymanager(t *testing.T) {
km, err := imported.NewKeymanager(
cliCtx.Context,
&imported.SetupConfig{
Wallet: w,
Wallet: w,
ListenForChanges: false,
},
)
require.NoError(t, err)
@@ -236,7 +237,8 @@ func TestListAccounts_DerivedKeymanager(t *testing.T) {
keymanager, err := derived.NewKeymanager(
cliCtx.Context,
&derived.SetupConfig{
Wallet: w,
Wallet: w,
ListenForChanges: false,
},
)
require.NoError(t, err)

View File

@@ -6,6 +6,11 @@ import (
"github.com/prysmaticlabs/prysm/validator/keymanager"
)
// InitKeymanagerConfig defines configuration options for initializing a keymanager.
type InitKeymanagerConfig struct {
ListenForChanges bool
}
// Wallet defines a struct which has capabilities and knowledge of how
// to read and write important accounts-related files to the filesystem.
// Useful for keymanagers to have persistent capabilities for accounts on-disk.
@@ -18,5 +23,5 @@ type Wallet interface {
// Write methods to persist important wallet and accounts-related files to disk.
WriteFileAtPath(ctx context.Context, pathName string, fileName string, data []byte) error
// Method for initializing a new keymanager.
InitializeKeymanager(ctx context.Context) (keymanager.IKeymanager, error)
InitializeKeymanager(ctx context.Context, cfg InitKeymanagerConfig) (keymanager.IKeymanager, error)
}

View File

@@ -9,5 +9,8 @@ go_library(
"//validator:__pkg__",
"//validator:__subpackages__",
],
deps = ["//validator/keymanager:go_default_library"],
deps = [
"//validator/accounts/iface:go_default_library",
"//validator/keymanager:go_default_library",
],
)

View File

@@ -6,6 +6,7 @@ import (
"strings"
"sync"
"github.com/prysmaticlabs/prysm/validator/accounts/iface"
"github.com/prysmaticlabs/prysm/validator/keymanager"
)
@@ -71,6 +72,6 @@ func (w *Wallet) ReadFileAtPath(_ context.Context, pathName, fileName string) ([
}
// InitializeKeymanager --
func (w *Wallet) InitializeKeymanager(_ context.Context) (keymanager.IKeymanager, error) {
func (w *Wallet) InitializeKeymanager(_ context.Context, _ iface.InitKeymanagerConfig) (keymanager.IKeymanager, error) {
return nil, nil
}

View File

@@ -12,6 +12,7 @@ go_library(
deps = [
"//shared/fileutil:go_default_library",
"//shared/promptutil:go_default_library",
"//validator/accounts/iface:go_default_library",
"//validator/accounts/prompt:go_default_library",
"//validator/flags:go_default_library",
"//validator/keymanager:go_default_library",

View File

@@ -12,6 +12,7 @@ import (
"github.com/pkg/errors"
"github.com/prysmaticlabs/prysm/shared/fileutil"
"github.com/prysmaticlabs/prysm/shared/promptutil"
"github.com/prysmaticlabs/prysm/validator/accounts/iface"
"github.com/prysmaticlabs/prysm/validator/accounts/prompt"
"github.com/prysmaticlabs/prysm/validator/flags"
"github.com/prysmaticlabs/prysm/validator/keymanager"
@@ -253,20 +254,22 @@ func (w *Wallet) Password() string {
// InitializeKeymanager reads a keymanager config from disk at the wallet path,
// unmarshals it based on the wallet's keymanager kind, and returns its value.
func (w *Wallet) InitializeKeymanager(ctx context.Context) (keymanager.IKeymanager, error) {
func (w *Wallet) InitializeKeymanager(ctx context.Context, cfg iface.InitKeymanagerConfig) (keymanager.IKeymanager, error) {
var km keymanager.IKeymanager
var err error
switch w.KeymanagerKind() {
case keymanager.Imported:
km, err = imported.NewKeymanager(ctx, &imported.SetupConfig{
Wallet: w,
Wallet: w,
ListenForChanges: cfg.ListenForChanges,
})
if err != nil {
return nil, errors.Wrap(err, "could not initialize imported keymanager")
}
case keymanager.Derived:
km, err = derived.NewKeymanager(ctx, &derived.SetupConfig{
Wallet: w,
Wallet: w,
ListenForChanges: cfg.ListenForChanges,
})
if err != nil {
return nil, errors.Wrap(err, "could not initialize derived keymanager")

View File

@@ -10,6 +10,7 @@ import (
"github.com/manifoldco/promptui"
"github.com/pkg/errors"
"github.com/prysmaticlabs/prysm/shared/promptutil"
"github.com/prysmaticlabs/prysm/validator/accounts/iface"
"github.com/prysmaticlabs/prysm/validator/accounts/prompt"
"github.com/prysmaticlabs/prysm/validator/accounts/wallet"
"github.com/prysmaticlabs/prysm/validator/flags"
@@ -22,11 +23,11 @@ import (
// CreateWalletConfig defines the parameters needed to call the create wallet functions.
type CreateWalletConfig struct {
WalletCfg *wallet.Config
RemoteKeymanagerOpts *remote.KeymanagerOpts
SkipMnemonicConfirm bool
Mnemonic25thWord string
NumAccounts int
RemoteKeymanagerOpts *remote.KeymanagerOpts
WalletCfg *wallet.Config
Mnemonic25thWord string
}
// CreateAndSaveWalletCli from user input with a desired keymanager. If a
@@ -72,7 +73,7 @@ func CreateWalletWithKeymanager(ctx context.Context, cfg *CreateWalletConfig) (*
if err = createImportedKeymanagerWallet(ctx, w); err != nil {
return nil, errors.Wrap(err, "could not initialize wallet")
}
km, err := w.InitializeKeymanager(ctx)
km, err := w.InitializeKeymanager(ctx, iface.InitKeymanagerConfig{ListenForChanges: false})
if err != nil {
return nil, errors.Wrap(err, ErrCouldNotInitializeKeymanager)
}
@@ -219,7 +220,8 @@ func createDerivedKeymanagerWallet(
return errors.Wrap(err, "could not save wallet to disk")
}
km, err := derived.NewKeymanager(ctx, &derived.SetupConfig{
Wallet: wallet,
Wallet: wallet,
ListenForChanges: true,
})
if err != nil {
return errors.Wrap(err, "could not initialize HD keymanager")

View File

@@ -129,7 +129,8 @@ func RecoverWallet(ctx context.Context, cfg *RecoverWalletConfig) (*wallet.Walle
return nil, errors.Wrap(err, "could not save wallet to disk")
}
km, err := derived.NewKeymanager(ctx, &derived.SetupConfig{
Wallet: w,
Wallet: w,
ListenForChanges: false,
})
if err != nil {
return nil, errors.Wrap(err, "could not make keymanager for given phrase")

View File

@@ -11,6 +11,7 @@ import (
"github.com/prysmaticlabs/prysm/shared/testutil/assert"
"github.com/prysmaticlabs/prysm/shared/testutil/require"
"github.com/prysmaticlabs/prysm/validator/accounts/iface"
"github.com/prysmaticlabs/prysm/validator/accounts/wallet"
"github.com/prysmaticlabs/prysm/validator/flags"
"github.com/prysmaticlabs/prysm/validator/keymanager"
@@ -71,7 +72,7 @@ func TestRecoverDerivedWallet(t *testing.T) {
})
assert.NoError(t, err)
km, err := w.InitializeKeymanager(cliCtx.Context)
km, err := w.InitializeKeymanager(cliCtx.Context, iface.InitKeymanagerConfig{ListenForChanges: false})
require.NoError(t, err)
derivedKM, ok := km.(*derived.Keymanager)
if !ok {

View File

@@ -39,6 +39,7 @@ go_library(
"//shared/slotutil:go_default_library",
"//shared/timeutils:go_default_library",
"//shared/traceutil:go_default_library",
"//validator/accounts/iface:go_default_library",
"//validator/accounts/wallet:go_default_library",
"//validator/db:go_default_library",
"//validator/db/kv:go_default_library",

View File

@@ -11,7 +11,7 @@ import (
ptypes "github.com/gogo/protobuf/types"
"github.com/golang/mock/gomock"
lru "github.com/hashicorp/golang-lru"
"github.com/prysmaticlabs/eth2-types"
types "github.com/prysmaticlabs/eth2-types"
ethpb "github.com/prysmaticlabs/ethereumapis/eth/v1alpha1"
validatorpb "github.com/prysmaticlabs/prysm/proto/validator/accounts/v2"
"github.com/prysmaticlabs/prysm/shared/bls"

View File

@@ -20,6 +20,7 @@ import (
"github.com/prysmaticlabs/prysm/shared/event"
"github.com/prysmaticlabs/prysm/shared/grpcutils"
"github.com/prysmaticlabs/prysm/shared/params"
accountsiface "github.com/prysmaticlabs/prysm/validator/accounts/iface"
"github.com/prysmaticlabs/prysm/validator/accounts/wallet"
"github.com/prysmaticlabs/prysm/validator/db"
"github.com/prysmaticlabs/prysm/validator/graffiti"
@@ -229,7 +230,7 @@ func (v *ValidatorService) recheckKeys(ctx context.Context) {
cleanup := sub.Unsubscribe
defer cleanup()
w := <-initializedChan
keyManager, err := w.InitializeKeymanager(ctx)
keyManager, err := w.InitializeKeymanager(ctx, accountsiface.InitKeymanagerConfig{ListenForChanges: true})
if err != nil {
// log.Fatalf will prevent defer from being called
cleanup()

View File

@@ -28,6 +28,7 @@ import (
"github.com/prysmaticlabs/prysm/shared/hashutil"
"github.com/prysmaticlabs/prysm/shared/params"
"github.com/prysmaticlabs/prysm/shared/slotutil"
accountsiface "github.com/prysmaticlabs/prysm/validator/accounts/iface"
"github.com/prysmaticlabs/prysm/validator/accounts/wallet"
vdb "github.com/prysmaticlabs/prysm/validator/db"
"github.com/prysmaticlabs/prysm/validator/graffiti"
@@ -114,7 +115,7 @@ func (v *validator) WaitForWalletInitialization(ctx context.Context) error {
for {
select {
case w := <-walletChan:
keyManager, err := w.InitializeKeymanager(ctx)
keyManager, err := w.InitializeKeymanager(ctx, accountsiface.InitKeymanagerConfig{ListenForChanges: true})
if err != nil {
return errors.Wrap(err, "could not read keymanager")
}

View File

@@ -323,7 +323,8 @@ func TestWaitForActivation_AccountsChanged(t *testing.T) {
}
ctx := context.Background()
km, err := derived.NewKeymanager(ctx, &derived.SetupConfig{
Wallet: wallet,
Wallet: wallet,
ListenForChanges: true,
})
require.NoError(t, err)
err = km.RecoverAccountsFromMnemonic(ctx, mnemonic, "", 1)

View File

@@ -26,7 +26,8 @@ const (
// SetupConfig includes configuration values for initializing
// a keymanager, such as passwords, the wallet, and more.
type SetupConfig struct {
Wallet iface.Wallet
Wallet iface.Wallet
ListenForChanges bool
}
// Keymanager implementation for derived, HD keymanager using EIP-2333 and EIP-2334.
@@ -40,7 +41,8 @@ func NewKeymanager(
cfg *SetupConfig,
) (*Keymanager, error) {
importedKM, err := imported.NewKeymanager(ctx, &imported.SetupConfig{
Wallet: cfg.Wallet,
Wallet: cfg.Wallet,
ListenForChanges: cfg.ListenForChanges,
})
if err != nil {
return nil, err

View File

@@ -26,7 +26,8 @@ func TestDerivedKeymanager_MnemnonicPassphrase_DifferentResults(t *testing.T) {
WalletPassword: "secretPassw0rd$1999",
}
km, err := NewKeymanager(ctx, &SetupConfig{
Wallet: wallet,
Wallet: wallet,
ListenForChanges: false,
})
require.NoError(t, err)
numAccounts := 5
@@ -40,7 +41,8 @@ func TestDerivedKeymanager_MnemnonicPassphrase_DifferentResults(t *testing.T) {
WalletPassword: "secretPassw0rd$1999",
}
km, err = NewKeymanager(ctx, &SetupConfig{
Wallet: wallet,
Wallet: wallet,
ListenForChanges: false,
})
require.NoError(t, err)
// No mnemonic passphrase this time.
@@ -80,7 +82,8 @@ func TestDerivedKeymanager_FetchValidatingPublicKeys(t *testing.T) {
}
ctx := context.Background()
dr, err := NewKeymanager(ctx, &SetupConfig{
Wallet: wallet,
Wallet: wallet,
ListenForChanges: false,
})
require.NoError(t, err)
numAccounts := 5
@@ -119,7 +122,8 @@ func TestDerivedKeymanager_FetchValidatingPrivateKeys(t *testing.T) {
}
ctx := context.Background()
dr, err := NewKeymanager(ctx, &SetupConfig{
Wallet: wallet,
Wallet: wallet,
ListenForChanges: false,
})
require.NoError(t, err)
numAccounts := 5
@@ -156,7 +160,8 @@ func TestDerivedKeymanager_Sign(t *testing.T) {
}
ctx := context.Background()
dr, err := NewKeymanager(ctx, &SetupConfig{
Wallet: wallet,
Wallet: wallet,
ListenForChanges: false,
})
require.NoError(t, err)
numAccounts := 5

View File

@@ -49,7 +49,8 @@ type Keymanager struct {
// SetupConfig includes configuration values for initializing
// a keymanager, such as passwords, the wallet, and more.
type SetupConfig struct {
Wallet iface.Wallet
Wallet iface.Wallet
ListenForChanges bool
}
// Defines a struct containing 1-to-1 corresponding
@@ -91,9 +92,11 @@ func NewKeymanager(ctx context.Context, cfg *SetupConfig) (*Keymanager, error) {
return nil, errors.Wrap(err, "failed to initialize account store")
}
// We begin a goroutine to listen for file changes to our
// all-accounts.keystore.json file in the wallet directory.
go k.listenForAccountChanges(ctx)
if cfg.ListenForChanges {
// We begin a goroutine to listen for file changes to our
// all-accounts.keystore.json file in the wallet directory.
go k.listenForAccountChanges(ctx)
}
return k, nil
}

View File

@@ -38,6 +38,7 @@ go_library(
"//shared/prometheus:go_default_library",
"//shared/tracing:go_default_library",
"//shared/version:go_default_library",
"//validator/accounts/iface:go_default_library",
"//validator/accounts/wallet:go_default_library",
"//validator/client:go_default_library",
"//validator/db/kv:go_default_library",

View File

@@ -26,6 +26,7 @@ import (
"github.com/prysmaticlabs/prysm/shared/prometheus"
"github.com/prysmaticlabs/prysm/shared/tracing"
"github.com/prysmaticlabs/prysm/shared/version"
accountsiface "github.com/prysmaticlabs/prysm/validator/accounts/iface"
"github.com/prysmaticlabs/prysm/validator/accounts/wallet"
"github.com/prysmaticlabs/prysm/validator/client"
"github.com/prysmaticlabs/prysm/validator/db/kv"
@@ -186,7 +187,7 @@ func (c *ValidatorClient) initializeFromCLI(cliCtx *cli.Context) error {
"wallet": w.AccountsDir(),
"keymanager-kind": w.KeymanagerKind().String(),
}).Info("Opened validator wallet")
keyManager, err = w.InitializeKeymanager(cliCtx.Context)
keyManager, err = w.InitializeKeymanager(cliCtx.Context, accountsiface.InitKeymanagerConfig{ListenForChanges: true})
if err != nil {
return errors.Wrap(err, "could not read keymanager for wallet")
}
@@ -282,7 +283,7 @@ func (c *ValidatorClient) initializeForWeb(cliCtx *cli.Context) error {
"wallet": w.AccountsDir(),
"keymanager-kind": w.KeymanagerKind().String(),
}).Info("Opened validator wallet")
keyManager, err = w.InitializeKeymanager(cliCtx.Context)
keyManager, err = w.InitializeKeymanager(cliCtx.Context, accountsiface.InitKeymanagerConfig{ListenForChanges: true})
if err != nil {
return errors.Wrap(err, "could not read keymanager for wallet")
}

View File

@@ -33,6 +33,7 @@ go_library(
"//shared/traceutil:go_default_library",
"//shared/version:go_default_library",
"//validator/accounts:go_default_library",
"//validator/accounts/iface:go_default_library",
"//validator/accounts/wallet:go_default_library",
"//validator/client:go_default_library",
"//validator/db:go_default_library",
@@ -84,6 +85,7 @@ go_test(
"//shared/testutil/require:go_default_library",
"//shared/timeutils:go_default_library",
"//validator/accounts:go_default_library",
"//validator/accounts/iface:go_default_library",
"//validator/accounts/wallet:go_default_library",
"//validator/client:go_default_library",
"//validator/db/testing:go_default_library",

View File

@@ -14,6 +14,7 @@ import (
"github.com/prysmaticlabs/prysm/shared/testutil/assert"
"github.com/prysmaticlabs/prysm/shared/testutil/require"
"github.com/prysmaticlabs/prysm/validator/accounts"
"github.com/prysmaticlabs/prysm/validator/accounts/iface"
"github.com/prysmaticlabs/prysm/validator/accounts/wallet"
"github.com/prysmaticlabs/prysm/validator/flags"
"github.com/prysmaticlabs/prysm/validator/keymanager"
@@ -40,7 +41,7 @@ func TestServer_ListAccounts(t *testing.T) {
SkipMnemonicConfirm: true,
})
require.NoError(t, err)
km, err := w.InitializeKeymanager(ctx)
km, err := w.InitializeKeymanager(ctx, iface.InitKeymanagerConfig{ListenForChanges: false})
require.NoError(t, err)
s := &Server{
keymanager: km,
@@ -106,7 +107,7 @@ func TestServer_BackupAccounts(t *testing.T) {
SkipMnemonicConfirm: true,
})
require.NoError(t, err)
km, err := w.InitializeKeymanager(ctx)
km, err := w.InitializeKeymanager(ctx, iface.InitKeymanagerConfig{ListenForChanges: false})
require.NoError(t, err)
s := &Server{
keymanager: km,

View File

@@ -14,6 +14,7 @@ import (
"github.com/prysmaticlabs/prysm/shared/fileutil"
"github.com/prysmaticlabs/prysm/shared/rand"
"github.com/prysmaticlabs/prysm/validator/accounts"
"github.com/prysmaticlabs/prysm/validator/accounts/iface"
"github.com/prysmaticlabs/prysm/validator/accounts/wallet"
"github.com/prysmaticlabs/prysm/validator/keymanager"
"github.com/prysmaticlabs/prysm/validator/keymanager/imported"
@@ -263,7 +264,7 @@ func (s *Server) initializeWallet(ctx context.Context, cfg *wallet.Config) error
}
s.walletInitialized = true
km, err := w.InitializeKeymanager(ctx)
km, err := w.InitializeKeymanager(ctx, iface.InitKeymanagerConfig{ListenForChanges: true})
if err != nil {
return errors.Wrap(err, accounts.ErrCouldNotInitializeKeymanager)
}

View File

@@ -10,8 +10,6 @@ import (
ptypes "github.com/gogo/protobuf/types"
"github.com/google/uuid"
keystorev4 "github.com/wealdtech/go-eth2-wallet-encryptor-keystorev4"
pb "github.com/prysmaticlabs/prysm/proto/validator/accounts/v2"
"github.com/prysmaticlabs/prysm/shared/bls"
"github.com/prysmaticlabs/prysm/shared/event"
@@ -20,9 +18,11 @@ import (
"github.com/prysmaticlabs/prysm/shared/testutil/assert"
"github.com/prysmaticlabs/prysm/shared/testutil/require"
"github.com/prysmaticlabs/prysm/validator/accounts"
"github.com/prysmaticlabs/prysm/validator/accounts/iface"
"github.com/prysmaticlabs/prysm/validator/accounts/wallet"
"github.com/prysmaticlabs/prysm/validator/keymanager"
"github.com/prysmaticlabs/prysm/validator/keymanager/imported"
keystorev4 "github.com/wealdtech/go-eth2-wallet-encryptor-keystorev4"
)
func TestServer_CreateWallet_Imported(t *testing.T) {
@@ -140,7 +140,7 @@ func TestServer_WalletConfig(t *testing.T) {
SkipMnemonicConfirm: true,
})
require.NoError(t, err)
km, err := w.InitializeKeymanager(ctx)
km, err := w.InitializeKeymanager(ctx, iface.InitKeymanagerConfig{ListenForChanges: false})
require.NoError(t, err)
s.wallet = w
s.keymanager = km
@@ -167,7 +167,7 @@ func TestServer_ImportKeystores_FailedPreconditions_WrongKeymanagerKind(t *testi
SkipMnemonicConfirm: true,
})
require.NoError(t, err)
km, err := w.InitializeKeymanager(ctx)
km, err := w.InitializeKeymanager(ctx, iface.InitKeymanagerConfig{ListenForChanges: false})
require.NoError(t, err)
ss := &Server{
wallet: w,
@@ -191,7 +191,7 @@ func TestServer_ImportKeystores_FailedPreconditions(t *testing.T) {
SkipMnemonicConfirm: true,
})
require.NoError(t, err)
km, err := w.InitializeKeymanager(ctx)
km, err := w.InitializeKeymanager(ctx, iface.InitKeymanagerConfig{ListenForChanges: false})
require.NoError(t, err)
ss := &Server{
keymanager: km,
@@ -227,7 +227,7 @@ func TestServer_ImportKeystores_OK(t *testing.T) {
SkipMnemonicConfirm: true,
})
require.NoError(t, err)
km, err := w.InitializeKeymanager(ctx)
km, err := w.InitializeKeymanager(ctx, iface.InitKeymanagerConfig{ListenForChanges: false})
require.NoError(t, err)
ss := &Server{
keymanager: km,
@@ -275,7 +275,7 @@ func TestServer_ImportKeystores_OK(t *testing.T) {
ImportedPublicKeys: pubKeys,
}, res)
km, err = w.InitializeKeymanager(ctx)
km, err = w.InitializeKeymanager(ctx, iface.InitKeymanagerConfig{ListenForChanges: false})
require.NoError(t, err)
keys, err = km.FetchValidatingPublicKeys(ctx)
require.NoError(t, err)