diff --git a/validator/accounts/accounts_backup.go b/validator/accounts/accounts_backup.go index 4badabb20a..ff8ba16053 100644 --- a/validator/accounts/accounts_backup.go +++ b/validator/accounts/accounts_backup.go @@ -23,8 +23,6 @@ import ( "github.com/prysmaticlabs/prysm/validator/accounts/userprompt" "github.com/prysmaticlabs/prysm/validator/accounts/wallet" "github.com/prysmaticlabs/prysm/validator/keymanager" - "github.com/prysmaticlabs/prysm/validator/keymanager/derived" - "github.com/prysmaticlabs/prysm/validator/keymanager/local" "github.com/urfave/cli/v2" ) @@ -94,32 +92,9 @@ func BackupAccountsCli(cliCtx *cli.Context) error { return errors.Wrap(err, "could not determine password for backed up accounts") } - var keystoresToBackup []*keymanager.Keystore - switch w.KeymanagerKind() { - case keymanager.Local: - km, ok := km.(*local.Keymanager) - if !ok { - return errors.New("could not assert keymanager interface to concrete type") - } - keystoresToBackup, err = km.ExtractKeystores(cliCtx.Context, filteredPubKeys, backupsPassword) - if err != nil { - return errors.Wrap(err, "could not backup accounts for local keymanager") - } - case keymanager.Derived: - km, ok := km.(*derived.Keymanager) - if !ok { - return errors.New("could not assert keymanager interface to concrete type") - } - keystoresToBackup, err = km.ExtractKeystores(cliCtx.Context, filteredPubKeys, backupsPassword) - if err != nil { - return errors.Wrap(err, "could not backup accounts for derived keymanager") - } - case keymanager.Remote: - return errors.New("backing up keys is not supported for a remote keymanager") - case keymanager.Web3Signer: - return errors.New("backing up keys is not supported for a web3signer keymanager") - default: - return fmt.Errorf(errKeymanagerNotSupported, w.KeymanagerKind()) + keystoresToBackup, err := km.ExtractKeystores(cliCtx.Context, filteredPubKeys, backupsPassword) + if err != nil { + return errors.Wrap(err, "could not extract keys from keymanager") } return zipKeystoresToOutputDir(keystoresToBackup, backupDir) } diff --git a/validator/accounts/accounts_list_test.go b/validator/accounts/accounts_list_test.go index 3b88507138..6b365d8624 100644 --- a/validator/accounts/accounts_list_test.go +++ b/validator/accounts/accounts_list_test.go @@ -49,6 +49,12 @@ func (_ *mockRemoteKeymanager) SubscribeAccountChanges(_ chan [][fieldparams.BLS return nil } +func (_ *mockRemoteKeymanager) ExtractKeystores( + ctx context.Context, publicKeys []bls.PublicKey, password string, +) ([]*keymanager.Keystore, error) { + return nil, nil +} + func createRandomKeystore(t testing.TB, password string) *keymanager.Keystore { encryptor := keystorev4.New() id, err := uuid.NewRandom() diff --git a/validator/client/validator_test.go b/validator/client/validator_test.go index 031dd12a97..cd47e90855 100644 --- a/validator/client/validator_test.go +++ b/validator/client/validator_test.go @@ -102,6 +102,13 @@ func (m *mockKeymanager) SimulateAccountChanges(newKeys [][fieldparams.BLSPubkey m.accountsChangedFeed.Send(newKeys) } +// ExtractKeystores -- +func (*mockKeymanager) ExtractKeystores( + ctx context.Context, publicKeys []bls.PublicKey, password string, +) ([]*keymanager.Keystore, error) { + return nil, errors.New("extracting keys not supported on mock keymanager") +} + func generateMockStatusResponse(pubkeys [][]byte) *ethpb.ValidatorActivationResponse { multipleStatus := make([]*ethpb.ValidatorActivationResponse_Status, len(pubkeys)) for i, key := range pubkeys { diff --git a/validator/keymanager/remote-web3signer/BUILD.bazel b/validator/keymanager/remote-web3signer/BUILD.bazel index 42a4e819bf..9c3605a821 100644 --- a/validator/keymanager/remote-web3signer/BUILD.bazel +++ b/validator/keymanager/remote-web3signer/BUILD.bazel @@ -17,6 +17,7 @@ go_library( "//crypto/bls:go_default_library", "//encoding/bytesutil:go_default_library", "//proto/prysm/v1alpha1/validator-client:go_default_library", + "//validator/keymanager:go_default_library", "//validator/keymanager/remote-web3signer/internal:go_default_library", "//validator/keymanager/remote-web3signer/v1:go_default_library", "@com_github_ethereum_go_ethereum//common/hexutil:go_default_library", diff --git a/validator/keymanager/remote-web3signer/keymanager.go b/validator/keymanager/remote-web3signer/keymanager.go index e2812382cb..8e0183f9c5 100644 --- a/validator/keymanager/remote-web3signer/keymanager.go +++ b/validator/keymanager/remote-web3signer/keymanager.go @@ -13,6 +13,7 @@ import ( "github.com/prysmaticlabs/prysm/crypto/bls" "github.com/prysmaticlabs/prysm/encoding/bytesutil" validatorpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1/validator-client" + "github.com/prysmaticlabs/prysm/validator/keymanager" "github.com/prysmaticlabs/prysm/validator/keymanager/remote-web3signer/internal" v1 "github.com/prysmaticlabs/prysm/validator/keymanager/remote-web3signer/v1" ) @@ -234,3 +235,10 @@ func (*Keymanager) SubscribeAccountChanges(_ chan [][48]byte) event.Subscription return nil }) } + +// ExtractKeystores is not supported for the remote keymanager type. +func (*Keymanager) ExtractKeystores( + ctx context.Context, publicKeys []bls.PublicKey, password string, +) ([]*keymanager.Keystore, error) { + return nil, errors.New("extracting keys is not supported for a web3signer keymanager") +} diff --git a/validator/keymanager/remote/keymanager.go b/validator/keymanager/remote/keymanager.go index 79e1a28b1a..5994dab9b8 100644 --- a/validator/keymanager/remote/keymanager.go +++ b/validator/keymanager/remote/keymanager.go @@ -267,3 +267,10 @@ func (km *Keymanager) Sign(ctx context.Context, req *validatorpb.SignRequest) (b func (km *Keymanager) SubscribeAccountChanges(pubKeysChan chan [][fieldparams.BLSPubkeyLength]byte) event.Subscription { return km.accountsChangedFeed.Subscribe(pubKeysChan) } + +// ExtractKeystores is not supported for the remote keymanager type. +func (*Keymanager) ExtractKeystores( + ctx context.Context, publicKeys []bls.PublicKey, password string, +) ([]*keymanager.Keystore, error) { + return nil, errors.New("extracting keys not supported for a remote keymanager") +} diff --git a/validator/keymanager/remote/mock/BUILD.bazel b/validator/keymanager/remote/mock/BUILD.bazel index 35ba3b7800..fd9fe3fbf7 100644 --- a/validator/keymanager/remote/mock/BUILD.bazel +++ b/validator/keymanager/remote/mock/BUILD.bazel @@ -11,5 +11,6 @@ go_library( "//config/fieldparams:go_default_library", "//crypto/bls:go_default_library", "//proto/prysm/v1alpha1/validator-client:go_default_library", + "//validator/keymanager:go_default_library", ], ) diff --git a/validator/keymanager/remote/mock/mock_keymanager.go b/validator/keymanager/remote/mock/mock_keymanager.go index f99fcd34c5..92cd636065 100644 --- a/validator/keymanager/remote/mock/mock_keymanager.go +++ b/validator/keymanager/remote/mock/mock_keymanager.go @@ -2,11 +2,13 @@ package mock import ( "context" + "errors" "github.com/prysmaticlabs/prysm/async/event" fieldparams "github.com/prysmaticlabs/prysm/config/fieldparams" "github.com/prysmaticlabs/prysm/crypto/bls" validatorpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1/validator-client" + "github.com/prysmaticlabs/prysm/validator/keymanager" ) // MockKeymanager -- @@ -45,3 +47,10 @@ func (m *MockKeymanager) ReloadPublicKeys(context.Context) ([][fieldparams.BLSPu m.ReloadPublicKeysChan <- m.PublicKeys return m.PublicKeys, nil } + +// ExtractKeystores -- +func (*MockKeymanager) ExtractKeystores( + ctx context.Context, publicKeys []bls.PublicKey, password string, +) ([]*keymanager.Keystore, error) { + return nil, errors.New("extracting keys not supported for a remote keymanager") +} diff --git a/validator/keymanager/types.go b/validator/keymanager/types.go index 4a313135a2..ee268568bb 100644 --- a/validator/keymanager/types.go +++ b/validator/keymanager/types.go @@ -17,6 +17,7 @@ type IKeymanager interface { PublicKeysFetcher Signer KeyChangeSubscriber + KeyStoreExtractor } // KeysFetcher for validating private and public keys. @@ -52,6 +53,11 @@ type KeyChangeSubscriber interface { SubscribeAccountChanges(pubKeysChan chan [][fieldparams.BLSPubkeyLength]byte) event.Subscription } +// KeyStoreExtractor allows keys to be extracted from the keymanager. +type KeyStoreExtractor interface { + ExtractKeystores(ctx context.Context, publicKeys []bls.PublicKey, password string) ([]*Keystore, error) +} + // Keystore json file representation as a Go struct. type Keystore struct { Crypto map[string]interface{} `json:"crypto"`