From 4661c98c17c9510e598470ca1f27872eb1ef3d82 Mon Sep 17 00:00:00 2001 From: Ethan Buchman Date: Tue, 25 Jul 2017 12:10:48 -0400 Subject: [PATCH] add pubkey to conflicting vote evidence --- consensus/state.go | 2 +- types/evidence.go | 9 ++++++--- types/vote.go | 15 ++++++++++++--- types/vote_set.go | 5 +---- 4 files changed, 20 insertions(+), 11 deletions(-) diff --git a/consensus/state.go b/consensus/state.go index 0241cbd95..2323dfa04 100644 --- a/consensus/state.go +++ b/consensus/state.go @@ -1340,7 +1340,7 @@ func (cs *ConsensusState) tryAddVote(vote *types.Vote, peerKey string) error { } cs.Logger.Error("Found conflicting vote. Recording evidence in the RoundState", "height", vote.Height, "round", vote.Round, "type", vote.Type, "valAddr", vote.ValidatorAddress, "valIndex", vote.ValidatorIndex) - cs.Evidence = append(cs.Evidence, &types.DuplicateVoteEvidence{voteErr.VoteA, voteErr.VoteB}) + cs.Evidence = append(cs.Evidence, voteErr.DuplicateVoteEvidence) return err } else { // Probably an invalid signature / Bad peer. diff --git a/types/evidence.go b/types/evidence.go index b3cf33175..6eb744277 100644 --- a/types/evidence.go +++ b/types/evidence.go @@ -3,6 +3,8 @@ package types import ( "bytes" "fmt" + + "github.com/tendermint/go-crypto" ) // Evidence represents any provable malicious activity by a validator @@ -14,13 +16,14 @@ type Evidence interface { //------------------------------------------- type DuplicateVoteEvidence struct { - VoteA *Vote - VoteB *Vote + PubKey crypto.PubKey + VoteA *Vote + VoteB *Vote } // Address returns the address of the validator func (dve *DuplicateVoteEvidence) Address() []byte { - return dve.VoteA.ValidatorAddress + return dve.PubKey.Address() } // Verify returns an error if the two votes aren't from the same validator, for the same H/R/S, but for different blocks diff --git a/types/vote.go b/types/vote.go index aa993e33f..a34bf9d45 100644 --- a/types/vote.go +++ b/types/vote.go @@ -22,12 +22,21 @@ var ( ) type ErrVoteConflictingVotes struct { - VoteA *Vote - VoteB *Vote + *DuplicateVoteEvidence } func (err *ErrVoteConflictingVotes) Error() string { - return "Conflicting votes" + return fmt.Sprintf("Conflicting votes from validator %v", err.PubKey.Address()) +} + +func NewConflictingVoteError(val *Validator, voteA, voteB *Vote) *ErrVoteConflictingVotes { + return &ErrVoteConflictingVotes{ + &DuplicateVoteEvidence{ + PubKey: val.PubKey, + VoteA: voteA, + VoteB: voteB, + }, + } } // Types of votes diff --git a/types/vote_set.go b/types/vote_set.go index 941852a84..5b802ceb8 100644 --- a/types/vote_set.go +++ b/types/vote_set.go @@ -186,10 +186,7 @@ func (voteSet *VoteSet) addVote(vote *Vote) (added bool, err error) { // Add vote and get conflicting vote if any added, conflicting := voteSet.addVerifiedVote(vote, blockKey, val.VotingPower) if conflicting != nil { - return added, &ErrVoteConflictingVotes{ - VoteA: conflicting, - VoteB: vote, - } + return added, NewConflictingVoteError(val, conflicting, vote) } else { if !added { cmn.PanicSanity("Expected to add non-conflicting vote")