Skip to content

Commit 2b12d0b

Browse files
foriequal0majecty
authored andcommitted
Fix a step regression bug in Tendermint::worker::new_blocks
A regression in the step can cause a node double-vote.
1 parent 47870a4 commit 2b12d0b

File tree

1 file changed

+19
-10
lines changed

1 file changed

+19
-10
lines changed

core/src/consensus/tendermint/worker.rs

Lines changed: 19 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1516,17 +1516,24 @@ impl Worker {
15161516
}
15171517
}
15181518

1519-
if !imported.is_empty() {
1520-
let mut height_changed = false;
1519+
if let Some((last, rest)) = imported.split_last() {
1520+
let (imported, last_proposal_header) = {
1521+
let header =
1522+
c.block_header(&last.clone().into()).expect("ChainNotify is called after the block is imported");
1523+
let full_header = header.decode();
1524+
if self.is_proposal(full_header.number(), full_header.hash()) {
1525+
(rest, Some(full_header))
1526+
} else {
1527+
(imported.as_slice(), None)
1528+
}
1529+
};
1530+
let height_at_begin = self.height;
15211531
for hash in imported {
15221532
// New Commit received, skip to next height.
1523-
let header = c.block_header(&hash.into()).expect("ChainNotify is called after the block is imported");
1524-
1533+
let header =
1534+
c.block_header(&hash.clone().into()).expect("ChainNotify is called after the block is imported");
15251535
let full_header = header.decode();
1526-
if self.is_proposal(full_header.number(), full_header.hash()) {
1527-
self.on_imported_proposal(&full_header);
1528-
} else if self.height < header.number() {
1529-
height_changed = true;
1536+
if self.height < header.number() {
15301537
cinfo!(ENGINE, "Received a commit: {:?}.", header.number());
15311538
let prev_block_view = TendermintSealView::new(full_header.seal())
15321539
.previous_block_view()
@@ -1535,9 +1542,11 @@ impl Worker {
15351542
self.save_last_confirmed_view(prev_block_view);
15361543
}
15371544
}
1538-
if height_changed {
1545+
if height_at_begin != self.height {
15391546
self.move_to_step(TendermintState::Propose, false);
1540-
return
1547+
}
1548+
if let Some(last_proposal_header) = last_proposal_header {
1549+
self.on_imported_proposal(&last_proposal_header);
15411550
}
15421551
}
15431552
}

0 commit comments

Comments
 (0)