github.com/prysmaticlabs/prysm@v1.4.4/beacon-chain/state/stateutil/trie_helpers_test.go (about) 1 package stateutil_test 2 3 import ( 4 "testing" 5 6 types "github.com/prysmaticlabs/eth2-types" 7 "github.com/prysmaticlabs/prysm/beacon-chain/state/stateutil" 8 "github.com/prysmaticlabs/prysm/beacon-chain/state/v1" 9 ethpb "github.com/prysmaticlabs/prysm/proto/eth/v1alpha1" 10 "github.com/prysmaticlabs/prysm/shared/bytesutil" 11 "github.com/prysmaticlabs/prysm/shared/hashutil" 12 "github.com/prysmaticlabs/prysm/shared/params" 13 "github.com/prysmaticlabs/prysm/shared/testutil" 14 "github.com/prysmaticlabs/prysm/shared/testutil/assert" 15 "github.com/prysmaticlabs/prysm/shared/testutil/require" 16 ) 17 18 func TestReturnTrieLayer_OK(t *testing.T) { 19 newState, _ := testutil.DeterministicGenesisState(t, 32) 20 root, err := v1.RootsArrayHashTreeRoot(newState.BlockRoots(), uint64(params.BeaconConfig().SlotsPerHistoricalRoot), "BlockRoots") 21 require.NoError(t, err) 22 blockRts := newState.BlockRoots() 23 roots := make([][32]byte, 0, len(blockRts)) 24 for _, rt := range blockRts { 25 roots = append(roots, bytesutil.ToBytes32(rt)) 26 } 27 layers := stateutil.ReturnTrieLayer(roots, uint64(len(roots))) 28 newRoot := *layers[len(layers)-1][0] 29 assert.Equal(t, root, newRoot) 30 } 31 32 func TestReturnTrieLayerVariable_OK(t *testing.T) { 33 newState, _ := testutil.DeterministicGenesisState(t, 32) 34 root, err := v1.ValidatorRegistryRoot(newState.Validators()) 35 require.NoError(t, err) 36 hasher := hashutil.CustomSHA256Hasher() 37 validators := newState.Validators() 38 roots := make([][32]byte, 0, len(validators)) 39 for _, val := range validators { 40 rt, err := stateutil.ValidatorRootWithHasher(hasher, val) 41 require.NoError(t, err) 42 roots = append(roots, rt) 43 } 44 layers := stateutil.ReturnTrieLayerVariable(roots, params.BeaconConfig().ValidatorRegistryLimit) 45 newRoot := *layers[len(layers)-1][0] 46 newRoot, err = stateutil.AddInMixin(newRoot, uint64(len(validators))) 47 require.NoError(t, err) 48 assert.Equal(t, root, newRoot) 49 } 50 51 func TestRecomputeFromLayer_FixedSizedArray(t *testing.T) { 52 newState, _ := testutil.DeterministicGenesisState(t, 32) 53 blockRts := newState.BlockRoots() 54 roots := make([][32]byte, 0, len(blockRts)) 55 for _, rt := range blockRts { 56 roots = append(roots, bytesutil.ToBytes32(rt)) 57 } 58 layers := stateutil.ReturnTrieLayer(roots, uint64(len(roots))) 59 60 changedIdx := []uint64{24, 41} 61 changedRoots := [][32]byte{{'A', 'B', 'C'}, {'D', 'E', 'F'}} 62 require.NoError(t, newState.UpdateBlockRootAtIndex(changedIdx[0], changedRoots[0])) 63 require.NoError(t, newState.UpdateBlockRootAtIndex(changedIdx[1], changedRoots[1])) 64 65 expectedRoot, err := v1.RootsArrayHashTreeRoot(newState.BlockRoots(), uint64(params.BeaconConfig().SlotsPerHistoricalRoot), "BlockRoots") 66 require.NoError(t, err) 67 root, _, err := stateutil.RecomputeFromLayer(changedRoots, changedIdx, layers) 68 require.NoError(t, err) 69 assert.Equal(t, expectedRoot, root) 70 } 71 72 func TestRecomputeFromLayer_VariableSizedArray(t *testing.T) { 73 newState, _ := testutil.DeterministicGenesisState(t, 32) 74 validators := newState.Validators() 75 hasher := hashutil.CustomSHA256Hasher() 76 roots := make([][32]byte, 0, len(validators)) 77 for _, val := range validators { 78 rt, err := stateutil.ValidatorRootWithHasher(hasher, val) 79 require.NoError(t, err) 80 roots = append(roots, rt) 81 } 82 layers := stateutil.ReturnTrieLayerVariable(roots, params.BeaconConfig().ValidatorRegistryLimit) 83 84 changedIdx := []uint64{2, 29} 85 val1, err := newState.ValidatorAtIndex(10) 86 require.NoError(t, err) 87 val2, err := newState.ValidatorAtIndex(11) 88 require.NoError(t, err) 89 val1.Slashed = true 90 val1.ExitEpoch = 20 91 92 val2.Slashed = true 93 val2.ExitEpoch = 40 94 95 changedVals := []*ethpb.Validator{val1, val2} 96 require.NoError(t, newState.UpdateValidatorAtIndex(types.ValidatorIndex(changedIdx[0]), changedVals[0])) 97 require.NoError(t, newState.UpdateValidatorAtIndex(types.ValidatorIndex(changedIdx[1]), changedVals[1])) 98 99 expectedRoot, err := v1.ValidatorRegistryRoot(newState.Validators()) 100 require.NoError(t, err) 101 roots = make([][32]byte, 0, len(changedVals)) 102 for _, val := range changedVals { 103 rt, err := stateutil.ValidatorRootWithHasher(hasher, val) 104 require.NoError(t, err) 105 roots = append(roots, rt) 106 } 107 root, _, err := stateutil.RecomputeFromLayerVariable(roots, changedIdx, layers) 108 require.NoError(t, err) 109 root, err = stateutil.AddInMixin(root, uint64(len(validators))) 110 require.NoError(t, err) 111 assert.Equal(t, expectedRoot, root) 112 }