cache base_reward_per_increment for 5x+ Altair block_sim perf increase (#2681)

This commit is contained in:
tersec 2021-06-28 06:54:06 +00:00 committed by GitHub
parent ec54173667
commit 60f601e4e6
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 16 additions and 13 deletions

View File

@ -654,17 +654,15 @@ func get_base_reward_per_increment*(state: altair.BeaconState, cache: var StateC
EFFECTIVE_BALANCE_INCREMENT * BASE_REWARD_FACTOR div EFFECTIVE_BALANCE_INCREMENT * BASE_REWARD_FACTOR div
integer_squareroot(get_total_active_balance(state, cache)) integer_squareroot(get_total_active_balance(state, cache))
# https://github.com/ethereum/eth2.0-specs/blob/v1.1.0-alpha.6/specs/altair/beacon-chain.md#get_base_reward # https://github.com/ethereum/eth2.0-specs/blob/v1.1.0-alpha.7/specs/altair/beacon-chain.md#get_base_reward
func get_base_reward(state: altair.BeaconState, index: ValidatorIndex, cache: var StateCache): Gwei = func get_base_reward(
## Return the base reward for the validator defined by ``index`` with respect to the current ``state``. state: altair.BeaconState, index: ValidatorIndex,
base_reward_per_increment: Gwei): Gwei =
# Note: An optimally performing validator can earn one base reward per ## Return the base reward for the validator defined by ``index`` with respect
# epoch over a long time horizon. This takes into account both per-epoch ## to the current ``state``.
# (e.g. attestation) and intermittent duties (e.g. block proposal and sync let increments =
# committees). state.validators[index].effective_balance div EFFECTIVE_BALANCE_INCREMENT
let increments = increments * base_reward_per_increment
state.validators[index].effective_balance div EFFECTIVE_BALANCE_INCREMENT
increments * get_base_reward_per_increment(state, cache)
# https://github.com/ethereum/eth2.0-specs/blob/v1.0.1/specs/phase0/beacon-chain.md#attestations # https://github.com/ethereum/eth2.0-specs/blob/v1.0.1/specs/phase0/beacon-chain.md#attestations
proc check_attestation*( proc check_attestation*(
@ -736,13 +734,18 @@ proc process_attestation*(
var proposer_reward_numerator = 0'u64 var proposer_reward_numerator = 0'u64
# Participation flag indices # Participation flag indices
let participation_flag_indices = get_attestation_participation_flag_indices(state, attestation.data, state.slot - attestation.data.slot) let
participation_flag_indices =
get_attestation_participation_flag_indices(
state, attestation.data, state.slot - attestation.data.slot)
base_reward_per_increment = get_base_reward_per_increment(state, cache)
for index in get_attesting_indices(state, attestation.data, attestation.aggregation_bits, cache): for index in get_attesting_indices(state, attestation.data, attestation.aggregation_bits, cache):
for flag_index, weight in PARTICIPATION_FLAG_WEIGHTS: for flag_index, weight in PARTICIPATION_FLAG_WEIGHTS:
if flag_index in participation_flag_indices and not has_flag(epoch_participation[index], flag_index): if flag_index in participation_flag_indices and not has_flag(epoch_participation[index], flag_index):
epoch_participation[index] = add_flag(epoch_participation[index], flag_index) epoch_participation[index] = add_flag(epoch_participation[index], flag_index)
proposer_reward_numerator += get_base_reward(state, index, cache) * weight.uint64 # these are all valid, #TODO statically verify or do it type-safely proposer_reward_numerator += get_base_reward(
state, index, base_reward_per_increment) * weight.uint64 # these are all valid, #TODO statically verify or do it type-safely
# Reward proposer # Reward proposer
let let