Skip to content

Commit 8731fc4

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 8554dcc commit 8731fc4

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
@@ -921,7 +921,9 @@ impl Worker {
921921
on: on.clone(),
922922
};
923923
if !self.votes.is_old_or_known(&message) {
924-
self.votes.collect(message);
924+
if let Err(double_vote) = self.votes.collect(message) {
925+
cerror!(ENGINE, "Double vote found on_commit_message: {:?}", double_vote);
926+
}
925927
}
926928
}
927929

@@ -1387,7 +1389,7 @@ impl Worker {
13871389
self.votes_received.set(vote_index);
13881390
}
13891391

1390-
if let Some(double) = self.votes.collect(message.clone()) {
1392+
if let Err(double) = self.votes.collect(message.clone()) {
13911393
cerror!(ENGINE, "Double vote found {:?}", double);
13921394
self.report_double_vote(&double);
13931395
return Err(EngineError::DoubleVote(sender))
@@ -1505,7 +1507,7 @@ impl Worker {
15051507
};
15061508

15071509
self.votes_received.set(vote.signer_index);
1508-
self.votes.collect(vote.clone());
1510+
self.votes.collect(vote.clone()).expect("Must not attempt double vote");
15091511
cinfo!(ENGINE, "Voted {:?} as {}th validator.", vote, signer_index);
15101512
Ok(Some(vote))
15111513
}
@@ -1531,7 +1533,7 @@ impl Worker {
15311533
on,
15321534
};
15331535

1534-
self.votes.collect(vote.clone());
1536+
self.votes.collect(vote.clone()).expect("Must not attempt double vote on proposal");;
15351537
cinfo!(ENGINE, "Voted {:?} as {}th proposer.", vote, signer_index);
15361538
Ok(vote)
15371539
}
@@ -1783,7 +1785,7 @@ impl Worker {
17831785
);
17841786
}
17851787

1786-
if let Some(double) = self.votes.collect(message.clone()) {
1788+
if let Err(double) = self.votes.collect(message.clone()) {
17871789
cerror!(ENGINE, "Double Vote found {:?}", double);
17881790
self.report_double_vote(&double);
17891791
return None
@@ -2117,7 +2119,9 @@ impl Worker {
21172119
cdebug!(ENGINE, "Commit message-{} is verified", commit_height);
21182120
for vote in votes {
21192121
if !self.votes.is_old_or_known(&vote) {
2120-
self.votes.collect(vote);
2122+
if let Err(double_vote) = self.votes.collect(vote) {
2123+
cerror!(ENGINE, "Double vote found on_commit_message: {:?}", double_vote);
2124+
}
21212125
}
21222126
}
21232127

0 commit comments

Comments
 (0)