github.com/prysmaticlabs/prysm@v1.4.4/beacon-chain/state/v1/field_trie_test.go (about) 1 package v1_test 2 3 import ( 4 "testing" 5 6 types "github.com/prysmaticlabs/eth2-types" 7 "github.com/prysmaticlabs/prysm/beacon-chain/state/v1" 8 ethpb "github.com/prysmaticlabs/prysm/proto/eth/v1alpha1" 9 "github.com/prysmaticlabs/prysm/shared/params" 10 "github.com/prysmaticlabs/prysm/shared/testutil" 11 "github.com/prysmaticlabs/prysm/shared/testutil/assert" 12 "github.com/prysmaticlabs/prysm/shared/testutil/require" 13 ) 14 15 func TestFieldTrie_NewTrie(t *testing.T) { 16 newState, _ := testutil.DeterministicGenesisState(t, 40) 17 18 // 5 represents the enum value of state roots 19 trie, err := v1.NewFieldTrie(5, newState.StateRoots(), uint64(params.BeaconConfig().SlotsPerHistoricalRoot)) 20 require.NoError(t, err) 21 root, err := v1.RootsArrayHashTreeRoot(newState.StateRoots(), uint64(params.BeaconConfig().SlotsPerHistoricalRoot), "StateRoots") 22 require.NoError(t, err) 23 newRoot, err := trie.TrieRoot() 24 require.NoError(t, err) 25 assert.Equal(t, root, newRoot) 26 } 27 28 func TestFieldTrie_RecomputeTrie(t *testing.T) { 29 newState, _ := testutil.DeterministicGenesisState(t, 32) 30 // 10 represents the enum value of validators 31 trie, err := v1.NewFieldTrie(11, newState.Validators(), params.BeaconConfig().ValidatorRegistryLimit) 32 require.NoError(t, err) 33 34 changedIdx := []uint64{2, 29} 35 val1, err := newState.ValidatorAtIndex(10) 36 require.NoError(t, err) 37 val2, err := newState.ValidatorAtIndex(11) 38 require.NoError(t, err) 39 val1.Slashed = true 40 val1.ExitEpoch = 20 41 42 val2.Slashed = true 43 val2.ExitEpoch = 40 44 45 changedVals := []*ethpb.Validator{val1, val2} 46 require.NoError(t, newState.UpdateValidatorAtIndex(types.ValidatorIndex(changedIdx[0]), changedVals[0])) 47 require.NoError(t, newState.UpdateValidatorAtIndex(types.ValidatorIndex(changedIdx[1]), changedVals[1])) 48 49 expectedRoot, err := v1.ValidatorRegistryRoot(newState.Validators()) 50 require.NoError(t, err) 51 root, err := trie.RecomputeTrie(changedIdx, newState.Validators()) 52 require.NoError(t, err) 53 assert.Equal(t, expectedRoot, root) 54 } 55 56 func TestFieldTrie_CopyTrieImmutable(t *testing.T) { 57 newState, _ := testutil.DeterministicGenesisState(t, 32) 58 // 12 represents the enum value of randao mixes. 59 trie, err := v1.NewFieldTrie(13, newState.RandaoMixes(), uint64(params.BeaconConfig().EpochsPerHistoricalVector)) 60 require.NoError(t, err) 61 62 newTrie := trie.CopyTrie() 63 64 changedIdx := []uint64{2, 29} 65 66 changedVals := [][32]byte{{'A', 'B'}, {'C', 'D'}} 67 require.NoError(t, newState.UpdateRandaoMixesAtIndex(changedIdx[0], changedVals[0][:])) 68 require.NoError(t, newState.UpdateRandaoMixesAtIndex(changedIdx[1], changedVals[1][:])) 69 70 root, err := trie.RecomputeTrie(changedIdx, newState.RandaoMixes()) 71 require.NoError(t, err) 72 newRoot, err := newTrie.TrieRoot() 73 require.NoError(t, err) 74 if root == newRoot { 75 t.Errorf("Wanted roots to be different, but they are the same: %#x", root) 76 } 77 }