From 1bc86d2658ed73dae78c61ee8a6753267e9af164 Mon Sep 17 00:00:00 2001 From: Raul Jordan Date: Mon, 19 Oct 2020 20:22:36 -0500 Subject: [PATCH] Remove Account Creation Privilege For Imported Keymanager (#7555) * rem create * remove create account privilege for nonhd wallets * fix bazel * radek feedback Co-authored-by: prylabs-bulldozer[bot] <58059840+prylabs-bulldozer[bot]@users.noreply.github.com> --- validator/accounts/BUILD.bazel | 1 - validator/accounts/accounts_create.go | 10 +-- validator/accounts/accounts_create_test.go | 84 ------------------- validator/accounts/accounts_list_test.go | 43 ++++++++-- validator/accounts/wallet_edit_test.go | 4 +- validator/keymanager/imported/BUILD.bazel | 5 -- validator/keymanager/imported/keymanager.go | 81 ------------------ .../keymanager/imported/keymanager_test.go | 60 ++----------- validator/rpc/accounts.go | 31 ++----- validator/rpc/accounts_test.go | 1 - 10 files changed, 58 insertions(+), 262 deletions(-) diff --git a/validator/accounts/BUILD.bazel b/validator/accounts/BUILD.bazel index 08369fc2ad..a05a9fff3a 100644 --- a/validator/accounts/BUILD.bazel +++ b/validator/accounts/BUILD.bazel @@ -78,7 +78,6 @@ go_test( "//shared/mock:go_default_library", "//shared/params:go_default_library", "//shared/petnames:go_default_library", - "//shared/promptutil:go_default_library", "//shared/testutil:go_default_library", "//shared/testutil/assert:go_default_library", "//shared/testutil/require:go_default_library", diff --git a/validator/accounts/accounts_create.go b/validator/accounts/accounts_create.go index edb37940af..b1307a84c0 100644 --- a/validator/accounts/accounts_create.go +++ b/validator/accounts/accounts_create.go @@ -13,7 +13,6 @@ import ( "github.com/prysmaticlabs/prysm/validator/flags" "github.com/prysmaticlabs/prysm/validator/keymanager" "github.com/prysmaticlabs/prysm/validator/keymanager/derived" - "github.com/prysmaticlabs/prysm/validator/keymanager/imported" "github.com/sirupsen/logrus" "github.com/urfave/cli/v2" ) @@ -56,14 +55,7 @@ func CreateAccount(ctx context.Context, cfg *CreateAccountConfig) error { case keymanager.Remote: return errors.New("cannot create a new account for a remote keymanager") case keymanager.Imported: - km, ok := km.(*imported.Keymanager) - if !ok { - return errors.New("not a imported keymanager") - } - // Create a new validator account using the specified keymanager. - if _, _, err := km.CreateAccount(ctx); err != nil { - return errors.Wrap(err, "could not create account in wallet") - } + return errors.New("cannot create a new account for an imported wallet") case keymanager.Derived: km, ok := km.(*derived.Keymanager) if !ok { diff --git a/validator/accounts/accounts_create_test.go b/validator/accounts/accounts_create_test.go index 608601f451..3e260a20a6 100644 --- a/validator/accounts/accounts_create_test.go +++ b/validator/accounts/accounts_create_test.go @@ -4,19 +4,15 @@ import ( "context" "encoding/hex" "fmt" - "io/ioutil" - "os" "testing" ethpb "github.com/prysmaticlabs/ethereumapis/eth/v1alpha1" "github.com/prysmaticlabs/prysm/shared/params" - "github.com/prysmaticlabs/prysm/shared/promptutil" "github.com/prysmaticlabs/prysm/shared/testutil/assert" "github.com/prysmaticlabs/prysm/shared/testutil/require" "github.com/prysmaticlabs/prysm/validator/accounts/wallet" "github.com/prysmaticlabs/prysm/validator/keymanager" "github.com/prysmaticlabs/prysm/validator/keymanager/derived" - logTest "github.com/sirupsen/logrus/hooks/test" ) func TestCreateAccount_Derived(t *testing.T) { @@ -65,86 +61,6 @@ func TestCreateAccount_Derived(t *testing.T) { require.Equal(t, len(names), int(numAccounts)) } -// passwordReader will store data that will be later used to mock Stdin by Test_KeysConsistency_Direct -type passwordReader struct { - password string - counter int // counter equals the maximum number of times method passwordReaderFunc can be called -} - -// Instead of forwarding the read request to terminal.ReadPassword(), we simply provide a canned response. -func (p *passwordReader) passwordReaderFunc(_ *os.File) ([]byte, error) { - p.counter-- - if p.counter <= 0 { - log.Fatalln("Too many password attempts using passwordReaderFunc()") - } - return []byte(p.password), nil -} - -// Test_KeysConsistency_Imported checks that the password does not change due to account creation in a Imported wallet -func Test_KeysConsistency_Imported(t *testing.T) { - walletDir, passwordsDir, walletPasswordFile := setupWalletAndPasswordsDir(t) - - // Specify the 'initial'/correct password locally to this file for convenience. - require.NoError(t, ioutil.WriteFile(walletPasswordFile, []byte("Pa$sW0rD0__Fo0xPr"), os.ModePerm)) - - cliCtx := setupWalletCtx(t, &testWalletConfig{ - walletDir: walletDir, - passwordsDir: passwordsDir, - keymanagerKind: keymanager.Imported, - walletPasswordFile: walletPasswordFile, - }) - - w, err := CreateAndSaveWalletCli(cliCtx) - require.NoError(t, err) - - // Create an account using "Pa$sW0rD0__Fo0xPr" - err = CreateAccount(cliCtx.Context, &CreateAccountConfig{ - Wallet: w, - NumAccounts: 1, - }) - require.NoError(t, err) - - /* The bug this test checks for works like this: Input wrong password followed by the correct password. - This causes the wallet's password to change to the (initially) wrong provided password. - */ - - // Now we change the password to "SecoNDxyzPass__9!@#" - require.NoError(t, ioutil.WriteFile(walletPasswordFile, []byte("SecoNDxyzPass__9!@#"), os.ModePerm)) - _, err = wallet.OpenWalletOrElseCli(cliCtx, CreateAndSaveWalletCli) - require.ErrorContains(t, "wrong password for wallet", err) - - require.NoError(t, ioutil.WriteFile(walletPasswordFile, []byte("Pa$sW0rD0__Fo0xPr"), os.ModePerm)) - w, err = wallet.OpenWalletOrElseCli(cliCtx, CreateAndSaveWalletCli) - require.NoError(t, err) - - /* The purpose of using a passwordReader object is to store a 'canned' response for when the program - asks for more passwords. As we are about to call CreateAccount() with an incorrect password, we expect the - program to ask for more attempts via Stdin. This will provide the correct password.*/ - mockPasswordReader := passwordReader{password: "Pa$sW0rD0__Fo0xPr", counter: 3} - // Redirect promptutil's PasswordReader to our function which bypasses/mocks Stdin - promptutil.PasswordReader = mockPasswordReader.passwordReaderFunc - - err = CreateAccount(cliCtx.Context, &CreateAccountConfig{ - Wallet: w, - NumAccounts: 1, - }) - require.NoError(t, err) - - // Now we make sure a bug did not change the password to "SecoNDxyzPass__9!@#" - logHook := logTest.NewGlobal() - require.NoError(t, ioutil.WriteFile(walletPasswordFile, []byte("Pa$sW0rD0__Fo0xPr"), os.ModePerm)) - w, err = wallet.OpenWalletOrElseCli(cliCtx, CreateAndSaveWalletCli) - require.NoError(t, err) - mockPasswordReader.counter = 3 - - err = CreateAccount(cliCtx.Context, &CreateAccountConfig{ - Wallet: w, - NumAccounts: 1, - }) - require.NoError(t, err) - assert.LogsContain(t, logHook, "Successfully created new validator account") -} - func TestDepositDataJSON(t *testing.T) { // Use a real deposit data JSON fixture generated by the eth2 deposit cli fixture := make(map[string]string) diff --git a/validator/accounts/accounts_list_test.go b/validator/accounts/accounts_list_test.go index 6e90137ec9..4d3e01a073 100644 --- a/validator/accounts/accounts_list_test.go +++ b/validator/accounts/accounts_list_test.go @@ -9,6 +9,7 @@ import ( "strings" "testing" + "github.com/google/uuid" validatorpb "github.com/prysmaticlabs/prysm/proto/validator/accounts/v2" "github.com/prysmaticlabs/prysm/shared/bls" "github.com/prysmaticlabs/prysm/shared/bytesutil" @@ -20,6 +21,7 @@ import ( "github.com/prysmaticlabs/prysm/validator/keymanager/derived" "github.com/prysmaticlabs/prysm/validator/keymanager/imported" "github.com/prysmaticlabs/prysm/validator/keymanager/remote" + keystorev4 "github.com/wealdtech/go-eth2-wallet-encryptor-keystorev4" ) type mockRemoteKeymanager struct { @@ -35,6 +37,23 @@ func (m *mockRemoteKeymanager) Sign(context.Context, *validatorpb.SignRequest) ( return nil, nil } +func createRandomKeystore(t testing.TB, password string) *keymanager.Keystore { + encryptor := keystorev4.New() + id, err := uuid.NewRandom() + require.NoError(t, err) + validatingKey := bls.RandKey() + pubKey := validatingKey.PublicKey().Marshal() + cryptoFields, err := encryptor.Encrypt(validatingKey.Marshal(), password) + require.NoError(t, err) + return &keymanager.Keystore{ + Crypto: cryptoFields, + Pubkey: fmt.Sprintf("%x", pubKey), + ID: id.String(), + Version: encryptor.Version(), + Name: encryptor.Name(), + } +} + func TestListAccounts_ImportedKeymanager(t *testing.T) { walletDir, passwordsDir, walletPasswordFile := setupWalletAndPasswordsDir(t) cliCtx := setupWalletCtx(t, &testWalletConfig{ @@ -51,7 +70,7 @@ func TestListAccounts_ImportedKeymanager(t *testing.T) { }, }) require.NoError(t, err) - keymanager, err := imported.NewKeymanager( + km, err := imported.NewKeymanager( cliCtx.Context, &imported.SetupConfig{ Wallet: w, @@ -61,17 +80,27 @@ func TestListAccounts_ImportedKeymanager(t *testing.T) { require.NoError(t, err) numAccounts := 5 + keystores := make([]*keymanager.Keystore, numAccounts) for i := 0; i < numAccounts; i++ { - _, _, err := keymanager.CreateAccount(cliCtx.Context) - require.NoError(t, err) + keystores[i] = createRandomKeystore(t, password) } + require.NoError(t, km.ImportKeystores(cliCtx.Context, keystores, password)) + rescueStdout := os.Stdout r, writer, err := os.Pipe() require.NoError(t, err) os.Stdout = writer // We call the list imported keymanager accounts function. - require.NoError(t, listImportedKeymanagerAccounts(context.Background(), true /* show deposit data */, true /*show private keys */, keymanager)) + require.NoError( + t, + listImportedKeymanagerAccounts( + context.Background(), + true, /* show deposit data */ + true, /*show private keys */ + km, + ), + ) require.NoError(t, writer.Close()) out, err := ioutil.ReadAll(r) @@ -140,7 +169,7 @@ func TestListAccounts_ImportedKeymanager(t *testing.T) { assert.Equal(t, true, kindFound, "Keymanager Kind %s not found on the first line", kindString) // Get account names and require the correct count - accountNames, err := keymanager.ValidatingAccountNames() + accountNames, err := km.ValidatingAccountNames() require.NoError(t, err) require.Equal(t, numAccounts, len(accountNames)) @@ -152,7 +181,7 @@ func TestListAccounts_ImportedKeymanager(t *testing.T) { } // Get public keys and require the correct count - pubKeys, err := keymanager.FetchValidatingPublicKeys(cliCtx.Context) + pubKeys, err := km.FetchValidatingPublicKeys(cliCtx.Context) require.NoError(t, err) require.Equal(t, numAccounts, len(pubKeys)) @@ -165,7 +194,7 @@ func TestListAccounts_ImportedKeymanager(t *testing.T) { } // Get private keys and require the correct count - privKeys, err := keymanager.FetchValidatingPrivateKeys(cliCtx.Context) + privKeys, err := km.FetchValidatingPrivateKeys(cliCtx.Context) require.NoError(t, err) require.Equal(t, numAccounts, len(pubKeys)) diff --git a/validator/accounts/wallet_edit_test.go b/validator/accounts/wallet_edit_test.go index 29c8cd5b75..442e4788f8 100644 --- a/validator/accounts/wallet_edit_test.go +++ b/validator/accounts/wallet_edit_test.go @@ -14,7 +14,7 @@ import ( ) func TestEditWalletConfiguration(t *testing.T) { - walletDir, _, _ := setupWalletAndPasswordsDir(t) + walletDir, _, passwordFile := setupWalletAndPasswordsDir(t) cliCtx := setupWalletCtx(t, &testWalletConfig{ walletDir: walletDir, keymanagerKind: keymanager.Remote, @@ -51,11 +51,13 @@ func TestEditWalletConfiguration(t *testing.T) { app := cli.App{} set := flag.NewFlagSet("test", 0) set.String(flags.WalletDirFlag.Name, walletDir, "") + set.String(flags.WalletPasswordFileFlag.Name, passwordFile, "") set.String(flags.GrpcRemoteAddressFlag.Name, wantCfg.RemoteAddr, "") set.String(flags.RemoteSignerCertPathFlag.Name, wantCfg.RemoteCertificate.ClientCertPath, "") set.String(flags.RemoteSignerKeyPathFlag.Name, wantCfg.RemoteCertificate.ClientKeyPath, "") set.String(flags.RemoteSignerCACertPathFlag.Name, wantCfg.RemoteCertificate.CACertPath, "") assert.NoError(t, set.Set(flags.WalletDirFlag.Name, walletDir)) + assert.NoError(t, set.Set(flags.WalletPasswordFileFlag.Name, passwordFile)) assert.NoError(t, set.Set(flags.GrpcRemoteAddressFlag.Name, wantCfg.RemoteAddr)) assert.NoError(t, set.Set(flags.RemoteSignerCertPathFlag.Name, wantCfg.RemoteCertificate.ClientCertPath)) assert.NoError(t, set.Set(flags.RemoteSignerKeyPathFlag.Name, wantCfg.RemoteCertificate.ClientKeyPath)) diff --git a/validator/keymanager/imported/BUILD.bazel b/validator/keymanager/imported/BUILD.bazel index 22d12a0a88..96ec2e73a9 100644 --- a/validator/keymanager/imported/BUILD.bazel +++ b/validator/keymanager/imported/BUILD.bazel @@ -16,16 +16,13 @@ go_library( "//validator:__subpackages__", ], deps = [ - "//beacon-chain/core/helpers:go_default_library", "//proto/validator/accounts/v2:go_default_library", "//shared/asyncutil:go_default_library", "//shared/bls:go_default_library", "//shared/bytesutil:go_default_library", - "//shared/depositutil:go_default_library", "//shared/event:go_default_library", "//shared/fileutil:go_default_library", "//shared/interop:go_default_library", - "//shared/params:go_default_library", "//shared/petnames:go_default_library", "//validator/accounts/iface:go_default_library", "//validator/keymanager:go_default_library", @@ -34,7 +31,6 @@ go_library( "@com_github_k0kubun_go_ansi//:go_default_library", "@com_github_logrusorgru_aurora//:go_default_library", "@com_github_pkg_errors//:go_default_library", - "@com_github_prysmaticlabs_ethereumapis//eth/v1alpha1:go_default_library", "@com_github_schollz_progressbar_v3//:go_default_library", "@com_github_sirupsen_logrus//:go_default_library", "@com_github_wealdtech_go_eth2_wallet_encryptor_keystorev4//:go_default_library", @@ -56,7 +52,6 @@ go_test( "//shared/bls:go_default_library", "//shared/bytesutil:go_default_library", "//shared/event:go_default_library", - "//shared/petnames:go_default_library", "//shared/testutil/assert:go_default_library", "//shared/testutil/require:go_default_library", "//validator/accounts/testing:go_default_library", diff --git a/validator/keymanager/imported/keymanager.go b/validator/keymanager/imported/keymanager.go index 29345b3e58..1dcdb54d1b 100644 --- a/validator/keymanager/imported/keymanager.go +++ b/validator/keymanager/imported/keymanager.go @@ -13,15 +13,11 @@ import ( "github.com/google/uuid" "github.com/logrusorgru/aurora" "github.com/pkg/errors" - ethpb "github.com/prysmaticlabs/ethereumapis/eth/v1alpha1" - "github.com/prysmaticlabs/prysm/beacon-chain/core/helpers" validatorpb "github.com/prysmaticlabs/prysm/proto/validator/accounts/v2" "github.com/prysmaticlabs/prysm/shared/bls" "github.com/prysmaticlabs/prysm/shared/bytesutil" - "github.com/prysmaticlabs/prysm/shared/depositutil" "github.com/prysmaticlabs/prysm/shared/event" "github.com/prysmaticlabs/prysm/shared/interop" - "github.com/prysmaticlabs/prysm/shared/params" "github.com/prysmaticlabs/prysm/shared/petnames" "github.com/prysmaticlabs/prysm/validator/accounts/iface" "github.com/prysmaticlabs/prysm/validator/keymanager" @@ -219,83 +215,6 @@ func (dr *Keymanager) initializeKeysCachesFromKeystore() error { return nil } -// CreateAccount for a imported keymanager implementation. This utilizes -// the EIP-2335 keystore standard for BLS12-381 keystores. It -// stores the generated keystore.json file in the wallet and additionally -// generates withdrawal credentials. At the end, it logs -// the raw deposit data hex string for users to copy. -func (dr *Keymanager) CreateAccount(ctx context.Context) ([]byte, *ethpb.Deposit_Data, error) { - // Create a petname for an account from its public key and write its password to disk. - validatingKey := bls.RandKey() - accountName := petnames.DeterministicName(validatingKey.PublicKey().Marshal(), "-") - dr.accountsStore.PrivateKeys = append(dr.accountsStore.PrivateKeys, validatingKey.Marshal()) - dr.accountsStore.PublicKeys = append(dr.accountsStore.PublicKeys, validatingKey.PublicKey().Marshal()) - newStore, err := dr.createAccountsKeystore(ctx, dr.accountsStore.PrivateKeys, dr.accountsStore.PublicKeys) - if err != nil { - return nil, nil, errors.Wrap(err, "could not create accounts keystore") - } - - // Generate a withdrawal key and confirm user - // acknowledgement of a 256-bit entropy mnemonic phrase. - withdrawalKey := bls.RandKey() - log.Info( - "Write down the private key, as it is your unique " + - "withdrawal private key for eth2", - ) - fmt.Printf(` -==========================Withdrawal Key=========================== - -%#x - -=================================================================== - `, withdrawalKey.Marshal()) - fmt.Println(" ") - - // Upon confirmation of the withdrawal key, proceed to display - // and write associated deposit data to disk. - tx, data, err := depositutil.GenerateDepositTransaction(validatingKey, withdrawalKey) - if err != nil { - return nil, nil, errors.Wrap(err, "could not generate deposit transaction data") - } - domain, err := helpers.ComputeDomain( - params.BeaconConfig().DomainDeposit, - nil, /*forkVersion*/ - nil, /*genesisValidatorsRoot*/ - ) - if err != nil { - return nil, nil, err - } - if err := depositutil.VerifyDepositSignature(data, domain); err != nil { - return nil, nil, errors.Wrap(err, "failed to verify deposit signature, please make sure your account was created properly") - } - - // Log the deposit transaction data to the user. - fmt.Printf(` -==================Eth1 Deposit Transaction Data================= -%#x -================Verified for the %s network================`, tx.Data(), params.BeaconConfig().NetworkName) - fmt.Println("") - - // Write the encoded keystore. - encoded, err := json.MarshalIndent(newStore, "", "\t") - if err != nil { - return nil, nil, err - } - if err := dr.wallet.WriteFileAtPath(ctx, AccountsPath, accountsKeystoreFileName, encoded); err != nil { - return nil, nil, errors.Wrap(err, "could not write keystore file for accounts") - } - - log.WithFields(logrus.Fields{ - "name": accountName, - }).Info("Successfully created new validator account") - - err = dr.initializeKeysCachesFromKeystore() - if err != nil { - return nil, nil, errors.Wrap(err, "failed to initialize keys caches") - } - return validatingKey.PublicKey().Marshal(), data, nil -} - // DeleteAccounts takes in public keys and removes the accounts entirely. This includes their disk keystore and cached keystore. func (dr *Keymanager) DeleteAccounts(ctx context.Context, publicKeys [][]byte) error { for _, publicKey := range publicKeys { diff --git a/validator/keymanager/imported/keymanager_test.go b/validator/keymanager/imported/keymanager_test.go index 015d3f14c1..61b16253e7 100644 --- a/validator/keymanager/imported/keymanager_test.go +++ b/validator/keymanager/imported/keymanager_test.go @@ -10,7 +10,6 @@ import ( validatorpb "github.com/prysmaticlabs/prysm/proto/validator/accounts/v2" "github.com/prysmaticlabs/prysm/shared/bls" "github.com/prysmaticlabs/prysm/shared/bytesutil" - "github.com/prysmaticlabs/prysm/shared/petnames" "github.com/prysmaticlabs/prysm/shared/testutil/assert" "github.com/prysmaticlabs/prysm/shared/testutil/require" mock "github.com/prysmaticlabs/prysm/validator/accounts/testing" @@ -19,50 +18,6 @@ import ( keystorev4 "github.com/wealdtech/go-eth2-wallet-encryptor-keystorev4" ) -func TestImportedKeymanager_CreateAccount(t *testing.T) { - hook := logTest.NewGlobal() - password := "secretPassw0rd$1999" - wallet := &mock.Wallet{ - Files: make(map[string]map[string][]byte), - WalletPassword: password, - } - dr := &Keymanager{ - wallet: wallet, - accountsStore: &AccountStore{}, - } - ctx := context.Background() - createdPubKey, _, err := dr.CreateAccount(ctx) - require.NoError(t, err) - - // Ensure the keystore file was written to the wallet - // and ensure we can decrypt it using the EIP-2335 standard. - var encodedKeystore []byte - for k, v := range wallet.Files[AccountsPath] { - if strings.Contains(k, "keystore") { - encodedKeystore = v - } - } - require.NotNil(t, encodedKeystore, "could not find keystore file") - keystoreFile := &keymanager.Keystore{} - require.NoError(t, json.Unmarshal(encodedKeystore, keystoreFile)) - - // We extract the accounts from the keystore. - decryptor := keystorev4.New() - encodedAccounts, err := decryptor.Decrypt(keystoreFile.Crypto, password) - require.NoError(t, err, "Could not decrypt validator accounts") - store := &AccountStore{} - require.NoError(t, json.Unmarshal(encodedAccounts, store)) - - require.Equal(t, 1, len(store.PublicKeys)) - require.Equal(t, 1, len(store.PrivateKeys)) - privKey, err := bls.SecretKeyFromBytes(store.PrivateKeys[0]) - require.NoError(t, err) - pubKey := privKey.PublicKey().Marshal() - assert.DeepEqual(t, pubKey, store.PublicKeys[0]) - require.LogsContain(t, hook, petnames.DeterministicName(createdPubKey, "-")) - require.LogsContain(t, hook, "Successfully created new validator account") -} - func TestImportedKeymanager_RemoveAccounts(t *testing.T) { hook := logTest.NewGlobal() password := "secretPassw0rd$1999" @@ -76,10 +31,11 @@ func TestImportedKeymanager_RemoveAccounts(t *testing.T) { } numAccounts := 5 ctx := context.Background() + keystores := make([]*keymanager.Keystore, numAccounts) for i := 0; i < numAccounts; i++ { - _, _, err := dr.CreateAccount(ctx) - require.NoError(t, err) + keystores[i] = createRandomKeystore(t, password) } + require.NoError(t, dr.ImportKeystores(ctx, keystores, password)) accounts, err := dr.FetchValidatingPublicKeys(ctx) require.NoError(t, err) require.Equal(t, numAccounts, len(accounts)) @@ -193,10 +149,11 @@ func TestImportedKeymanager_Sign(t *testing.T) { // First, generate accounts and their keystore.json files. ctx := context.Background() numAccounts := 10 + keystores := make([]*keymanager.Keystore, numAccounts) for i := 0; i < numAccounts; i++ { - _, _, err := dr.CreateAccount(ctx) - require.NoError(t, err) + keystores[i] = createRandomKeystore(t, password) } + require.NoError(t, dr.ImportKeystores(ctx, keystores, password)) var encodedKeystore []byte for k, v := range wallet.Files[AccountsPath] { @@ -276,10 +233,11 @@ func TestImportedKeymanager_RefreshWalletPassword(t *testing.T) { ctx := context.Background() numAccounts := 5 + keystores := make([]*keymanager.Keystore, numAccounts) for i := 0; i < numAccounts; i++ { - _, _, err := dr.CreateAccount(ctx) - require.NoError(t, err) + keystores[i] = createRandomKeystore(t, password) } + require.NoError(t, dr.ImportKeystores(ctx, keystores, password)) var encodedKeystore []byte for k, v := range wallet.Files[AccountsPath] { diff --git a/validator/rpc/accounts.go b/validator/rpc/accounts.go index d5cba84b95..73aa0b3b69 100644 --- a/validator/rpc/accounts.go +++ b/validator/rpc/accounts.go @@ -31,26 +31,13 @@ func (s *Server) CreateAccount(ctx context.Context, req *pb.CreateAccountRequest if !s.walletInitialized { return nil, status.Error(codes.FailedPrecondition, "Wallet not yet initialized") } - var creator accountCreator - switch s.wallet.KeymanagerKind() { - case keymanager.Remote: - return nil, status.Error(codes.InvalidArgument, "Cannot create account for remote keymanager") - case keymanager.Imported: - km, ok := s.keymanager.(*imported.Keymanager) - if !ok { - return nil, status.Error(codes.InvalidArgument, "Not a imported keymanager") - } - creator = km - case keymanager.Derived: - km, ok := s.keymanager.(*derived.Keymanager) - if !ok { - return nil, status.Error(codes.InvalidArgument, "Not a derived keymanager") - } - creator = km + km, ok := s.keymanager.(*derived.Keymanager) + if !ok { + return nil, status.Error(codes.InvalidArgument, "Only HD wallets can create accounts") } dataList := make([]*pb.DepositDataResponse_DepositData, req.NumAccounts) for i := uint64(0); i < req.NumAccounts; i++ { - data, err := createAccountWithDepositData(ctx, creator) + data, err := createAccountWithDepositData(ctx, km) if err != nil { return nil, err } @@ -75,19 +62,19 @@ func (s *Server) ListAccounts(ctx context.Context, req *pb.ListAccountsRequest) if err != nil { return nil, err } - accounts := make([]*pb.Account, len(keys)) + accs := make([]*pb.Account, len(keys)) for i := 0; i < len(keys); i++ { - accounts[i] = &pb.Account{ + accs[i] = &pb.Account{ ValidatingPublicKey: keys[i][:], AccountName: petnames.DeterministicName(keys[i][:], "-"), } if s.wallet.KeymanagerKind() == keymanager.Derived { - accounts[i].DerivationPath = fmt.Sprintf(derived.ValidatingKeyDerivationPathTemplate, i) + accs[i].DerivationPath = fmt.Sprintf(derived.ValidatingKeyDerivationPathTemplate, i) } } if req.All { return &pb.ListAccountsResponse{ - Accounts: accounts, + Accounts: accs, TotalSize: int32(len(keys)), NextPageToken: "", }, nil @@ -101,7 +88,7 @@ func (s *Server) ListAccounts(ctx context.Context, req *pb.ListAccountsRequest) ) } return &pb.ListAccountsResponse{ - Accounts: accounts[start:end], + Accounts: accs[start:end], TotalSize: int32(len(keys)), NextPageToken: nextPageToken, }, nil diff --git a/validator/rpc/accounts_test.go b/validator/rpc/accounts_test.go index 710f6f81f1..ecea2e18cd 100644 --- a/validator/rpc/accounts_test.go +++ b/validator/rpc/accounts_test.go @@ -24,7 +24,6 @@ import ( ) var defaultWalletPath = filepath.Join(flags.DefaultValidatorDir(), flags.WalletDefaultDirName) -var _ accountCreator = (*mockAccountCreator)(nil) type mockAccountCreator struct { data *ethpb.Deposit_Data