Add test for sync committee block rewards

This commit is contained in:
Alex Stokes 2021-01-06 09:44:17 -08:00
parent 547cb0f38f
commit cc7ae4abd0
1 changed files with 53 additions and 0 deletions

View File

@ -2,6 +2,9 @@ import random
from eth2spec.test.helpers.block import ( from eth2spec.test.helpers.block import (
build_empty_block_for_next_slot, build_empty_block_for_next_slot,
) )
from eth2spec.test.helpers.state import (
state_transition_and_sign_block,
)
from eth2spec.test.lightclient_patch.helpers import ( from eth2spec.test.lightclient_patch.helpers import (
compute_aggregate_sync_committee_signature, compute_aggregate_sync_committee_signature,
) )
@ -57,3 +60,53 @@ def test_invalid_sync_committee_signature(spec, state):
yield 'blocks', [block] yield 'blocks', [block]
expect_assertion_error(lambda: spec.process_sync_committee(state, block.body)) expect_assertion_error(lambda: spec.process_sync_committee(state, block.body))
yield 'post', None yield 'post', None
def compute_sync_committee_participant_reward(spec, state, participant_index, active_validator_count, committee_size):
base_reward = spec.get_base_reward(state, participant_index)
proposer_reward = spec.get_proposer_reward(state, participant_index)
max_participant_reward = base_reward - proposer_reward
return max_participant_reward * active_validator_count // committee_size // spec.SLOTS_PER_EPOCH
@with_all_phases_except([PHASE0, PHASE1])
@spec_state_test
def test_sync_committee_rewards(spec, state):
committee = spec.get_sync_committee_indices(state, spec.get_current_epoch(state))
committee_size = len(committee)
active_validator_count = len(spec.get_active_validator_indices(state, spec.get_current_epoch(state)))
yield 'pre', state
pre_balances = state.balances.copy()
block = build_empty_block_for_next_slot(spec, state)
block.body.sync_committee_bits = [True] * committee_size
block.body.sync_committee_signature = compute_aggregate_sync_committee_signature(
spec,
state,
block.slot - 1,
committee,
)
signed_block = state_transition_and_sign_block(spec, state, block)
yield 'blocks', [signed_block]
yield 'post', state
for index in range(len(state.validators)):
expected_reward = 0
if index == block.proposer_index:
expected_reward += sum([spec.get_proposer_reward(state, index) for index in committee])
if index in committee:
expected_reward += compute_sync_committee_participant_reward(
spec,
state,
index,
active_validator_count,
committee_size
)
assert state.balances[index] == pre_balances[index] + expected_reward