Skip to content

Commit b654d1e

Browse files
committed
Fix to use Err(DoubleVote) from VoteCollector
VoteCollector is changed to return Result<bool, DoubleVote>. Rust compiler will force you to check whether there was a double vote.
1 parent c34de06 commit b654d1e

File tree

2 files changed

+32
-25
lines changed

2 files changed

+32
-25
lines changed

core/src/consensus/tendermint/vote_collector.rs

Lines changed: 22 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -61,26 +61,29 @@ impl Encodable for DoubleVote {
6161
}
6262

6363
impl StepCollector {
64-
/// Returns Some(&Address) when validator is double voting.
65-
fn insert(&mut self, message: ConsensusMessage) -> Option<DoubleVote> {
64+
/// Some(true): a message is new
65+
/// Some(false): a message is duplicated
66+
/// Err(DoubleVote): a double vote
67+
fn insert(&mut self, message: ConsensusMessage) -> Result<bool, DoubleVote> {
6668
// Do nothing when message was seen.
67-
if !self.messages.contains(&message) {
68-
self.messages.push(message.clone());
69-
if let Some(previous) = self.voted.insert(message.signer_index(), message.clone()) {
70-
// Bad validator sent a different message.
71-
return Some(DoubleVote {
72-
author_index: message.signer_index(),
73-
vote_one: previous,
74-
vote_two: message,
75-
})
76-
} else {
77-
self.block_votes
78-
.entry(message.block_hash())
79-
.or_default()
80-
.insert(message.signer_index(), message.signature());
81-
}
69+
if self.messages.contains(&message) {
70+
return Ok(false)
71+
}
72+
self.messages.push(message.clone());
73+
if let Some(previous) = self.voted.insert(message.signer_index(), message.clone()) {
74+
// Bad validator sent a different message.
75+
Err(DoubleVote {
76+
author_index: message.signer_index(),
77+
vote_one: previous,
78+
vote_two: message,
79+
})
80+
} else {
81+
self.block_votes
82+
.entry(message.block_hash())
83+
.or_default()
84+
.insert(message.signer_index(), message.signature());
85+
Ok(true)
8286
}
83-
None
8487
}
8588

8689
/// Count all votes for the given block hash at this round.
@@ -120,7 +123,7 @@ impl Default for VoteCollector {
120123

121124
impl VoteCollector {
122125
/// Insert vote if it is newer than the oldest one.
123-
pub fn collect(&mut self, message: ConsensusMessage) -> Option<DoubleVote> {
126+
pub fn collect(&mut self, message: ConsensusMessage) -> Result<bool, DoubleVote> {
124127
self.votes.entry(*message.round()).or_insert_with(Default::default).insert(message)
125128
}
126129

core/src/consensus/tendermint/worker.rs

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -927,7 +927,9 @@ impl Worker {
927927
on: on.clone(),
928928
};
929929
if !self.votes.is_old_or_known(&message) {
930-
self.votes.collect(message);
930+
if let Err(double_vote) = self.votes.collect(message) {
931+
cerror!(ENGINE, "Double vote found on_commit_message: {:?}", double_vote);
932+
}
931933
}
932934
}
933935

@@ -1394,7 +1396,7 @@ impl Worker {
13941396
self.votes_received.set(vote_index);
13951397
}
13961398

1397-
if let Some(double) = self.votes.collect(message.clone()) {
1399+
if let Err(double) = self.votes.collect(message.clone()) {
13981400
cerror!(ENGINE, "Double vote found {:?}", double);
13991401
self.report_double_vote(&double);
14001402
return Err(EngineError::DoubleVote(sender))
@@ -1512,7 +1514,7 @@ impl Worker {
15121514
};
15131515

15141516
self.votes_received.set(vote.signer_index);
1515-
self.votes.collect(vote.clone());
1517+
self.votes.collect(vote.clone()).expect("Must not attempt double vote");
15161518
cinfo!(ENGINE, "Voted {:?} as {}th validator.", vote, signer_index);
15171519
Ok(Some(vote))
15181520
}
@@ -1538,7 +1540,7 @@ impl Worker {
15381540
on,
15391541
};
15401542

1541-
self.votes.collect(vote.clone());
1543+
self.votes.collect(vote.clone()).expect("Must not attempt double vote on proposal");;
15421544
cinfo!(ENGINE, "Voted {:?} as {}th proposer.", vote, signer_index);
15431545
Ok(vote)
15441546
}
@@ -1790,7 +1792,7 @@ impl Worker {
17901792
);
17911793
}
17921794

1793-
if let Some(double) = self.votes.collect(message.clone()) {
1795+
if let Err(double) = self.votes.collect(message.clone()) {
17941796
cerror!(ENGINE, "Double Vote found {:?}", double);
17951797
self.report_double_vote(&double);
17961798
return None
@@ -2125,7 +2127,9 @@ impl Worker {
21252127
cdebug!(ENGINE, "Commit message-{} is verified", commit_height);
21262128
for vote in votes {
21272129
if !self.votes.is_old_or_known(&vote) {
2128-
self.votes.collect(vote);
2130+
if let Err(double_vote) = self.votes.collect(vote) {
2131+
cerror!(ENGINE, "Double vote found on_commit_message: {:?}", double_vote);
2132+
}
21292133
}
21302134
}
21312135

0 commit comments

Comments
 (0)