prysm-pulse/validator/accounts/accounts_list.go
Mike Neuder 002253bba3
Migrating Keymanager account list functionality into each type (#10382)
* Migrating Keymanager account list functionality into each keymanager type

* Addressing review comments

* Adding newline at end of BUILD.bazel

* bazel run //:gazelle -- fix

Co-authored-by: james-prysm <90280386+james-prysm@users.noreply.github.com>
2022-03-22 03:04:09 +00:00

77 lines
2.6 KiB
Go

package accounts
import (
"context"
"fmt"
"math"
"strings"
"github.com/pkg/errors"
"github.com/prysmaticlabs/prysm/cmd/validator/flags"
ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1"
"github.com/prysmaticlabs/prysm/validator/accounts/iface"
"github.com/prysmaticlabs/prysm/validator/accounts/wallet"
"github.com/prysmaticlabs/prysm/validator/keymanager"
"github.com/urfave/cli/v2"
)
// ListAccountsCli displays all available validator accounts in a Prysm wallet.
func ListAccountsCli(cliCtx *cli.Context) error {
w, err := wallet.OpenWalletOrElseCli(cliCtx, func(cliCtx *cli.Context) (*wallet.Wallet, error) {
return nil, wallet.ErrNoWalletFound
})
if err != nil {
return errors.Wrap(err, "could not open wallet")
}
// TODO(#9883) - Remove this when we have a better way to handle this. this is fine.
// genesis root is not set here which is used for sign function, but fetch keys should be fine.
km, err := w.InitializeKeymanager(cliCtx.Context, iface.InitKeymanagerConfig{ListenForChanges: false})
if err != nil && strings.Contains(err.Error(), keymanager.IncorrectPasswordErrMsg) {
return errors.New("wrong wallet password entered")
}
if err != nil {
return errors.Wrap(err, ErrCouldNotInitializeKeymanager)
}
showDepositData := cliCtx.Bool(flags.ShowDepositDataFlag.Name)
showPrivateKeys := cliCtx.Bool(flags.ShowPrivateKeysFlag.Name)
listIndices := cliCtx.Bool(flags.ListValidatorIndices.Name)
if listIndices {
client, _, err := prepareClients(cliCtx)
if err != nil {
return err
}
return listValidatorIndices(cliCtx.Context, km, *client)
}
return km.ListKeymanagerAccounts(cliCtx.Context,
keymanager.ListKeymanagerAccountConfig{
ShowDepositData: showDepositData,
ShowPrivateKeys: showPrivateKeys,
WalletAccountsDir: w.AccountsDir(),
KeymanagerConfigFileName: wallet.KeymanagerConfigFileName,
})
}
func listValidatorIndices(ctx context.Context, km keymanager.IKeymanager, client ethpb.BeaconNodeValidatorClient) error {
pubKeys, err := km.FetchValidatingPublicKeys(ctx)
if err != nil {
return errors.Wrap(err, "could not get validating public keys")
}
var pks [][]byte
for i := range pubKeys {
pks = append(pks, pubKeys[i][:])
}
req := &ethpb.MultipleValidatorStatusRequest{PublicKeys: pks}
resp, err := client.MultipleValidatorStatus(ctx, req)
if err != nil {
return errors.Wrap(err, "could not request validator indices")
}
fmt.Println(au.BrightGreen("Validator indices:").Bold())
for i, idx := range resp.Indices {
if idx != math.MaxUint64 {
fmt.Printf("%#x: %d\n", pubKeys[i][0:4], idx)
}
}
return nil
}