Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Broadcast Slashing on equivocation #14693

Open
wants to merge 10 commits into
base: develop
Choose a base branch
from

Conversation

shyam-patel-kira
Copy link
Contributor

fixes #13088

The PR implements immediate broadcasting of slashing messages when detecting equivocating blocks, helping the network react more quickly to malicious behavior without relying on the full slasher service processing.

@shyam-patel-kira shyam-patel-kira requested a review from a team as a code owner December 6, 2024 17:34
// Check for equivocation before inserting into fork choice
slashing, slashingErr := s.detectEquivocatingBlock(cfg.ctx, cfg.roblock)
if slashingErr != nil {
return errors.Wrap(slashingErr, "could not detect equivocating block")

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this should probably log instead of returning and preventing FCU? could not check for block equivocation seems more accurate

@0xalpharush
Copy link

I think this should probably be done in the gossip validation of beacon blocks for two reasons:

  1. I may not understand the spec properly but I believe signing equivocating blocks even if they're invalid should bet met with a slashing proposal
  2. There is probably no need for the slashing service to be sent a block which was already deemed equivocating and resulted in a slashing proposal being broadcast
    if features.Get().EnableSlasher {
    // Feed the block header to slasher if enabled. This action
    // is done in the background to avoid adding more load to this critical code path.
    go func() {
    blockHeader, err := interfaces.SignedBeaconBlockHeaderFromBlockInterface(blk)
    if err != nil {
    log.WithError(err).WithField("blockSlot", blk.Block().Slot()).Warn("Could not extract block header")
    return
    }
    s.cfg.slasherBlockHeadersFeed.Send(blockHeader)
    }()
    }

Fwiw I am just an interested bystander using this as a learning opportunity. Feel free to ignore or let me know if this is unhelpful

@@ -75,6 +75,23 @@ func (s *Service) postBlockProcess(cfg *postBlockProcessConfig) error {
defer reportProcessingTime(startTime)
defer reportAttestationInclusion(cfg.roblock.Block())

// Check for equivocation before inserting into fork choice
slashing, slashingErr := s.detectEquivocatingBlock(cfg.ctx, cfg.roblock)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is the wrong spot to place this detection. An equivocation will never make it to this point since we check for s.hasSeenBlockIndexSlot during validateBeaconBlockPubSub.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

moved this to validateBeaconBlockPubSub

return errors.Wrap(slashingErr, "could not detect equivocating block")
}

if slashing != nil {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Better if the broadcasting logic is also handled by the helper so that it's encapsulated, the helper should call a broadcasting routine instead of returnning the slashing.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Addressed this in the next commit

if header1.Header.Slot == header2.Header.Slot &&
header1.Header.ProposerIndex == header2.Header.ProposerIndex {

header1Root, err := header1.Header.HashTreeRoot()
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No need to hash again here, you already have the root when you call this helper.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

fixed this in the next commit

beacon-chain/blockchain/service.go Outdated Show resolved Hide resolved
Copy link
Contributor

@potuz potuz left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

When moving this check to the right spot instead after the call to ReceiveBlock we don't have the root yet (since we only hash after we know we haven't seen the block), we should check if the signatures are different instead, as a different root will result in a different signature.

@shyam-patel-kira shyam-patel-kira changed the title [WIP] Broadcast Slashing on equivocation Broadcast Slashing on equivocation Jan 26, 2025
@shyam-patel-kira
Copy link
Contributor Author

Hey @potuz, Thanks for the review, addressed the changes that were requested

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.

Broadcast slashing on equivocating blocks
3 participants