Skip to content

Commit 4b13f7f

Browse files
committed
Fix a step regression bug in Tendermint::worker::new_blocks
A regression in the step can cause a node double-vote.
1 parent 6b5905b commit 4b13f7f

File tree

1 file changed

+20
-10
lines changed

1 file changed

+20
-10
lines changed

core/src/consensus/tendermint/worker.rs

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1437,17 +1437,24 @@ impl Worker {
14371437
}
14381438
};
14391439

1440-
if !imported.is_empty() {
1441-
let mut height_changed = false;
1440+
if let Some((last, rest)) = imported.split_last() {
1441+
let (imported, last_proposal_header) = {
1442+
let header =
1443+
c.block_header(&last.clone().into()).expect("ChainNotify is called after the block is imported");
1444+
let full_header = header.decode();
1445+
if self.is_proposal(full_header.number(), full_header.hash()) {
1446+
(rest, Some(full_header))
1447+
} else {
1448+
(imported.as_slice(), None)
1449+
}
1450+
};
1451+
let height_at_begin = self.height;
14421452
for hash in imported {
14431453
// New Commit received, skip to next height.
1444-
let header = c.block_header(&hash.into()).expect("ChainNotify is called after the block is imported");
1445-
1454+
let header =
1455+
c.block_header(&hash.clone().into()).expect("ChainNotify is called after the block is imported");
14461456
let full_header = header.decode();
1447-
if self.is_proposal(full_header.number(), full_header.hash()) {
1448-
self.on_imported_proposal(&full_header);
1449-
} else if self.height < header.number() {
1450-
height_changed = true;
1457+
if self.height < header.number() {
14511458
cinfo!(ENGINE, "Received a commit: {:?}.", header.number());
14521459
let prev_block_view = TendermintSealView::new(full_header.seal())
14531460
.previous_block_view()
@@ -1456,11 +1463,14 @@ impl Worker {
14561463
self.save_last_confirmed_view(prev_block_view);
14571464
}
14581465
}
1459-
if height_changed {
1466+
if height_at_begin != self.height {
14601467
self.move_to_step(Step::Propose, false);
1461-
return
1468+
}
1469+
if let Some(last_proposal_header) = last_proposal_header {
1470+
self.on_imported_proposal(&last_proposal_header);
14621471
}
14631472
}
1473+
14641474
if !enacted.is_empty() && self.can_move_from_commit_to_propose() {
14651475
let new_height = self.height + 1;
14661476
self.move_to_height(new_height);

0 commit comments

Comments
 (0)