From 9e56a954730ad5e79c8e6e1eacb149c42708b027 Mon Sep 17 00:00:00 2001 From: William Banfield <4561443+williambanfield@users.noreply.github.com> Date: Wed, 22 Dec 2021 11:09:57 -0500 Subject: [PATCH] consensus: check that proposal is non-nil before voting (#7480) --- internal/consensus/state.go | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/internal/consensus/state.go b/internal/consensus/state.go index f6ea2ba47..eb6582935 100644 --- a/internal/consensus/state.go +++ b/internal/consensus/state.go @@ -1369,6 +1369,12 @@ func (cs *State) defaultDoPrevote(ctx context.Context, height int64, round int32 return } + if cs.Proposal == nil || cs.ProposalBlock == nil { + logger.Debug("prevote step; did not receive proposal, prevoting nil") + cs.signAddVote(tmproto.PrevoteType, nil, types.PartSetHeader{}) + return + } + if !cs.Proposal.Timestamp.Equal(cs.ProposalBlock.Header.Time) { logger.Debug("proposal timestamp not equal, prevoting nil") cs.signAddVote(ctx, tmproto.PrevoteType, nil, types.PartSetHeader{}) @@ -1537,6 +1543,13 @@ func (cs *State) enterPrecommit(ctx context.Context, height int64, round int32) } // At this point, +2/3 prevoted for a particular block. + // If we never received a proposal for this block, we must precommit nil + if cs.Proposal == nil || cs.ProposalBlock == nil { + logger.Debug("precommit step; did not receive proposal, precommitting nil") + cs.signAddVote(tmproto.PrecommitType, nil, types.PartSetHeader{}) + return + } + // If the proposal time does not match the block time, precommit nil. if !cs.Proposal.Timestamp.Equal(cs.ProposalBlock.Header.Time) { logger.Debug("proposal timestamp not equal, precommitting nil")