|
|
@ -477,6 +477,9 @@ func (cs *ConsensusState) updateToState(state sm.State) { |
|
|
|
cs.LockedRound = 0 |
|
|
|
cs.LockedBlock = nil |
|
|
|
cs.LockedBlockParts = nil |
|
|
|
cs.ValidRound = 0 |
|
|
|
cs.ValidBlock = nil |
|
|
|
cs.ValidBlockParts = nil |
|
|
|
cs.Votes = cstypes.NewHeightVoteSet(state.ChainID, height, validators) |
|
|
|
cs.CommitRound = -1 |
|
|
|
cs.LastCommit = lastPrecommits |
|
|
@ -798,6 +801,9 @@ func (cs *ConsensusState) defaultDecideProposal(height int64, round int) { |
|
|
|
if cs.LockedBlock != nil { |
|
|
|
// If we're locked onto a block, just choose that.
|
|
|
|
block, blockParts = cs.LockedBlock, cs.LockedBlockParts |
|
|
|
} else if cs.ValidBlock != nil { |
|
|
|
// If there is valid block, choose that.
|
|
|
|
block, blockParts = cs.ValidBlock, cs.ValidBlockParts |
|
|
|
} else { |
|
|
|
// Create a new proposal block from state/txs from the mempool.
|
|
|
|
block, blockParts = cs.createProposalBlock() |
|
|
@ -1389,6 +1395,17 @@ func (cs *ConsensusState) addVote(vote *types.Vote, peerID p2p.ID) (added bool, |
|
|
|
cs.LockedBlockParts = nil |
|
|
|
cs.eventBus.PublishEventUnlock(cs.RoundStateEvent()) |
|
|
|
} |
|
|
|
if ok && !blockID.IsZero() && !cs.ValidBlock.HashesTo(blockID.Hash) && vote.Round > cs.ValidRound { |
|
|
|
// update valid value
|
|
|
|
if cs.ProposalBlock.HashesTo(blockID.Hash) { |
|
|
|
cs.ValidRound = vote.Round |
|
|
|
cs.ValidBlock = cs.ProposalBlock |
|
|
|
cs.ValidBlockParts = cs.ProposalBlockParts |
|
|
|
} |
|
|
|
//TODO: We might want to update ValidBlock also in case we don't have that block yet,
|
|
|
|
// and obtain the required block using gossiping
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
if cs.Round <= vote.Round && prevotes.HasTwoThirdsAny() { |
|
|
|
// Round-skip over to PrevoteWait or goto Precommit.
|
|
|
|