Adding ExtractKeystores to the Keymanager interface (#10313)

* adding ExtractKeystores to the Keymanager interface

* adding ExtractKeystore to mockKeymanager struct types

* bazel run //:gazelle -- fix

Co-authored-by: prestonvanloon <preston@prysmaticlabs.com>
Co-authored-by: james-prysm <90280386+james-prysm@users.noreply.github.com>
This commit is contained in:
Michael Neuder
2022-03-10 12:19:04 -05:00
committed by GitHub
parent 12080727ea
commit 27082e2cd2
9 changed files with 48 additions and 28 deletions

View File

@@ -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)
}

View File

@@ -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()

View File

@@ -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 {

View File

@@ -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",

View File

@@ -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")
}

View File

@@ -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")
}

View File

@@ -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",
],
)

View File

@@ -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")
}

View File

@@ -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"`