## Background Best guess to automatically debug why validators do not achieve expected rewards. Tries to answer common questions such as: - Did the validator submit the attestation to this block? - Was the attestation seen in an aggregate? - Was the attestation seen in a block? First, know that the beacon state tracks participation in three bits: - `timely_source` = is_correct_source and inclusion_delay <= 6: - `timely_target` = is_correct_target and inclusion_delay <= 32: - `timely_head` = is_correct_head and inclusion_delay == 1: If all three flags are true, the validator gets maximum attester rewards. If `timely_head` then all other bits are true. ## Labels - `timely_head`: All participation bits in the state are true, validator got max rewards - `timely_target_*`: Flag `timely_head` is false and `timely_target` is true. - `timely_target_next_slot_missed`: `timely_target` requires an inclusion distance of 1. If the next slot is missed, the inclusion distance will be at least 2. But that's the fault of the network, not of this attester. - `timely_target_wrong_head_vote`: Attestation included timely in next slot, but voted for the wrong head. This is likely due to the validator setting the attestation's slot block as head too late. - `timely_target_no_aggregate_inclusion`: Attestation was never seen in an aggregate, which reduces the chances of being seen by the next block proposer so likely the cause of inclusion distance > 1 - `timely_target_late_unknown`: Inclusion distance is > 1 but there's no matching criteria why - `timely_target_wrong_head_vote_late_unknown`, `timely_target_wrong_head_vote_next_slot_missed`, `timely_target_wrong_head_vote_no_aggregate_inclusion`: See `timely_target_wrong_head_vote` plus inclusion distance is > 1. - `no_submission`: The validator never submitted an attestation for that epoch - `no_aggregate_inclusion`: The validator submitted an attestation, but it was never included in an aggregate or on-chain - `aggregate_inclusion_but_missed`: The attestation was seen in an aggregate but not in any on-chain blocks - `unexpected_*`: beacon node encounter bad states from which to derive a valid reason - `unexpected_timely_target_without_summary`: validator attestation is seen on-chain but was never submitted to the beacon node. This can happen when using multiple beacon node as fallbacks. - `wrong_target_timely_source`: Flag `timely_head` is false and `timely_target` is false and `timely_source` is true. It means attestation voted the wrong target but inclusion distance is <= 6. This can happen when the attestation slot is the first of the epoch. In that case importing the head block late will cause to vote for wrong head AND target. ## Block proposal labels TBD