mirror of
https://gitlab.com/pulsechaincom/prysm-pulse.git
synced 2024-12-26 13:18:57 +00:00
60558b7970
* keymanagers no longer use cli ctx * rename important values to keymanageropts * further refactor accounts methods to reduce cli dependency * separating cli vs non cli methods for various accounts functions * recover wallet cli vs non-cli mode * ensure half of tests build * accounts v2 package now builds * full revamp wallet creation or opening wallets * everything builds * tests pass finally * Merge branch 'master' into no-cli-keymanagers * ensure commands work as expected * Merge branch 'no-cli-keymanagers' of github.com:prysmaticlabs/prysm into no-cli-keymanagers * further fix build * account creation comments * fix imports and comments * fix up failing test * fix build * Update derived.go * Update direct.go * Update remote.go * Fixed variable * fix up red tests * use Cli instead of CLI, fix tests, and address Radek's feedback * Merge refs/heads/master into no-cli-keymanagers * Merge refs/heads/master into no-cli-keymanagers * Merge refs/heads/master into no-cli-keymanagers * Merge refs/heads/master into no-cli-keymanagers * Merge refs/heads/master into no-cli-keymanagers * Merge refs/heads/master into no-cli-keymanagers * Merge refs/heads/master into no-cli-keymanagers * Merge refs/heads/master into no-cli-keymanagers
141 lines
4.7 KiB
Go
141 lines
4.7 KiB
Go
package direct
|
|
|
|
import (
|
|
"context"
|
|
"encoding/json"
|
|
"fmt"
|
|
"strings"
|
|
"testing"
|
|
|
|
"github.com/google/uuid"
|
|
"github.com/prysmaticlabs/prysm/shared/bls"
|
|
"github.com/prysmaticlabs/prysm/shared/testutil/assert"
|
|
"github.com/prysmaticlabs/prysm/shared/testutil/require"
|
|
mock "github.com/prysmaticlabs/prysm/validator/accounts/v2/testing"
|
|
v2keymanager "github.com/prysmaticlabs/prysm/validator/keymanager/v2"
|
|
keystorev4 "github.com/wealdtech/go-eth2-wallet-encryptor-keystorev4"
|
|
)
|
|
|
|
func createRandomKeystore(t testing.TB, password string) *v2keymanager.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 &v2keymanager.Keystore{
|
|
Crypto: cryptoFields,
|
|
Pubkey: fmt.Sprintf("%x", pubKey),
|
|
ID: id.String(),
|
|
Version: encryptor.Version(),
|
|
Name: encryptor.Name(),
|
|
}
|
|
}
|
|
|
|
func TestDirectKeymanager_CreateAccountsKeystore_NoDuplicates(t *testing.T) {
|
|
numKeys := 50
|
|
pubKeys := make([][]byte, numKeys)
|
|
privKeys := make([][]byte, numKeys)
|
|
for i := 0; i < numKeys; i++ {
|
|
priv := bls.RandKey()
|
|
privKeys[i] = priv.Marshal()
|
|
pubKeys[i] = priv.PublicKey().Marshal()
|
|
}
|
|
wallet := &mock.Wallet{
|
|
WalletPassword: "Passwordz0202$",
|
|
}
|
|
dr := &Keymanager{
|
|
wallet: wallet,
|
|
}
|
|
ctx := context.Background()
|
|
_, err := dr.createAccountsKeystore(ctx, privKeys, pubKeys)
|
|
require.NoError(t, err)
|
|
|
|
// We expect the 50 keys in the account store to match.
|
|
require.NotNil(t, dr.accountsStore)
|
|
require.Equal(t, len(dr.accountsStore.PublicKeys), len(dr.accountsStore.PrivateKeys))
|
|
require.Equal(t, len(dr.accountsStore.PublicKeys), numKeys)
|
|
for i := 0; i < len(dr.accountsStore.PrivateKeys); i++ {
|
|
assert.DeepEqual(t, dr.accountsStore.PrivateKeys[i], privKeys[i])
|
|
assert.DeepEqual(t, dr.accountsStore.PublicKeys[i], pubKeys[i])
|
|
}
|
|
|
|
// Re-run the create accounts keystore function with the same pubkeys.
|
|
_, err = dr.createAccountsKeystore(ctx, privKeys, pubKeys)
|
|
require.NoError(t, err)
|
|
|
|
// We expect nothing to change.
|
|
require.NotNil(t, dr.accountsStore)
|
|
require.Equal(t, len(dr.accountsStore.PublicKeys), len(dr.accountsStore.PrivateKeys))
|
|
require.Equal(t, len(dr.accountsStore.PublicKeys), numKeys)
|
|
for i := 0; i < len(dr.accountsStore.PrivateKeys); i++ {
|
|
assert.DeepEqual(t, dr.accountsStore.PrivateKeys[i], privKeys[i])
|
|
assert.DeepEqual(t, dr.accountsStore.PublicKeys[i], pubKeys[i])
|
|
}
|
|
|
|
// Now, we run the function again but with a new priv and pubkey and this
|
|
// time, we do expect a change.
|
|
privKey := bls.RandKey()
|
|
privKeys = append(privKeys, privKey.Marshal())
|
|
pubKeys = append(pubKeys, privKey.PublicKey().Marshal())
|
|
|
|
_, err = dr.createAccountsKeystore(ctx, privKeys, pubKeys)
|
|
require.NoError(t, err)
|
|
require.Equal(t, len(dr.accountsStore.PublicKeys), len(dr.accountsStore.PrivateKeys))
|
|
|
|
// We should have 1 more new key in the store.
|
|
require.Equal(t, numKeys+1, len(dr.accountsStore.PrivateKeys))
|
|
}
|
|
|
|
func TestDirectKeymanager_ImportKeystores(t *testing.T) {
|
|
password := "secretPassw0rd$1999"
|
|
// Setup the keymanager.
|
|
wallet := &mock.Wallet{
|
|
Files: make(map[string]map[string][]byte),
|
|
WalletPassword: password,
|
|
}
|
|
dr := &Keymanager{
|
|
wallet: wallet,
|
|
accountsStore: &AccountStore{},
|
|
}
|
|
|
|
// Create several keystores and attempt to import them.
|
|
numAccounts := 5
|
|
keystores := make([]*v2keymanager.Keystore, numAccounts)
|
|
for i := 0; i < numAccounts; i++ {
|
|
keystores[i] = createRandomKeystore(t, password)
|
|
}
|
|
ctx := context.Background()
|
|
require.NoError(t, dr.ImportKeystores(
|
|
ctx,
|
|
keystores,
|
|
password,
|
|
))
|
|
|
|
// Ensure the single, all-encompassing accounts keystore 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 := &v2keymanager.Keystore{}
|
|
require.NoError(t, json.Unmarshal(encodedKeystore, keystoreFile))
|
|
|
|
// We decrypt the crypto fields of the accounts 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))
|
|
|
|
// We should have successfully imported all accounts
|
|
// from external sources into a single AccountsStore
|
|
// struct preserved within a single keystore file.
|
|
assert.Equal(t, numAccounts, len(store.PublicKeys))
|
|
assert.Equal(t, numAccounts, len(store.PrivateKeys))
|
|
}
|