Skip to content

feat(slasher): slash proposer of descendant-of-invalid checkpoint#23476

Closed
PhilWindle wants to merge 5 commits into
merge-train/spartanfrom
phil/a-1072-slash-proposer-of-descendant-of-invalid
Closed

feat(slasher): slash proposer of descendant-of-invalid checkpoint#23476
PhilWindle wants to merge 5 commits into
merge-train/spartanfrom
phil/a-1072-slash-proposer-of-descendant-of-invalid

Conversation

@PhilWindle

Copy link
Copy Markdown
Collaborator

Summary

Closes A-1072.

When a checkpoint published to L1 builds on a previously-detected invalid checkpoint, slash the descendant's proposer instead of its attestors. Under pipelining, attestors may have already signed the descendant before the parent's invalidity became visible on L1; only the proposer that actually published the descendant to L1 is at fault.

Stacked on #23468 (A-1073 rename). Rebase onto merge-train/spartan once #23468 lands.

  • slashAttestorsOnAncestorInvalidslashProposerOnAncestorInvalid in AttestationsBlockWatcher
  • Looks up the descendant's proposer via the epoch cache, emits a single PROPOSED_DESCENDANT_OF_INVALID slash for that address
  • Updated the watcher's class comment to describe the new semantics
  • Updated the existing watcher unit test (now expects a proposer slash, not two attestor slashes) and added a guard test for the "no proposer found" case on the descendant

Test plan

  • yarn build
  • yarn workspace @aztec/slasher test
  • yarn format, yarn lint slasher

…DESCENDANT_OF_INVALID

Rename the slashing offence and its associated config knob, env var, helm
value, and terraform variable to reflect that the slash now targets the
proposer that publishes a descendant checkpoint to L1, not its attestors.

Breaking for operators: SLASH_ATTEST_DESCENDANT_OF_INVALID_PENALTY ->
SLASH_PROPOSE_DESCENDANT_OF_INVALID_PENALTY (see v5.0.0 changelog).
…OINT_WITH_INVALID_ATTESTATIONS

Rename the offence (and its config knob, env var, helm value, terraform
variable, etc.) from the previous shorter PROPOSED_DESCENDANT_OF_INVALID
form to spell out the exact condition: a descendant of a checkpoint that
had invalid (or insufficient) attestations.
…id checkpoint

When a checkpoint published to L1 builds on a previously-detected invalid
checkpoint, slash the descendant's proposer instead of its attestors. Under
pipelining, attestors may have already signed before the parent's invalidity
became visible on L1, so only the proposer that actually published the
descendant to L1 is at fault.
@PhilWindle PhilWindle force-pushed the phil/a-1072-slash-proposer-of-descendant-of-invalid branch from e9965cc to 47a4923 Compare May 21, 2026 16:20
Base automatically changed from phil/a-1073-rename-attested-descendant-of-invalid to merge-train/spartan May 22, 2026 10:07
@PhilWindle PhilWindle closed this May 29, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant