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

     1  package imported
     2  
     3  import (
     4  	"context"
     5  	"fmt"
     6  
     7  	"github.com/google/uuid"
     8  	"github.com/pkg/errors"
     9  	"github.com/prysmaticlabs/prysm/shared/bls"
    10  	"github.com/prysmaticlabs/prysm/shared/bytesutil"
    11  	"github.com/prysmaticlabs/prysm/validator/keymanager"
    12  	keystorev4 "github.com/wealdtech/go-eth2-wallet-encryptor-keystorev4"
    13  )
    14  
    15  // ExtractKeystores retrieves the secret keys for specified public keys
    16  // in the function input, encrypts them using the specified password,
    17  // and returns their respective EIP-2335 keystores.
    18  func (km *Keymanager) ExtractKeystores(
    19  	_ context.Context, publicKeys []bls.PublicKey, password string,
    20  ) ([]*keymanager.Keystore, error) {
    21  	lock.Lock()
    22  	defer lock.Unlock()
    23  	encryptor := keystorev4.New()
    24  	keystores := make([]*keymanager.Keystore, len(publicKeys))
    25  	for i, pk := range publicKeys {
    26  		pubKeyBytes := pk.Marshal()
    27  		secretKey, ok := secretKeysCache[bytesutil.ToBytes48(pubKeyBytes)]
    28  		if !ok {
    29  			return nil, fmt.Errorf(
    30  				"secret key for public key %#x not found in cache",
    31  				pubKeyBytes,
    32  			)
    33  		}
    34  		cryptoFields, err := encryptor.Encrypt(secretKey.Marshal(), password)
    35  		if err != nil {
    36  			return nil, errors.Wrapf(
    37  				err,
    38  				"could not encrypt secret key for public key %#x",
    39  				pubKeyBytes,
    40  			)
    41  		}
    42  		id, err := uuid.NewRandom()
    43  		if err != nil {
    44  			return nil, err
    45  		}
    46  		keystores[i] = &keymanager.Keystore{
    47  			Crypto:  cryptoFields,
    48  			ID:      id.String(),
    49  			Pubkey:  fmt.Sprintf("%x", pubKeyBytes),
    50  			Version: encryptor.Version(),
    51  			Name:    encryptor.Name(),
    52  		}
    53  	}
    54  	return keystores, nil
    55  }