We currently do not prevent aggregate attestations that have overlap in indices from being included across multiple blocks. This is handled in finality, crosslinks, and attester reward but just taking the set of the indices included to prevent double counting. The reward for the proposers that might have double included is currently underspecified.
For each index in previous_epoch_attester_indices, we determine the proposer
proposer_index = get_beacon_proposer_index(state, inclusion_slot(state, index))and setstate.validator_balances[proposer_index] += base_reward(state, index) // INCLUDER_REWARD_QUOTIENT
This could be interpreted in a number of ways:
I suggest we clarify the above language to specify the reward go to the _first_ proposer to include a given index. This will eliminate the incentive to double include for additional reward. The proposer might only double include at this point because they have additional attestations to add but do not have the requisite data to un-aggregate repeat indices from the aggregate attestation.
Proposed fix. Change:
Let
inclusion_slot(state, index) = a.slot_includedfor the attestationawhereindexis inget_attestation_participants(state, a.data, a.participation_bitfield).
To:
Let
inclusion_slot(state, index) = a.slot_includedfor the attestationawhereindexis inget_attestation_participants(state, a.data, a.participation_bitfield). If multiple attestations are applicable, the attestation with lowestslot_includedis considered.
I think that's the right place in the spec to intervene on this issue, as it could fix other unforeseen issues related to the same problem.
closing in favor of #464
Most helpful comment
Proposed fix. Change:
To:
I think that's the right place in the spec to intervene on this issue, as it could fix other unforeseen issues related to the same problem.