Skip to content

Investigate UnknownTargetRoot slasher errors #4972

@michaelsproul

Description

@michaelsproul

Description

We have quite a few minor errors on the slasher like:

Dec 03 23:37:38.417 DEBG Unable to obtain indexed form of attestation for slasher, error: UnknownTargetRoot(0x72eff6e4116a060b103f0731aa7590c96a3b8cd23441144aa6d9d214019e04d9), attestation_root: 0x2aa4ab96fd4d42386c23a5988f9d6955b98edc9d804026f451a783c5b3675d8f, service: beacon

I think this error means:

  • We processed an attestation for which we did know the head block (beacon_block_root).
  • However, we didn't know the target_root. This is an invalid type of attestation, as it implies the target isn't an ancestor of the head.
  • Because the target is unknown, the beacon node fails to load the beacon state for the target block, which the slasher needs to verify the signature. Therefore the attestation gets discarded without being checked for slashability (a potential blind spot!).

Steps to resolve

  1. Confirm that this is what's happening, e.g. invalid attestations where the beacon_block_root does not descend from the target_root.
  2. Decide on a mitigation strategy:
    a) Use the attestation's head state to verify the signatures when the target block is unknown. This should not result in any errors, as attestations are only sent for processing once their head block is known (otherwise they get requeued).
    b) Add a different queue for the slasher which waits for the target root to be known. From the logs it seems that many of the target blocks are actually valid (and canonical), so it might just be a race where a peer attests head=N - 1 and target=N at the start of slot N before we've had time to import block N.
  3. Work out which peers are sending these attestations, as it probably indicates a bug in some client software, or (less likely) someone experimenting with attack strategies.

I think I prefer 2a for its simplicity. We just have to make sure we don't get DoS'd by state loads, as attestation head states likely don't lie on epoch boundaries and are more expensive to fetch than target states in general. Tree states will help with this ;)

Version

Lighthouse v4.5.0

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions