mirror of
https://github.com/OffchainLabs/prysm.git
synced 2026-01-08 23:18:15 -05:00
HTTP Validator API: /eth/v1/keystores (#13113)
* WIP * fixing tests * fixing bazel * fixing api client * fixing tests * fixing more tests and bazel * fixing trace and more bazel issues * fixing router path function definitions * fixing more tests and deep source issues * adding delete test * if a route is provided, reregister before the catch all on the middleware. * fixing linting * fixing deepsource complaint * gaz * more deepsource issues * fixing missed err check * changing how routes are registered * radek reviews * Update validator/rpc/handlers_keymanager.go Co-authored-by: Sammy Rosso <15244892+saolyn@users.noreply.github.com> * Update validator/rpc/handlers_keymanager.go Co-authored-by: Sammy Rosso <15244892+saolyn@users.noreply.github.com> * fixing unit test after sammy's review * adding radek's comments --------- Co-authored-by: Sammy Rosso <15244892+saolyn@users.noreply.github.com>
This commit is contained in:
@@ -14,7 +14,6 @@ go_library(
|
||||
"//async/event:go_default_library",
|
||||
"//config/fieldparams:go_default_library",
|
||||
"//crypto/bls:go_default_library",
|
||||
"//proto/eth/service:go_default_library",
|
||||
"//proto/prysm/v1alpha1/validator-client:go_default_library",
|
||||
],
|
||||
)
|
||||
|
||||
@@ -19,7 +19,6 @@ go_library(
|
||||
"//crypto/bls:go_default_library",
|
||||
"//crypto/rand:go_default_library",
|
||||
"//io/prompt:go_default_library",
|
||||
"//proto/eth/service:go_default_library",
|
||||
"//proto/prysm/v1alpha1/validator-client:go_default_library",
|
||||
"//validator/accounts/iface:go_default_library",
|
||||
"//validator/keymanager:go_default_library",
|
||||
|
||||
@@ -9,7 +9,6 @@ import (
|
||||
"github.com/prysmaticlabs/prysm/v4/async/event"
|
||||
fieldparams "github.com/prysmaticlabs/prysm/v4/config/fieldparams"
|
||||
"github.com/prysmaticlabs/prysm/v4/crypto/bls"
|
||||
ethpbservice "github.com/prysmaticlabs/prysm/v4/proto/eth/service"
|
||||
validatorpb "github.com/prysmaticlabs/prysm/v4/proto/prysm/v1alpha1/validator-client"
|
||||
"github.com/prysmaticlabs/prysm/v4/validator/accounts/iface"
|
||||
"github.com/prysmaticlabs/prysm/v4/validator/keymanager"
|
||||
@@ -112,14 +111,14 @@ func (km *Keymanager) FetchValidatingPrivateKeys(ctx context.Context) ([][32]byt
|
||||
// ImportKeystores for a derived keymanager.
|
||||
func (km *Keymanager) ImportKeystores(
|
||||
ctx context.Context, keystores []*keymanager.Keystore, passwords []string,
|
||||
) ([]*ethpbservice.ImportedKeystoreStatus, error) {
|
||||
) ([]*keymanager.KeyStatus, error) {
|
||||
return km.localKM.ImportKeystores(ctx, keystores, passwords)
|
||||
}
|
||||
|
||||
// DeleteKeystores for a derived keymanager.
|
||||
func (km *Keymanager) DeleteKeystores(
|
||||
ctx context.Context, publicKeys [][]byte,
|
||||
) ([]*ethpbservice.DeletedKeystoreStatus, error) {
|
||||
) ([]*keymanager.KeyStatus, error) {
|
||||
return km.localKM.DeleteKeystores(ctx, publicKeys)
|
||||
}
|
||||
|
||||
|
||||
@@ -27,7 +27,6 @@ go_library(
|
||||
"//crypto/bls:go_default_library",
|
||||
"//encoding/bytesutil:go_default_library",
|
||||
"//io/file:go_default_library",
|
||||
"//proto/eth/service:go_default_library",
|
||||
"//proto/prysm/v1alpha1/validator-client:go_default_library",
|
||||
"//runtime/interop:go_default_library",
|
||||
"//validator/accounts/iface:go_default_library",
|
||||
@@ -60,7 +59,6 @@ go_test(
|
||||
"//config/fieldparams:go_default_library",
|
||||
"//crypto/bls:go_default_library",
|
||||
"//encoding/bytesutil:go_default_library",
|
||||
"//proto/eth/service:go_default_library",
|
||||
"//proto/prysm/v1alpha1/validator-client:go_default_library",
|
||||
"//testing/assert:go_default_library",
|
||||
"//testing/require:go_default_library",
|
||||
|
||||
@@ -6,7 +6,7 @@ import (
|
||||
|
||||
fieldparams "github.com/prysmaticlabs/prysm/v4/config/fieldparams"
|
||||
"github.com/prysmaticlabs/prysm/v4/encoding/bytesutil"
|
||||
ethpbservice "github.com/prysmaticlabs/prysm/v4/proto/eth/service"
|
||||
"github.com/prysmaticlabs/prysm/v4/validator/keymanager"
|
||||
"github.com/sirupsen/logrus"
|
||||
)
|
||||
|
||||
@@ -20,18 +20,18 @@ import (
|
||||
// 5) Return API response
|
||||
func (km *Keymanager) DeleteKeystores(
|
||||
ctx context.Context, publicKeys [][]byte,
|
||||
) ([]*ethpbservice.DeletedKeystoreStatus, error) {
|
||||
) ([]*keymanager.KeyStatus, error) {
|
||||
// Check for duplicate keys and filter them out.
|
||||
trackedPublicKeys := make(map[[fieldparams.BLSPubkeyLength]byte]bool)
|
||||
statuses := make([]*ethpbservice.DeletedKeystoreStatus, 0, len(publicKeys))
|
||||
statuses := make([]*keymanager.KeyStatus, 0, len(publicKeys))
|
||||
deletedKeys := make([][]byte, 0, len(publicKeys))
|
||||
// 1) Copy the in memory keystore
|
||||
storeCopy := km.accountsStore.Copy()
|
||||
for _, publicKey := range publicKeys {
|
||||
// Check if the key in the request is a duplicate or not found
|
||||
if _, ok := trackedPublicKeys[bytesutil.ToBytes48(publicKey)]; ok {
|
||||
statuses = append(statuses, ðpbservice.DeletedKeystoreStatus{
|
||||
Status: ethpbservice.DeletedKeystoreStatus_NOT_ACTIVE,
|
||||
statuses = append(statuses, &keymanager.KeyStatus{
|
||||
Status: keymanager.StatusNotActive,
|
||||
})
|
||||
continue
|
||||
}
|
||||
@@ -45,8 +45,8 @@ func (km *Keymanager) DeleteKeystores(
|
||||
}
|
||||
}
|
||||
if !found {
|
||||
statuses = append(statuses, ðpbservice.DeletedKeystoreStatus{
|
||||
Status: ethpbservice.DeletedKeystoreStatus_NOT_FOUND,
|
||||
statuses = append(statuses, &keymanager.KeyStatus{
|
||||
Status: keymanager.StatusNotFound,
|
||||
})
|
||||
continue
|
||||
}
|
||||
@@ -55,8 +55,8 @@ func (km *Keymanager) DeleteKeystores(
|
||||
deletedKeys = append(deletedKeys, deletedPublicKey)
|
||||
storeCopy.PrivateKeys = append(storeCopy.PrivateKeys[:index], storeCopy.PrivateKeys[index+1:]...)
|
||||
storeCopy.PublicKeys = append(storeCopy.PublicKeys[:index], storeCopy.PublicKeys[index+1:]...)
|
||||
statuses = append(statuses, ðpbservice.DeletedKeystoreStatus{
|
||||
Status: ethpbservice.DeletedKeystoreStatus_DELETED,
|
||||
statuses = append(statuses, &keymanager.KeyStatus{
|
||||
Status: keymanager.StatusDeleted,
|
||||
})
|
||||
trackedPublicKeys[bytesutil.ToBytes48(publicKey)] = true
|
||||
}
|
||||
|
||||
@@ -9,7 +9,6 @@ import (
|
||||
|
||||
fieldparams "github.com/prysmaticlabs/prysm/v4/config/fieldparams"
|
||||
"github.com/prysmaticlabs/prysm/v4/encoding/bytesutil"
|
||||
ethpbservice "github.com/prysmaticlabs/prysm/v4/proto/eth/service"
|
||||
"github.com/prysmaticlabs/prysm/v4/testing/require"
|
||||
mock "github.com/prysmaticlabs/prysm/v4/validator/accounts/testing"
|
||||
"github.com/prysmaticlabs/prysm/v4/validator/keymanager"
|
||||
@@ -47,8 +46,8 @@ func TestLocalKeymanager_DeleteKeystores(t *testing.T) {
|
||||
statuses, err := dr.DeleteKeystores(ctx, [][]byte{notFoundPubKey[:], notFoundPubKey2[:]})
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, 2, len(statuses))
|
||||
require.Equal(t, ethpbservice.DeletedKeystoreStatus_NOT_FOUND, statuses[0].Status)
|
||||
require.Equal(t, ethpbservice.DeletedKeystoreStatus_NOT_FOUND, statuses[1].Status)
|
||||
require.Equal(t, keymanager.StatusNotFound, statuses[0].Status)
|
||||
require.Equal(t, keymanager.StatusNotFound, statuses[1].Status)
|
||||
})
|
||||
t.Run("file write errors should not lead to updated local keystore or cache", func(t *testing.T) {
|
||||
wallet.HasWriteFileError = true
|
||||
@@ -68,7 +67,7 @@ func TestLocalKeymanager_DeleteKeystores(t *testing.T) {
|
||||
require.NoError(t, err)
|
||||
|
||||
require.Equal(t, 1, len(statuses))
|
||||
require.Equal(t, ethpbservice.DeletedKeystoreStatus_DELETED, statuses[0].Status)
|
||||
require.Equal(t, keymanager.StatusDeleted, statuses[0].Status)
|
||||
|
||||
// Ensure the keystore file was written to the wallet
|
||||
// and ensure we can decrypt it using the EIP-2335 standard.
|
||||
@@ -109,9 +108,9 @@ func TestLocalKeymanager_DeleteKeystores(t *testing.T) {
|
||||
require.Equal(t, 4, len(statuses))
|
||||
for i, st := range statuses {
|
||||
if i == 0 {
|
||||
require.Equal(t, ethpbservice.DeletedKeystoreStatus_DELETED, st.Status)
|
||||
require.Equal(t, keymanager.StatusDeleted, st.Status)
|
||||
} else {
|
||||
require.Equal(t, ethpbservice.DeletedKeystoreStatus_NOT_ACTIVE, st.Status)
|
||||
require.Equal(t, keymanager.StatusNotActive, st.Status)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -9,7 +9,6 @@ import (
|
||||
"github.com/k0kubun/go-ansi"
|
||||
"github.com/pkg/errors"
|
||||
"github.com/prysmaticlabs/prysm/v4/crypto/bls"
|
||||
ethpbservice "github.com/prysmaticlabs/prysm/v4/proto/eth/service"
|
||||
"github.com/prysmaticlabs/prysm/v4/validator/keymanager"
|
||||
"github.com/schollz/progressbar/v3"
|
||||
"github.com/sirupsen/logrus"
|
||||
@@ -26,7 +25,7 @@ func (km *Keymanager) ImportKeystores(
|
||||
ctx context.Context,
|
||||
keystores []*keymanager.Keystore,
|
||||
passwords []string,
|
||||
) ([]*ethpbservice.ImportedKeystoreStatus, error) {
|
||||
) ([]*keymanager.KeyStatus, error) {
|
||||
if len(passwords) == 0 {
|
||||
return nil, ErrNoPasswords
|
||||
}
|
||||
@@ -36,7 +35,7 @@ func (km *Keymanager) ImportKeystores(
|
||||
decryptor := keystorev4.New()
|
||||
bar := initializeProgressBar(len(keystores), "Importing accounts...")
|
||||
keys := map[string]string{}
|
||||
statuses := make([]*ethpbservice.ImportedKeystoreStatus, len(keystores))
|
||||
statuses := make([]*keymanager.KeyStatus, len(keystores))
|
||||
var err error
|
||||
// 1) Copy the in memory keystore
|
||||
storeCopy := km.accountsStore.Copy()
|
||||
@@ -50,8 +49,8 @@ func (km *Keymanager) ImportKeystores(
|
||||
var pubKeyBytes []byte
|
||||
privKeyBytes, pubKeyBytes, _, err = km.attemptDecryptKeystore(decryptor, keystores[i], passwords[i])
|
||||
if err != nil {
|
||||
statuses[i] = ðpbservice.ImportedKeystoreStatus{
|
||||
Status: ethpbservice.ImportedKeystoreStatus_ERROR,
|
||||
statuses[i] = &keymanager.KeyStatus{
|
||||
Status: keymanager.StatusError,
|
||||
Message: err.Error(),
|
||||
}
|
||||
continue
|
||||
@@ -64,16 +63,16 @@ func (km *Keymanager) ImportKeystores(
|
||||
_, isDuplicateInExisting := existingPubKeys[string(pubKeyBytes)]
|
||||
if isDuplicateInArray || isDuplicateInExisting {
|
||||
log.Warnf("Duplicate key in import will be ignored: %#x", pubKeyBytes)
|
||||
statuses[i] = ðpbservice.ImportedKeystoreStatus{
|
||||
Status: ethpbservice.ImportedKeystoreStatus_DUPLICATE,
|
||||
statuses[i] = &keymanager.KeyStatus{
|
||||
Status: keymanager.StatusDuplicate,
|
||||
}
|
||||
continue
|
||||
}
|
||||
|
||||
keys[string(pubKeyBytes)] = string(privKeyBytes)
|
||||
importedKeys = append(importedKeys, pubKeyBytes)
|
||||
statuses[i] = ðpbservice.ImportedKeystoreStatus{
|
||||
Status: ethpbservice.ImportedKeystoreStatus_IMPORTED,
|
||||
statuses[i] = &keymanager.KeyStatus{
|
||||
Status: keymanager.StatusImported,
|
||||
}
|
||||
}
|
||||
if len(importedKeys) == 0 {
|
||||
@@ -86,7 +85,7 @@ func (km *Keymanager) ImportKeystores(
|
||||
storeCopy.PublicKeys = append(storeCopy.PublicKeys, []byte(pubKey))
|
||||
storeCopy.PrivateKeys = append(storeCopy.PrivateKeys, []byte(privKey))
|
||||
}
|
||||
//3 & 4) save to disk and re-initializes keystore
|
||||
// 3) & 4) save to disk and re-initializes keystore
|
||||
if err := km.SaveStoreAndReInitialize(ctx, storeCopy); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -112,10 +111,11 @@ func (km *Keymanager) ImportKeypairs(ctx context.Context, privKeys, pubKeys [][]
|
||||
// 2) Update store and remove duplicates
|
||||
updateAccountsStoreKeys(storeCopy, privKeys, pubKeys)
|
||||
|
||||
// 3 & 4) save to disk and re-initializes keystore
|
||||
// 3) & 4) save to disk and re-initializes keystore
|
||||
if err := km.SaveStoreAndReInitialize(ctx, storeCopy); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// 5) verify if store was not updated
|
||||
if len(km.accountsStore.PublicKeys) < len(storeCopy.PublicKeys) {
|
||||
return fmt.Errorf("keys were not imported successfully, expected %d got %d", len(storeCopy.PublicKeys), len(km.accountsStore.PublicKeys))
|
||||
@@ -126,7 +126,7 @@ func (km *Keymanager) ImportKeypairs(ctx context.Context, privKeys, pubKeys [][]
|
||||
// Retrieves the private key and public key from an EIP-2335 keystore file
|
||||
// by decrypting using a specified password. If the password fails,
|
||||
// it prompts the user for the correct password until it confirms.
|
||||
func (_ *Keymanager) attemptDecryptKeystore(
|
||||
func (*Keymanager) attemptDecryptKeystore(
|
||||
enc *keystorev4.Encryptor, keystore *keymanager.Keystore, password string,
|
||||
) ([]byte, []byte, string, error) {
|
||||
// Attempt to decrypt the keystore with the specifies password.
|
||||
|
||||
@@ -10,7 +10,6 @@ import (
|
||||
"github.com/google/uuid"
|
||||
"github.com/prysmaticlabs/prysm/v4/crypto/bls"
|
||||
"github.com/prysmaticlabs/prysm/v4/encoding/bytesutil"
|
||||
ethpbservice "github.com/prysmaticlabs/prysm/v4/proto/eth/service"
|
||||
"github.com/prysmaticlabs/prysm/v4/testing/assert"
|
||||
"github.com/prysmaticlabs/prysm/v4/testing/require"
|
||||
mock "github.com/prysmaticlabs/prysm/v4/validator/accounts/testing"
|
||||
@@ -125,7 +124,7 @@ func TestLocalKeymanager_ImportKeystores(t *testing.T) {
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, numKeystores, len(statuses))
|
||||
for _, status := range statuses {
|
||||
require.Equal(t, ethpbservice.ImportedKeystoreStatus_IMPORTED, status.Status)
|
||||
require.Equal(t, keymanager.StatusImported, status.Status)
|
||||
}
|
||||
require.LogsContain(t, hook, "Successfully imported validator key(s)")
|
||||
})
|
||||
@@ -146,7 +145,7 @@ func TestLocalKeymanager_ImportKeystores(t *testing.T) {
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, numKeystores, len(statuses))
|
||||
for _, status := range statuses {
|
||||
require.Equal(t, ethpbservice.ImportedKeystoreStatus_IMPORTED, status.Status)
|
||||
require.Equal(t, keymanager.StatusImported, status.Status)
|
||||
}
|
||||
require.LogsContain(t, hook, "Successfully imported validator key(s)")
|
||||
})
|
||||
@@ -177,17 +176,17 @@ func TestLocalKeymanager_ImportKeystores(t *testing.T) {
|
||||
require.Equal(t, len(keystores), len(statuses))
|
||||
require.Equal(
|
||||
t,
|
||||
ethpbservice.ImportedKeystoreStatus_IMPORTED,
|
||||
keymanager.StatusImported,
|
||||
statuses[0].Status,
|
||||
)
|
||||
require.Equal(
|
||||
t,
|
||||
ethpbservice.ImportedKeystoreStatus_DUPLICATE,
|
||||
keymanager.StatusDuplicate,
|
||||
statuses[1].Status,
|
||||
)
|
||||
require.Equal(
|
||||
t,
|
||||
ethpbservice.ImportedKeystoreStatus_ERROR,
|
||||
keymanager.StatusError,
|
||||
statuses[2].Status,
|
||||
)
|
||||
require.Equal(
|
||||
@@ -232,12 +231,12 @@ func TestLocalKeymanager_ImportKeystores(t *testing.T) {
|
||||
require.Equal(t, len(keystores), len(statuses))
|
||||
require.Equal(
|
||||
t,
|
||||
ethpbservice.ImportedKeystoreStatus_DUPLICATE,
|
||||
keymanager.StatusDuplicate,
|
||||
statuses[0].Status,
|
||||
)
|
||||
require.Equal(
|
||||
t,
|
||||
ethpbservice.ImportedKeystoreStatus_ERROR,
|
||||
keymanager.StatusError,
|
||||
statuses[1].Status,
|
||||
)
|
||||
require.Equal(
|
||||
|
||||
@@ -16,7 +16,6 @@ go_library(
|
||||
"//config/fieldparams:go_default_library",
|
||||
"//crypto/bls:go_default_library",
|
||||
"//encoding/bytesutil:go_default_library",
|
||||
"//proto/eth/service:go_default_library",
|
||||
"//proto/prysm/v1alpha1/validator-client:go_default_library",
|
||||
"//validator/accounts/petnames:go_default_library",
|
||||
"//validator/keymanager:go_default_library",
|
||||
@@ -41,6 +40,7 @@ go_test(
|
||||
"//encoding/bytesutil:go_default_library",
|
||||
"//proto/prysm/v1alpha1/validator-client:go_default_library",
|
||||
"//testing/require:go_default_library",
|
||||
"//validator/keymanager:go_default_library",
|
||||
"//validator/keymanager/remote-web3signer/internal:go_default_library",
|
||||
"//validator/keymanager/remote-web3signer/v1/mock:go_default_library",
|
||||
"@com_github_ethereum_go_ethereum//common/hexutil:go_default_library",
|
||||
|
||||
@@ -15,7 +15,6 @@ import (
|
||||
fieldparams "github.com/prysmaticlabs/prysm/v4/config/fieldparams"
|
||||
"github.com/prysmaticlabs/prysm/v4/crypto/bls"
|
||||
"github.com/prysmaticlabs/prysm/v4/encoding/bytesutil"
|
||||
ethpbservice "github.com/prysmaticlabs/prysm/v4/proto/eth/service"
|
||||
validatorpb "github.com/prysmaticlabs/prysm/v4/proto/prysm/v1alpha1/validator-client"
|
||||
"github.com/prysmaticlabs/prysm/v4/validator/accounts/petnames"
|
||||
"github.com/prysmaticlabs/prysm/v4/validator/keymanager"
|
||||
@@ -24,15 +23,6 @@ import (
|
||||
log "github.com/sirupsen/logrus"
|
||||
)
|
||||
|
||||
const (
|
||||
StatusImported = "IMPORTED"
|
||||
StatusError = "ERROR"
|
||||
StatusDuplicate = "DUPLICATE"
|
||||
StatusUnknown = "UNKNOWN"
|
||||
StatusNotFound = "NOT_FOUND"
|
||||
StatusDeleted = "DELETED"
|
||||
)
|
||||
|
||||
// SetupConfig includes configuration values for initializing.
|
||||
// a keymanager, such as passwords, the wallet, and more.
|
||||
// Web3Signer contains one public keys option. Either through a URL or a static key list.
|
||||
@@ -412,7 +402,7 @@ func (*Keymanager) ExtractKeystores(
|
||||
}
|
||||
|
||||
// DeleteKeystores is not supported for the remote-web3signer keymanager type.
|
||||
func (km *Keymanager) DeleteKeystores(context.Context, [][]byte) ([]*ethpbservice.DeletedKeystoreStatus, error) {
|
||||
func (km *Keymanager) DeleteKeystores(context.Context, [][]byte) ([]*keymanager.KeyStatus, error) {
|
||||
return nil, errors.New("Wrong wallet type: web3-signer. Only Imported or Derived wallets can delete accounts")
|
||||
}
|
||||
|
||||
@@ -465,14 +455,14 @@ func (km *Keymanager) AddPublicKeys(pubKeys []string) []*keymanager.KeyStatus {
|
||||
pubkeyBytes, err := hexutil.Decode(pubkey)
|
||||
if err != nil {
|
||||
importedRemoteKeysStatuses[i] = &keymanager.KeyStatus{
|
||||
Status: StatusError,
|
||||
Status: keymanager.StatusError,
|
||||
Message: err.Error(),
|
||||
}
|
||||
continue
|
||||
}
|
||||
if len(pubkeyBytes) != fieldparams.BLSPubkeyLength {
|
||||
importedRemoteKeysStatuses[i] = &keymanager.KeyStatus{
|
||||
Status: StatusError,
|
||||
Status: keymanager.StatusError,
|
||||
Message: fmt.Sprintf("pubkey byte length (%d) did not match bls pubkey byte length (%d)", len(pubkeyBytes), fieldparams.BLSPubkeyLength),
|
||||
}
|
||||
continue
|
||||
@@ -485,14 +475,14 @@ func (km *Keymanager) AddPublicKeys(pubKeys []string) []*keymanager.KeyStatus {
|
||||
}
|
||||
if found {
|
||||
importedRemoteKeysStatuses[i] = &keymanager.KeyStatus{
|
||||
Status: StatusDuplicate,
|
||||
Status: keymanager.StatusDuplicate,
|
||||
Message: fmt.Sprintf("Duplicate pubkey: %v, already in use", pubkey),
|
||||
}
|
||||
continue
|
||||
}
|
||||
km.providedPublicKeys = append(km.providedPublicKeys, bytesutil.ToBytes48(pubkeyBytes))
|
||||
importedRemoteKeysStatuses[i] = &keymanager.KeyStatus{
|
||||
Status: StatusImported,
|
||||
Status: keymanager.StatusImported,
|
||||
Message: fmt.Sprintf("Successfully added pubkey: %v", pubkey),
|
||||
}
|
||||
log.Debug("Added pubkey to keymanager for web3signer", "pubkey", pubkey)
|
||||
@@ -507,7 +497,7 @@ func (km *Keymanager) DeletePublicKeys(pubKeys []string) []*keymanager.KeyStatus
|
||||
if len(km.providedPublicKeys) == 0 {
|
||||
for i := range deletedRemoteKeysStatuses {
|
||||
deletedRemoteKeysStatuses[i] = &keymanager.KeyStatus{
|
||||
Status: StatusNotFound,
|
||||
Status: keymanager.StatusNotFound,
|
||||
Message: "No pubkeys are set in validator",
|
||||
}
|
||||
}
|
||||
@@ -518,14 +508,14 @@ func (km *Keymanager) DeletePublicKeys(pubKeys []string) []*keymanager.KeyStatus
|
||||
pubkeyBytes, err := hexutil.Decode(pubkey)
|
||||
if err != nil {
|
||||
deletedRemoteKeysStatuses[i] = &keymanager.KeyStatus{
|
||||
Status: StatusError,
|
||||
Status: keymanager.StatusError,
|
||||
Message: err.Error(),
|
||||
}
|
||||
continue
|
||||
}
|
||||
if len(pubkeyBytes) != fieldparams.BLSPubkeyLength {
|
||||
deletedRemoteKeysStatuses[i] = &keymanager.KeyStatus{
|
||||
Status: StatusError,
|
||||
Status: keymanager.StatusError,
|
||||
Message: fmt.Sprintf("pubkey byte length (%d) did not match bls pubkey byte length (%d)", len(pubkeyBytes), fieldparams.BLSPubkeyLength),
|
||||
}
|
||||
continue
|
||||
@@ -533,7 +523,7 @@ func (km *Keymanager) DeletePublicKeys(pubKeys []string) []*keymanager.KeyStatus
|
||||
if bytes.Equal(key[:], pubkeyBytes) {
|
||||
km.providedPublicKeys = append(km.providedPublicKeys[:in], km.providedPublicKeys[in+1:]...)
|
||||
deletedRemoteKeysStatuses[i] = &keymanager.KeyStatus{
|
||||
Status: StatusDeleted,
|
||||
Status: keymanager.StatusDeleted,
|
||||
Message: fmt.Sprintf("Successfully deleted pubkey: %v", pubkey),
|
||||
}
|
||||
log.Debug("Deleted pubkey from keymanager for web3signer", "pubkey", pubkey)
|
||||
@@ -542,7 +532,7 @@ func (km *Keymanager) DeletePublicKeys(pubKeys []string) []*keymanager.KeyStatus
|
||||
}
|
||||
if deletedRemoteKeysStatuses[i] == nil {
|
||||
deletedRemoteKeysStatuses[i] = &keymanager.KeyStatus{
|
||||
Status: StatusNotFound,
|
||||
Status: keymanager.StatusNotFound,
|
||||
Message: fmt.Sprintf("Pubkey: %v not found", pubkey),
|
||||
}
|
||||
}
|
||||
|
||||
@@ -12,6 +12,7 @@ import (
|
||||
"github.com/prysmaticlabs/prysm/v4/encoding/bytesutil"
|
||||
validatorpb "github.com/prysmaticlabs/prysm/v4/proto/prysm/v1alpha1/validator-client"
|
||||
"github.com/prysmaticlabs/prysm/v4/testing/require"
|
||||
"github.com/prysmaticlabs/prysm/v4/validator/keymanager"
|
||||
"github.com/prysmaticlabs/prysm/v4/validator/keymanager/remote-web3signer/internal"
|
||||
"github.com/prysmaticlabs/prysm/v4/validator/keymanager/remote-web3signer/v1/mock"
|
||||
"github.com/stretchr/testify/assert"
|
||||
@@ -300,11 +301,11 @@ func TestKeymanager_AddPublicKeys(t *testing.T) {
|
||||
publicKeys := []string{"0xa2b5aaad9c6efefe7bb9b1243a043404f3362937cfb6b31833929833173f476630ea2cfeb0d9ddf15f97ca8685948820"}
|
||||
statuses := km.AddPublicKeys(publicKeys)
|
||||
for _, status := range statuses {
|
||||
require.Equal(t, StatusImported, status.Status)
|
||||
require.Equal(t, keymanager.StatusImported, status.Status)
|
||||
}
|
||||
statuses = km.AddPublicKeys(publicKeys)
|
||||
for _, status := range statuses {
|
||||
require.Equal(t, StatusDuplicate, status.Status)
|
||||
require.Equal(t, keymanager.StatusDuplicate, status.Status)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -325,16 +326,16 @@ func TestKeymanager_DeletePublicKeys(t *testing.T) {
|
||||
publicKeys := []string{"0xa2b5aaad9c6efefe7bb9b1243a043404f3362937cfb6b31833929833173f476630ea2cfeb0d9ddf15f97ca8685948820"}
|
||||
statuses := km.AddPublicKeys(publicKeys)
|
||||
for _, status := range statuses {
|
||||
require.Equal(t, StatusImported, status.Status)
|
||||
require.Equal(t, keymanager.StatusImported, status.Status)
|
||||
}
|
||||
|
||||
s := km.DeletePublicKeys(publicKeys)
|
||||
for _, status := range s {
|
||||
require.Equal(t, StatusDeleted, status.Status)
|
||||
require.Equal(t, keymanager.StatusDeleted, status.Status)
|
||||
}
|
||||
|
||||
s = km.DeletePublicKeys(publicKeys)
|
||||
for _, status := range s {
|
||||
require.Equal(t, StatusNotFound, status.Status)
|
||||
require.Equal(t, keymanager.StatusNotFound, status.Status)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -8,7 +8,6 @@ import (
|
||||
"github.com/prysmaticlabs/prysm/v4/async/event"
|
||||
fieldparams "github.com/prysmaticlabs/prysm/v4/config/fieldparams"
|
||||
"github.com/prysmaticlabs/prysm/v4/crypto/bls"
|
||||
ethpbservice "github.com/prysmaticlabs/prysm/v4/proto/eth/service"
|
||||
validatorpb "github.com/prysmaticlabs/prysm/v4/proto/prysm/v1alpha1/validator-client"
|
||||
)
|
||||
|
||||
@@ -42,12 +41,12 @@ type Signer interface {
|
||||
type Importer interface {
|
||||
ImportKeystores(
|
||||
ctx context.Context, keystores []*Keystore, passwords []string,
|
||||
) ([]*ethpbservice.ImportedKeystoreStatus, error)
|
||||
) ([]*KeyStatus, error)
|
||||
}
|
||||
|
||||
// Deleter can delete keystores from the keymanager.
|
||||
type Deleter interface {
|
||||
DeleteKeystores(ctx context.Context, publicKeys [][]byte) ([]*ethpbservice.DeletedKeystoreStatus, error)
|
||||
DeleteKeystores(ctx context.Context, publicKeys [][]byte) ([]*KeyStatus, error)
|
||||
}
|
||||
|
||||
// KeyChangeSubscriber allows subscribing to changes made to the underlying keys.
|
||||
@@ -67,10 +66,23 @@ type PublicKeyAdder interface {
|
||||
|
||||
// KeyStatus is a json representation of the status fields for the keymanager apis
|
||||
type KeyStatus struct {
|
||||
Status string `json:"status"`
|
||||
Message string `json:"message"`
|
||||
Status KeyStatusType `json:"status"`
|
||||
Message string `json:"message"`
|
||||
}
|
||||
|
||||
// KeyStatusType is a category of key status
|
||||
type KeyStatusType string
|
||||
|
||||
const (
|
||||
StatusImported KeyStatusType = "IMPORTED"
|
||||
StatusError KeyStatusType = "ERROR"
|
||||
StatusDuplicate KeyStatusType = "DUPLICATE"
|
||||
StatusUnknown KeyStatusType = "UNKNOWN"
|
||||
StatusNotFound KeyStatusType = "NOT_FOUND"
|
||||
StatusDeleted KeyStatusType = "DELETED"
|
||||
StatusNotActive KeyStatusType = "NOT_ACTIVE"
|
||||
)
|
||||
|
||||
// PublicKeyDeleter allows deleting public keys set in keymanager.
|
||||
type PublicKeyDeleter interface {
|
||||
DeletePublicKeys(publicKeys []string) []*KeyStatus
|
||||
|
||||
Reference in New Issue
Block a user