only calculate total_balance once per attestation delta application

This commit is contained in:
Dustin Brody 2020-07-08 08:41:25 +02:00 committed by tersec
parent 3c030d945d
commit 8ac613421d
1 changed files with 31 additions and 17 deletions

View File

@ -268,6 +268,7 @@ func get_eligible_validator_indices(state: BeaconState): seq[ValidatorIndex] =
func get_attestation_component_deltas(state: BeaconState,
attestations: seq[PendingAttestation],
total_balance: Gwei,
cache: var StateCache,
): tuple[a: seq[Gwei], b: seq[Gwei]] =
# Helper with shared logic for use by get source, target, and head deltas
@ -276,7 +277,6 @@ func get_attestation_component_deltas(state: BeaconState,
rewards = repeat(0'u64, len(state.validators))
penalties = repeat(0'u64, len(state.validators))
let
total_balance = get_total_active_balance(state, cache)
unslashed_attesting_indices =
get_unslashed_attesting_indices(state, attestations, cache)
attesting_balance = get_total_balance(state, unslashed_attesting_indices)
@ -298,28 +298,36 @@ func get_attestation_component_deltas(state: BeaconState,
(rewards, penalties)
# https://github.com/ethereum/eth2.0-specs/blob/v0.12.1/specs/phase0/beacon-chain.md#components-of-attestation-deltas
func get_source_deltas(state: BeaconState, cache: var StateCache):
# These is slightly refactored to calculate total_balance once.
func get_source_deltas(
state: BeaconState, total_balance: Gwei, cache: var StateCache):
tuple[a: seq[Gwei], b: seq[Gwei]] =
# Return attester micro-rewards/penalties for source-vote for each validator.
let matching_source_attestations =
get_matching_source_attestations(state, get_previous_epoch(state))
get_attestation_component_deltas(state, matching_source_attestations, cache)
get_attestation_component_deltas(
state, matching_source_attestations, total_balance, cache)
func get_target_deltas(state: BeaconState, cache: var StateCache):
func get_target_deltas(
state: BeaconState, total_balance: Gwei, cache: var StateCache):
tuple[a: seq[Gwei], b: seq[Gwei]] =
# Return attester micro-rewards/penalties for target-vote for each validator.
let matching_target_attestations =
get_matching_target_attestations(state, get_previous_epoch(state))
get_attestation_component_deltas(state, matching_target_attestations, cache)
get_attestation_component_deltas(
state, matching_target_attestations, total_balance, cache)
func get_head_deltas(state: BeaconState, cache: var StateCache):
func get_head_deltas(
state: BeaconState, total_balance: Gwei, cache: var StateCache):
tuple[a: seq[Gwei], b: seq[Gwei]] =
# Return attester micro-rewards/penalties for head-vote for each validator.
let matching_head_attestations =
get_matching_head_attestations(state, get_previous_epoch(state))
get_attestation_component_deltas(state, matching_head_attestations, cache)
get_attestation_component_deltas(
state, matching_head_attestations, total_balance, cache)
func get_inclusion_delay_deltas(state: BeaconState, cache: var StateCache):
func get_inclusion_delay_deltas(
state: BeaconState, total_balance: Gwei, cache: var StateCache):
seq[Gwei] =
# Return proposer and inclusion delay micro-rewards/penalties for each validator.
var rewards = repeat(0'u64, len(state.validators))
@ -330,7 +338,6 @@ func get_inclusion_delay_deltas(state: BeaconState, cache: var StateCache):
matching_source_attestations,
get_attesting_indices(state, it.data, it.aggregation_bits, cache))
let total_balance = get_total_active_balance(state, cache)
for index in get_unslashed_attesting_indices(state, matching_source_attestations, cache):
# Translation of attestation = min([...])
# Start by filtering the right attestations
@ -363,11 +370,11 @@ func get_inclusion_delay_deltas(state: BeaconState, cache: var StateCache):
# Spec constructs both and returns both; this doesn't
rewards
func get_inactivity_penalty_deltas(state: BeaconState, cache: var StateCache):
func get_inactivity_penalty_deltas(
state: BeaconState, total_balance: Gwei, cache: var StateCache):
seq[Gwei] =
# Return inactivity reward/penalty deltas for each validator.
var penalties = repeat(0'u64, len(state.validators))
let total_balance = get_total_active_balance(state, cache)
if is_in_inactivity_leak(state):
let
matching_target_attestations =
@ -392,14 +399,21 @@ func get_inactivity_penalty_deltas(state: BeaconState, cache: var StateCache):
penalties
# https://github.com/ethereum/eth2.0-specs/blob/v0.12.1/specs/phase0/beacon-chain.md#get_attestation_deltas
func get_attestation_deltas(state: BeaconState, cache: var StateCache): tuple[a: seq[Gwei], b: seq[Gwei]] =
func get_attestation_deltas(state: BeaconState, cache: var StateCache):
tuple[a: seq[Gwei], b: seq[Gwei]] =
# Return attestation reward/penalty deltas for each validator.
let
(source_rewards, source_penalties) = get_source_deltas(state, cache)
(target_rewards, target_penalties) = get_target_deltas(state, cache)
(head_rewards, head_penalties) = get_head_deltas(state, cache)
inclusion_delay_rewards = get_inclusion_delay_deltas(state, cache)
inactivity_penalties = get_inactivity_penalty_deltas(state, cache)
total_balance = get_total_active_balance(state, cache)
(source_rewards, source_penalties) =
get_source_deltas(state, total_balance, cache)
(target_rewards, target_penalties) =
get_target_deltas(state, total_balance, cache)
(head_rewards, head_penalties) =
get_head_deltas(state, total_balance, cache)
inclusion_delay_rewards =
get_inclusion_delay_deltas(state, total_balance, cache)
inactivity_penalties =
get_inactivity_penalty_deltas(state, total_balance, cache)
let rewards = mapIt(0 ..< len(state.validators),
source_rewards[it] + target_rewards[it] + head_rewards[it] +