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 }