github.com/prysmaticlabs/prysm@v1.4.4/validator/keymanager/derived/eip_test.go (about)

     1  package derived
     2  
     3  import (
     4  	"encoding/hex"
     5  	"fmt"
     6  	"testing"
     7  
     8  	"github.com/prysmaticlabs/prysm/shared/bls"
     9  	"github.com/prysmaticlabs/prysm/shared/testutil/assert"
    10  	"github.com/prysmaticlabs/prysm/shared/testutil/require"
    11  	util "github.com/wealdtech/go-eth2-util"
    12  )
    13  
    14  func TestDerivationFromMnemonic(t *testing.T) {
    15  	mnemonic := "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about"
    16  	passphrase := "TREZOR"
    17  	seed := "c55257c360c07c72029aebc1b53c05ed0362ada38ead3e3e9efa3708e53495531f09a6987599d18264c1e1c92f2cf141630c7a3c4ab7c81b2f001698e7463b04"
    18  	masterSK := "6083874454709270928345386274498605044986640685124978867557563392430687146096"
    19  	childIndex := 0
    20  	childSK := "20397789859736650942317412262472558107875392172444076792671091975210932703118"
    21  	seedBytes, err := hex.DecodeString(seed)
    22  	require.NoError(t, err)
    23  	derivedSeed, err := seedFromMnemonic(mnemonic, passphrase)
    24  	require.NoError(t, err)
    25  	assert.DeepEqual(t, seedBytes, derivedSeed)
    26  
    27  	// We derive keys, then check the master SK and the child SK.
    28  	withdrawalKey, err := util.PrivateKeyFromSeedAndPath(seedBytes, "m")
    29  	require.NoError(t, err)
    30  	validatingKey, err := util.PrivateKeyFromSeedAndPath(seedBytes, fmt.Sprintf("m/%d", childIndex))
    31  	require.NoError(t, err)
    32  
    33  	expectedMasterSK, err := bls.SecretKeyFromBigNum(masterSK)
    34  	require.NoError(t, err)
    35  	expectedChildSK, err := bls.SecretKeyFromBigNum(childSK)
    36  	require.NoError(t, err)
    37  	assert.DeepEqual(t, expectedMasterSK.Marshal(), withdrawalKey.Marshal())
    38  	assert.DeepEqual(t, expectedChildSK.Marshal(), validatingKey.Marshal())
    39  }
    40  
    41  func TestDerivationFromSeed(t *testing.T) {
    42  	type fields struct {
    43  		seed       string
    44  		childIndex int
    45  	}
    46  	type want struct {
    47  		masterSK string
    48  		childSK  string
    49  	}
    50  	tests := []struct {
    51  		name   string
    52  		fields fields
    53  		want   want
    54  	}{
    55  		{
    56  			name: "Case 1",
    57  			fields: fields{
    58  				seed:       "3141592653589793238462643383279502884197169399375105820974944592",
    59  				childIndex: 3141592653,
    60  			},
    61  			want: want{
    62  				masterSK: "29757020647961307431480504535336562678282505419141012933316116377660817309383",
    63  				childSK:  "25457201688850691947727629385191704516744796114925897962676248250929345014287",
    64  			},
    65  		},
    66  		{
    67  			name: "Case 2",
    68  			fields: fields{
    69  				seed:       "0099FF991111002299DD7744EE3355BBDD8844115566CC55663355668888CC00",
    70  				childIndex: 4294967295,
    71  			},
    72  			want: want{
    73  				masterSK: "27580842291869792442942448775674722299803720648445448686099262467207037398656",
    74  				childSK:  "29358610794459428860402234341874281240803786294062035874021252734817515685787",
    75  			},
    76  		},
    77  		{
    78  			name: "Case 3",
    79  			fields: fields{
    80  				seed:       "d4e56740f876aef8c010b86a40d5f56745a118d0906a34e69aec8c0db1cb8fa3",
    81  				childIndex: 42,
    82  			},
    83  			want: want{
    84  				masterSK: "19022158461524446591288038168518313374041767046816487870552872741050760015818",
    85  				childSK:  "31372231650479070279774297061823572166496564838472787488249775572789064611981",
    86  			},
    87  		},
    88  	}
    89  	for _, tt := range tests {
    90  		t.Run(tt.name, func(t *testing.T) {
    91  			seedBytes, err := hex.DecodeString(tt.fields.seed)
    92  			require.NoError(t, err)
    93  
    94  			// We derive keys, then check the master SK and the child SK.
    95  			masterSK, err := util.PrivateKeyFromSeedAndPath(seedBytes, "m")
    96  			require.NoError(t, err)
    97  			childSK, err := util.PrivateKeyFromSeedAndPath(seedBytes, fmt.Sprintf("m/%d", tt.fields.childIndex))
    98  			require.NoError(t, err)
    99  
   100  			expectedMasterSK, err := bls.SecretKeyFromBigNum(tt.want.masterSK)
   101  			require.NoError(t, err)
   102  			expectedChildSK, err := bls.SecretKeyFromBigNum(tt.want.childSK)
   103  			require.NoError(t, err)
   104  			assert.DeepEqual(t, expectedMasterSK.Marshal(), masterSK.Marshal())
   105  			assert.DeepEqual(t, expectedChildSK.Marshal(), childSK.Marshal())
   106  		})
   107  	}
   108  }