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 = ðpb.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(ðpb.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(ðpb.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 = ðpb.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(ðpb.Checkpoint{Epoch: 4})) 175 setVal() 176 assert.Equal(t, true, IsInInactivityLeak(prevEpoch, finalizedEpoch), "Wanted inactivity leak true") 177 require.NoError(t, beaconState.SetFinalizedCheckpoint(ðpb.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] = ðpb.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: ðpb.Checkpoint{Root: make([]byte, 32)}, 216 PreviousJustifiedCheckpoint: ðpb.Checkpoint{Root: make([]byte, 32)}, 217 CurrentJustifiedCheckpoint: ðpb.Checkpoint{Root: make([]byte, 32)}, 218 } 219 }