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  }