github.com/prysmaticlabs/prysm@v1.4.4/beacon-chain/core/helpers/rewards_penalties_test.go (about)

     1  package helpers
     2  
     3  import (
     4  	"testing"
     5  
     6  	types "github.com/prysmaticlabs/eth2-types"
     7  	"github.com/prysmaticlabs/prysm/beacon-chain/state/v1"
     8  	pb "github.com/prysmaticlabs/prysm/proto/beacon/p2p/v1"
     9  	ethpb "github.com/prysmaticlabs/prysm/proto/eth/v1alpha1"
    10  	"github.com/prysmaticlabs/prysm/shared/params"
    11  	"github.com/prysmaticlabs/prysm/shared/testutil/assert"
    12  	"github.com/prysmaticlabs/prysm/shared/testutil/require"
    13  )
    14  
    15  func TestTotalBalance_OK(t *testing.T) {
    16  	state, err := v1.InitializeFromProto(&pb.BeaconState{Validators: []*ethpb.Validator{
    17  		{EffectiveBalance: 27 * 1e9}, {EffectiveBalance: 28 * 1e9},
    18  		{EffectiveBalance: 32 * 1e9}, {EffectiveBalance: 40 * 1e9},
    19  	}})
    20  	require.NoError(t, err)
    21  
    22  	balance := TotalBalance(state, []types.ValidatorIndex{0, 1, 2, 3})
    23  	wanted := state.Validators()[0].EffectiveBalance + state.Validators()[1].EffectiveBalance +
    24  		state.Validators()[2].EffectiveBalance + state.Validators()[3].EffectiveBalance
    25  	assert.Equal(t, wanted, balance, "Incorrect TotalBalance")
    26  }
    27  
    28  func TestTotalBalance_ReturnsEffectiveBalanceIncrement(t *testing.T) {
    29  	state, err := v1.InitializeFromProto(&pb.BeaconState{Validators: []*ethpb.Validator{}})
    30  	require.NoError(t, err)
    31  
    32  	balance := TotalBalance(state, []types.ValidatorIndex{})
    33  	wanted := params.BeaconConfig().EffectiveBalanceIncrement
    34  	assert.Equal(t, wanted, balance, "Incorrect TotalBalance")
    35  }
    36  
    37  func TestTotalActiveBalance_OK(t *testing.T) {
    38  	state, err := v1.InitializeFromProto(&pb.BeaconState{Validators: []*ethpb.Validator{
    39  		{
    40  			EffectiveBalance: 32 * 1e9,
    41  			ExitEpoch:        params.BeaconConfig().FarFutureEpoch,
    42  		},
    43  		{
    44  			EffectiveBalance: 30 * 1e9,
    45  			ExitEpoch:        params.BeaconConfig().FarFutureEpoch,
    46  		},
    47  		{
    48  			EffectiveBalance: 30 * 1e9,
    49  			ExitEpoch:        params.BeaconConfig().FarFutureEpoch,
    50  		},
    51  		{
    52  			EffectiveBalance: 32 * 1e9,
    53  			ExitEpoch:        params.BeaconConfig().FarFutureEpoch,
    54  		},
    55  	}})
    56  	require.NoError(t, err)
    57  
    58  	balance, err := TotalActiveBalance(state)
    59  	assert.NoError(t, err)
    60  	wanted := state.Validators()[0].EffectiveBalance + state.Validators()[1].EffectiveBalance +
    61  		state.Validators()[2].EffectiveBalance + state.Validators()[3].EffectiveBalance
    62  	assert.Equal(t, wanted, balance, "Incorrect TotalActiveBalance")
    63  }
    64  
    65  func TestGetBalance_OK(t *testing.T) {
    66  	tests := []struct {
    67  		i uint64
    68  		b []uint64
    69  	}{
    70  		{i: 0, b: []uint64{27 * 1e9, 28 * 1e9, 32 * 1e9}},
    71  		{i: 1, b: []uint64{27 * 1e9, 28 * 1e9, 32 * 1e9}},
    72  		{i: 2, b: []uint64{27 * 1e9, 28 * 1e9, 32 * 1e9}},
    73  		{i: 0, b: []uint64{0, 0, 0}},
    74  		{i: 2, b: []uint64{0, 0, 0}},
    75  	}
    76  	for _, test := range tests {
    77  		state, err := v1.InitializeFromProto(&pb.BeaconState{Balances: test.b})
    78  		require.NoError(t, err)
    79  		assert.Equal(t, test.b[test.i], state.Balances()[test.i], "Incorrect Validator balance")
    80  	}
    81  }
    82  
    83  func TestIncreaseBalance_OK(t *testing.T) {
    84  	tests := []struct {
    85  		i  types.ValidatorIndex
    86  		b  []uint64
    87  		nb uint64
    88  		eb uint64
    89  	}{
    90  		{i: 0, b: []uint64{27 * 1e9, 28 * 1e9, 32 * 1e9}, nb: 1, eb: 27*1e9 + 1},
    91  		{i: 1, b: []uint64{27 * 1e9, 28 * 1e9, 32 * 1e9}, nb: 0, eb: 28 * 1e9},
    92  		{i: 2, b: []uint64{27 * 1e9, 28 * 1e9, 32 * 1e9}, nb: 33 * 1e9, eb: 65 * 1e9},
    93  	}
    94  	for _, test := range tests {
    95  		state, err := v1.InitializeFromProto(&pb.BeaconState{
    96  			Validators: []*ethpb.Validator{
    97  				{EffectiveBalance: 4}, {EffectiveBalance: 4}, {EffectiveBalance: 4}},
    98  			Balances: test.b,
    99  		})
   100  		require.NoError(t, err)
   101  		require.NoError(t, IncreaseBalance(state, test.i, test.nb))
   102  		assert.Equal(t, test.eb, state.Balances()[test.i], "Incorrect Validator balance")
   103  	}
   104  }
   105  
   106  func TestDecreaseBalance_OK(t *testing.T) {
   107  	tests := []struct {
   108  		i  types.ValidatorIndex
   109  		b  []uint64
   110  		nb uint64
   111  		eb uint64
   112  	}{
   113  		{i: 0, b: []uint64{2, 28 * 1e9, 32 * 1e9}, nb: 1, eb: 1},
   114  		{i: 1, b: []uint64{27 * 1e9, 28 * 1e9, 32 * 1e9}, nb: 0, eb: 28 * 1e9},
   115  		{i: 2, b: []uint64{27 * 1e9, 28 * 1e9, 1}, nb: 2, eb: 0},
   116  		{i: 3, b: []uint64{27 * 1e9, 28 * 1e9, 1, 28 * 1e9}, nb: 28 * 1e9, eb: 0},
   117  	}
   118  	for _, test := range tests {
   119  		state, err := v1.InitializeFromProto(&pb.BeaconState{
   120  			Validators: []*ethpb.Validator{
   121  				{EffectiveBalance: 4}, {EffectiveBalance: 4}, {EffectiveBalance: 4}, {EffectiveBalance: 3}},
   122  			Balances: test.b,
   123  		})
   124  		require.NoError(t, err)
   125  		require.NoError(t, DecreaseBalance(state, test.i, test.nb))
   126  		assert.Equal(t, test.eb, state.Balances()[test.i], "Incorrect Validator balance")
   127  	}
   128  }
   129  
   130  func TestFinalityDelay(t *testing.T) {
   131  	base := buildState(params.BeaconConfig().SlotsPerEpoch*10, 1)
   132  	base.FinalizedCheckpoint = &ethpb.Checkpoint{Epoch: 3}
   133  	beaconState, err := v1.InitializeFromProto(base)
   134  	require.NoError(t, err)
   135  	prevEpoch := types.Epoch(0)
   136  	finalizedEpoch := types.Epoch(0)
   137  	// Set values for each test case
   138  	setVal := func() {
   139  		prevEpoch = PrevEpoch(beaconState)
   140  		finalizedEpoch = beaconState.FinalizedCheckpointEpoch()
   141  	}
   142  	setVal()
   143  	d := FinalityDelay(prevEpoch, finalizedEpoch)
   144  	w := PrevEpoch(beaconState) - beaconState.FinalizedCheckpointEpoch()
   145  	assert.Equal(t, w, d, "Did not get wanted finality delay")
   146  
   147  	require.NoError(t, beaconState.SetFinalizedCheckpoint(&ethpb.Checkpoint{Epoch: 4}))
   148  	setVal()
   149  	d = FinalityDelay(prevEpoch, finalizedEpoch)
   150  	w = PrevEpoch(beaconState) - beaconState.FinalizedCheckpointEpoch()
   151  	assert.Equal(t, w, d, "Did not get wanted finality delay")
   152  
   153  	require.NoError(t, beaconState.SetFinalizedCheckpoint(&ethpb.Checkpoint{Epoch: 5}))
   154  	setVal()
   155  	d = FinalityDelay(prevEpoch, finalizedEpoch)
   156  	w = PrevEpoch(beaconState) - beaconState.FinalizedCheckpointEpoch()
   157  	assert.Equal(t, w, d, "Did not get wanted finality delay")
   158  }
   159  
   160  func TestIsInInactivityLeak(t *testing.T) {
   161  	base := buildState(params.BeaconConfig().SlotsPerEpoch*10, 1)
   162  	base.FinalizedCheckpoint = &ethpb.Checkpoint{Epoch: 3}
   163  	beaconState, err := v1.InitializeFromProto(base)
   164  	require.NoError(t, err)
   165  	prevEpoch := types.Epoch(0)
   166  	finalizedEpoch := types.Epoch(0)
   167  	// Set values for each test case
   168  	setVal := func() {
   169  		prevEpoch = PrevEpoch(beaconState)
   170  		finalizedEpoch = beaconState.FinalizedCheckpointEpoch()
   171  	}
   172  	setVal()
   173  	assert.Equal(t, true, IsInInactivityLeak(prevEpoch, finalizedEpoch), "Wanted inactivity leak true")
   174  	require.NoError(t, beaconState.SetFinalizedCheckpoint(&ethpb.Checkpoint{Epoch: 4}))
   175  	setVal()
   176  	assert.Equal(t, true, IsInInactivityLeak(prevEpoch, finalizedEpoch), "Wanted inactivity leak true")
   177  	require.NoError(t, beaconState.SetFinalizedCheckpoint(&ethpb.Checkpoint{Epoch: 5}))
   178  	setVal()
   179  	assert.Equal(t, false, IsInInactivityLeak(prevEpoch, finalizedEpoch), "Wanted inactivity leak false")
   180  }
   181  
   182  func buildState(slot types.Slot, validatorCount uint64) *pb.BeaconState {
   183  	validators := make([]*ethpb.Validator, validatorCount)
   184  	for i := 0; i < len(validators); i++ {
   185  		validators[i] = &ethpb.Validator{
   186  			ExitEpoch:        params.BeaconConfig().FarFutureEpoch,
   187  			EffectiveBalance: params.BeaconConfig().MaxEffectiveBalance,
   188  		}
   189  	}
   190  	validatorBalances := make([]uint64, len(validators))
   191  	for i := 0; i < len(validatorBalances); i++ {
   192  		validatorBalances[i] = params.BeaconConfig().MaxEffectiveBalance
   193  	}
   194  	latestActiveIndexRoots := make(
   195  		[][]byte,
   196  		params.BeaconConfig().EpochsPerHistoricalVector,
   197  	)
   198  	for i := 0; i < len(latestActiveIndexRoots); i++ {
   199  		latestActiveIndexRoots[i] = params.BeaconConfig().ZeroHash[:]
   200  	}
   201  	latestRandaoMixes := make(
   202  		[][]byte,
   203  		params.BeaconConfig().EpochsPerHistoricalVector,
   204  	)
   205  	for i := 0; i < len(latestRandaoMixes); i++ {
   206  		latestRandaoMixes[i] = params.BeaconConfig().ZeroHash[:]
   207  	}
   208  	return &pb.BeaconState{
   209  		Slot:                        slot,
   210  		Balances:                    validatorBalances,
   211  		Validators:                  validators,
   212  		RandaoMixes:                 make([][]byte, params.BeaconConfig().EpochsPerHistoricalVector),
   213  		Slashings:                   make([]uint64, params.BeaconConfig().EpochsPerSlashingsVector),
   214  		BlockRoots:                  make([][]byte, params.BeaconConfig().SlotsPerEpoch*10),
   215  		FinalizedCheckpoint:         &ethpb.Checkpoint{Root: make([]byte, 32)},
   216  		PreviousJustifiedCheckpoint: &ethpb.Checkpoint{Root: make([]byte, 32)},
   217  		CurrentJustifiedCheckpoint:  &ethpb.Checkpoint{Root: make([]byte, 32)},
   218  	}
   219  }