pub trait DoubleVoteSoundness:
UnforgeableSignatures
+ OneValidationVotePerRound
+ OneConfirmationVotePerRound
+ ConsensusInstance
+ SafetyStateRecovery { }Expand description
Lemma (Double votes are never honest). No correct validator is named by an accepted
DoubleVote proof.
Proof. An accepted proof exhibits two signatures by v over VoteValues that agree on
round and kind, whose headers share a chain and height, and whose hashes differ; by
UnforgeableSignatures only v could have produced them, so a correct v cast both votes.
Sharing a chain and height means both votes belong to the same ConsensusInstance โ a reset
changes the height, and SafetyStateRecovery shows the one path that recreates an instance
at an unchanged height preserves the votes rather than forgetting them. Then:
kind = ValidatedcontradictsOneValidationVotePerRound;kind = ConfirmedcontradictsOneConfirmationVotePerRound;kind = Timeoutis not realizable at all: the proof carriesBlockHeaders and checks the signature overCryptoHash::new(header), whereas a timeout vote signs the hash of aTimeoutvalue, so an accepted timeout-kind proof would require a block header colliding with aTimeoutโ excluded byUnforgeableSignatures. โ