nimbus-eth2/tests/consensus_spec/phase0/test_fixture_rewards.nim

114 lines
4.3 KiB
Nim
Raw Normal View History

# beacon_chain
# Copyright (c) 2020-2021 Status Research & Development GmbH
# Licensed and distributed under either of
# * MIT license (license terms in the root directory or at https://opensource.org/licenses/MIT).
# * Apache v2 license (license terms in the root directory or at https://www.apache.org/licenses/LICENSE-2.0).
# at your option. This file may not be copied, modified, or distributed except according to those terms.
{.used.}
import
# Standard library
os,
# Utilities
stew/results,
# Beacon chain internals
../../beacon_chain/spec/[validator, helpers, state_transition_epoch],
../../beacon_chain/spec/datatypes/phase0,
# Test utilities
../../testutil,
../fixtures_utils
2020-09-21 15:58:35 +00:00
const
RewardsDirBase = SszTestsDir/const_preset/"phase0"/"rewards"
RewardsDirBasic = RewardsDirBase/"basic"/"pyspec_tests"
RewardsDirLeak = RewardsDirBase/"leak"/"pyspec_tests"
RewardsDirRandom = RewardsDirBase/"random"/"pyspec_tests"
func add(v: var Deltas, idx: int, delta: RewardDelta) =
v.rewards[idx] += delta.rewards
v.penalties[idx] += delta.penalties
func init(T: type Deltas, len: int): T =
if not result.rewards.setLen(len):
raiseAssert "setLen"
if not result.penalties.setLen(len):
raiseAssert "setLen"
2020-09-21 15:58:35 +00:00
proc runTest(rewardsDir, identifier: string) =
let testDir = rewardsDir / identifier
proc `testImpl _ rewards _ identifier`() =
test "Ethereum Foundation - Phase 0 - Rewards - " & identifier & preset():
let
state = newClone(
parseTest(testDir/"pre.ssz_snappy", SSZ, phase0.BeaconState))
sourceDeltas =
parseTest(testDir/"source_deltas.ssz_snappy", SSZ, Deltas)
targetDeltas =
parseTest(testDir/"target_deltas.ssz_snappy", SSZ, Deltas)
headDeltas = parseTest(testDir/"head_deltas.ssz_snappy", SSZ, Deltas)
inclusionDelayDeltas =
parseTest(testDir/"inclusion_delay_deltas.ssz_snappy", SSZ, Deltas)
inactivityPenaltyDeltas =
parseTest(testDir/"inactivity_penalty_deltas.ssz_snappy", SSZ, Deltas)
var
cache = StateCache()
info: phase0.EpochInfo
finality_delay = (state[].get_previous_epoch() - state[].finalized_checkpoint.epoch)
info.init(state[])
info.process_attestations(state[], cache)
let
total_balance = info.total_balances.current_epoch
total_balance_sqrt = integer_squareroot(total_balance)
var
sourceDeltas2 = Deltas.init(state[].validators.len)
targetDeltas2 = Deltas.init(state[].validators.len)
headDeltas2 = Deltas.init(state[].validators.len)
inclusionDelayDeltas2 = Deltas.init(state[].validators.len)
inactivityPenaltyDeltas2 = Deltas.init(state[].validators.len)
for index, validator in info.statuses.mpairs():
if not is_eligible_validator(validator):
continue
let
base_reward = get_base_reward_sqrt(
state[], index.ValidatorIndex, total_balance_sqrt)
sourceDeltas2.add(index, get_source_delta(
validator, base_reward, info.total_balances, finality_delay))
targetDeltas2.add(index, get_target_delta(
validator, base_reward, info.total_balances, finality_delay))
headDeltas2.add(index, get_head_delta(
validator, base_reward, info.total_balances, finality_delay))
let
(inclusion_delay_delta, proposer_delta) =
get_inclusion_delay_delta(validator, base_reward)
inclusionDelayDeltas2.add(index, inclusion_delay_delta)
inactivityPenaltyDeltas2.add(index, get_inactivity_penalty_delta(
validator, base_reward, finality_delay))
if proposer_delta.isSome:
let proposer_index = proposer_delta.get()[0]
inclusionDelayDeltas2.add(proposer_index.int, proposer_delta.get()[1])
improve slot processing speeds (#1670) about 40% better slot processing times (with LTO enabled) - these don't do BLS but are used heavily during replay (state transition = slot + block transition) tests using a recent medalla state and advancing it 1000 slots: ``` ./ncli slots --preState2:state-302271-3c1dbf19-c1f944bf.ssz --slot:1000 --postState2:xx.ssz ``` pre: ``` All time are ms Average, StdDev, Min, Max, Samples, Test Validation is turned off meaning that no BLS operations are performed 39.236, 0.000, 39.236, 39.236, 1, Load state from file 0.049, 0.002, 0.046, 0.063, 968, Apply slot 256.504, 81.008, 213.471, 591.902, 32, Apply epoch slot 28.597, 0.000, 28.597, 28.597, 1, Save state to file ``` cast: ``` All time are ms Average, StdDev, Min, Max, Samples, Test Validation is turned off meaning that no BLS operations are performed 37.079, 0.000, 37.079, 37.079, 1, Load state from file 0.042, 0.002, 0.040, 0.090, 968, Apply slot 215.552, 68.763, 180.155, 500.103, 32, Apply epoch slot 25.106, 0.000, 25.106, 25.106, 1, Save state to file ``` cast+rewards: ``` All time are ms Average, StdDev, Min, Max, Samples, Test Validation is turned off meaning that no BLS operations are performed 40.049, 0.000, 40.049, 40.049, 1, Load state from file 0.048, 0.001, 0.045, 0.060, 968, Apply slot 164.981, 76.273, 142.099, 477.868, 32, Apply epoch slot 28.498, 0.000, 28.498, 28.498, 1, Save state to file ``` cast+rewards+shr ``` All time are ms Average, StdDev, Min, Max, Samples, Test Validation is turned off meaning that no BLS operations are performed 12.898, 0.000, 12.898, 12.898, 1, Load state from file 0.039, 0.002, 0.038, 0.054, 968, Apply slot 139.971, 68.797, 120.088, 428.844, 32, Apply epoch slot 24.761, 0.000, 24.761, 24.761, 1, Save state to file ```
2020-09-16 20:59:33 +00:00
check:
sourceDeltas == sourceDeltas2
targetDeltas == targetDeltas2
headDeltas == headDeltas2
inclusionDelayDeltas == inclusionDelayDeltas2
inactivityPenaltyDeltas == inactivityPenaltyDeltas2
`testImpl _ rewards _ identifier`()
suite "Ethereum Foundation - Phase 0 - Rewards " & preset():
2020-09-21 15:58:35 +00:00
for rewardsDir in [RewardsDirBasic, RewardsDirLeak, RewardsDirRandom]:
for kind, path in walkDir(rewardsDir, relative = true, checkDir = true):
2020-09-21 15:58:35 +00:00
runTest(rewardsDir, path)