mirror of
https://github.com/OffchainLabs/prysm.git
synced 2026-01-09 15:37:56 -05:00
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:
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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")
|
||||
}
|
||||
|
||||
@@ -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")
|
||||
}
|
||||
|
||||
@@ -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",
|
||||
],
|
||||
)
|
||||
|
||||
@@ -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")
|
||||
}
|
||||
|
||||
@@ -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"`
|
||||
|
||||
Reference in New Issue
Block a user