github.com/prysmaticlabs/prysm@v1.4.4/validator/keymanager/imported/refresh_test.go (about)

     1  package imported
     2  
     3  import (
     4  	"context"
     5  	"encoding/json"
     6  	"testing"
     7  
     8  	"github.com/google/uuid"
     9  	"github.com/prysmaticlabs/prysm/shared/bls"
    10  	"github.com/prysmaticlabs/prysm/shared/bytesutil"
    11  	"github.com/prysmaticlabs/prysm/shared/event"
    12  	"github.com/prysmaticlabs/prysm/shared/testutil/assert"
    13  	"github.com/prysmaticlabs/prysm/shared/testutil/require"
    14  	mock "github.com/prysmaticlabs/prysm/validator/accounts/testing"
    15  	keystorev4 "github.com/wealdtech/go-eth2-wallet-encryptor-keystorev4"
    16  )
    17  
    18  func TestImportedKeymanager_reloadAccountsFromKeystore_MismatchedNumKeys(t *testing.T) {
    19  	password := "Passw03rdz293**%#2"
    20  	wallet := &mock.Wallet{
    21  		Files:            make(map[string]map[string][]byte),
    22  		AccountPasswords: make(map[string]string),
    23  		WalletPassword:   password,
    24  	}
    25  	dr := &Keymanager{
    26  		wallet: wallet,
    27  	}
    28  	accountsStore := &accountStore{
    29  		PrivateKeys: [][]byte{[]byte("hello")},
    30  		PublicKeys:  [][]byte{[]byte("hi"), []byte("world")},
    31  	}
    32  	encodedStore, err := json.MarshalIndent(accountsStore, "", "\t")
    33  	require.NoError(t, err)
    34  	encryptor := keystorev4.New()
    35  	cryptoFields, err := encryptor.Encrypt(encodedStore, dr.wallet.Password())
    36  	require.NoError(t, err)
    37  	id, err := uuid.NewRandom()
    38  	require.NoError(t, err)
    39  	keystore := &AccountsKeystoreRepresentation{
    40  		Crypto:  cryptoFields,
    41  		ID:      id.String(),
    42  		Version: encryptor.Version(),
    43  		Name:    encryptor.Name(),
    44  	}
    45  	err = dr.reloadAccountsFromKeystore(keystore)
    46  	assert.ErrorContains(t, "do not match", err)
    47  }
    48  
    49  func TestImportedKeymanager_reloadAccountsFromKeystore(t *testing.T) {
    50  	password := "Passw03rdz293**%#2"
    51  	wallet := &mock.Wallet{
    52  		Files:            make(map[string]map[string][]byte),
    53  		AccountPasswords: make(map[string]string),
    54  		WalletPassword:   password,
    55  	}
    56  	dr := &Keymanager{
    57  		wallet:              wallet,
    58  		accountsChangedFeed: new(event.Feed),
    59  	}
    60  
    61  	numAccounts := 20
    62  	privKeys := make([][]byte, numAccounts)
    63  	pubKeys := make([][]byte, numAccounts)
    64  	for i := 0; i < numAccounts; i++ {
    65  		privKey, err := bls.RandKey()
    66  		require.NoError(t, err)
    67  		privKeys[i] = privKey.Marshal()
    68  		pubKeys[i] = privKey.PublicKey().Marshal()
    69  	}
    70  
    71  	accountsStore, err := dr.CreateAccountsKeystore(context.Background(), privKeys, pubKeys)
    72  	require.NoError(t, err)
    73  	require.NoError(t, dr.reloadAccountsFromKeystore(accountsStore))
    74  
    75  	// Check that the public keys were added to the public keys cache.
    76  	for i, keyBytes := range pubKeys {
    77  		require.Equal(t, bytesutil.ToBytes48(keyBytes), orderedPublicKeys[i])
    78  	}
    79  
    80  	// Check that the secret keys were added to the secret keys cache.
    81  	lock.RLock()
    82  	defer lock.RUnlock()
    83  	for i, keyBytes := range privKeys {
    84  		privKey, ok := secretKeysCache[bytesutil.ToBytes48(pubKeys[i])]
    85  		require.Equal(t, true, ok)
    86  		require.Equal(t, bytesutil.ToBytes48(keyBytes), bytesutil.ToBytes48(privKey.Marshal()))
    87  	}
    88  
    89  	// Check the key was added to the global accounts store.
    90  	require.Equal(t, numAccounts, len(dr.accountsStore.PublicKeys))
    91  	require.Equal(t, numAccounts, len(dr.accountsStore.PrivateKeys))
    92  	assert.DeepEqual(t, dr.accountsStore.PublicKeys[0], pubKeys[0])
    93  }