Description
BEEFY voters should only vote on GRANDPA finalized blocks - vote only on canonic chain/fork.
Votes on blocks from different forks should (automatically) lead to stake slashing (more aggressive slashing than GRANDPA equivocations, since this scenario is intentionally dishonest).
We should add client/voter detection of such misbehavior as well as runtime logic for reporting proofs of misbehavior and subsequent slashing consequences.
Proposed solution
Runtime side
- add new
pallet::call to pallet_beefy similar to report_equivocation that takes InvalidPayloadProof
- hook
pallet_beefy_mmr to pallet_beefy::EquivocationReportSystem to be able to verify InvalidPayloadProof:
- verify inner GrandpaProof to make sure the current chain fork is finalized at least up to offending vote height,
- verify
offending_vote.mmr_root != on-chain mmr_root (combined with above, it proves what we need)
- report offense to staking so offending vote author gets slashed
Client-side
- add "fisherman" capabilities to voter gossip - on detecting votes for historical forks, it builds the required proof of misbehavior and submits report.
cc @Lederstrumpf, @andresilva
Description
BEEFY voters should only vote on GRANDPA finalized blocks - vote only on canonic chain/fork.
Votes on blocks from different forks should (automatically) lead to stake slashing (more aggressive slashing than GRANDPA equivocations, since this scenario is intentionally dishonest).
We should add client/voter detection of such misbehavior as well as runtime logic for reporting proofs of misbehavior and subsequent slashing consequences.
Proposed solution
Runtime side
pallet::calltopallet_beefysimilar to report_equivocation that takesInvalidPayloadProofpallet_beefy_mmrtopallet_beefy::EquivocationReportSystemto be able to verifyInvalidPayloadProof:offending_vote.mmr_root!= on-chainmmr_root(combined with above, it proves what we need)Client-side
cc @Lederstrumpf, @andresilva