From d6d61a3047f14abe746de54102962079538a50ae Mon Sep 17 00:00:00 2001 From: Sergio Mena Date: Mon, 7 Feb 2022 20:44:16 +0100 Subject: [PATCH] Re-renamed TwoThirdPrevote... to Valid... --- consensus/byzantine_test.go | 6 +++--- consensus/common_test.go | 2 +- consensus/state.go | 30 +++++++++++++++--------------- consensus/state_test.go | 24 ++++++++++++------------ consensus/types/round_state.go | 25 +++++++++++++++++-------- 5 files changed, 48 insertions(+), 39 deletions(-) diff --git a/consensus/byzantine_test.go b/consensus/byzantine_test.go index a207c172e..dd5febcbd 100644 --- a/consensus/byzantine_test.go +++ b/consensus/byzantine_test.go @@ -223,7 +223,7 @@ func TestByzantinePrevoteEquivocation(t *testing.T) { // Make proposal propBlockID := types.BlockID{Hash: block.Hash(), PartSetHeader: blockParts.Header()} - proposal := types.NewProposal(height, round, lazyProposer.TwoThirdPrevoteRound, propBlockID) + proposal := types.NewProposal(height, round, lazyProposer.ValidRound, propBlockID) p := proposal.ToProto() if err := lazyProposer.privValidator.SignProposal(lazyProposer.state.ChainID, p); err == nil { proposal.Signature = p.Signature @@ -462,7 +462,7 @@ func byzantineDecideProposalFunc(t *testing.T, height int64, round int32, cs *St // Create a new proposal block from state/txs from the mempool. block1, blockParts1 := cs.createProposalBlock() - polRound, propBlockID := cs.TwoThirdPrevoteRound, types.BlockID{Hash: block1.Hash(), PartSetHeader: blockParts1.Header()} + polRound, propBlockID := cs.ValidRound, types.BlockID{Hash: block1.Hash(), PartSetHeader: blockParts1.Header()} proposal1 := types.NewProposal(height, round, polRound, propBlockID) p1 := proposal1.ToProto() if err := cs.privValidator.SignProposal(cs.state.ChainID, p1); err != nil { @@ -476,7 +476,7 @@ func byzantineDecideProposalFunc(t *testing.T, height int64, round int32, cs *St // Create a new proposal block from state/txs from the mempool. block2, blockParts2 := cs.createProposalBlock() - polRound, propBlockID = cs.TwoThirdPrevoteRound, types.BlockID{Hash: block2.Hash(), PartSetHeader: blockParts2.Header()} + polRound, propBlockID = cs.ValidRound, types.BlockID{Hash: block2.Hash(), PartSetHeader: blockParts2.Header()} proposal2 := types.NewProposal(height, round, polRound, propBlockID) p2 := proposal2.ToProto() if err := cs.privValidator.SignProposal(cs.state.ChainID, p2); err != nil { diff --git a/consensus/common_test.go b/consensus/common_test.go index 4722e1600..09512f49d 100644 --- a/consensus/common_test.go +++ b/consensus/common_test.go @@ -208,7 +208,7 @@ func decideProposal( ) (proposal *types.Proposal, block *types.Block) { cs1.mtx.Lock() block, blockParts := cs1.createProposalBlock() - validRound := cs1.TwoThirdPrevoteRound + validRound := cs1.ValidRound chainID := cs1.state.ChainID cs1.mtx.Unlock() if block == nil { diff --git a/consensus/state.go b/consensus/state.go index 17a02bcd1..e9d8b4a35 100644 --- a/consensus/state.go +++ b/consensus/state.go @@ -667,9 +667,9 @@ func (cs *State) updateToState(state sm.State) { cs.LockedRound = -1 cs.LockedBlock = nil cs.LockedBlockParts = nil - cs.TwoThirdPrevoteRound = -1 - cs.TwoThirdPrevoteBlock = nil - cs.TwoThirdPrevoteBlockParts = nil + cs.ValidRound = -1 + cs.ValidBlock = nil + cs.ValidBlockParts = nil cs.Votes = cstypes.NewHeightVoteSet(state.ChainID, height, validators) cs.CommitRound = -1 cs.LastValidators = state.LastValidators @@ -1126,9 +1126,9 @@ func (cs *State) defaultDecideProposal(height int64, round int32) { var blockParts *types.PartSet // Decide on block - if cs.TwoThirdPrevoteBlock != nil { + if cs.ValidBlock != nil { // If there is valid block, choose that. - block, blockParts = cs.TwoThirdPrevoteBlock, cs.TwoThirdPrevoteBlockParts + block, blockParts = cs.ValidBlock, cs.ValidBlockParts } else { // Create a new proposal block from state/txs from the mempool. block, blockParts = cs.createProposalBlock() @@ -1145,7 +1145,7 @@ func (cs *State) defaultDecideProposal(height int64, round int32) { // Make proposal propBlockID := types.BlockID{Hash: block.Hash(), PartSetHeader: blockParts.Header()} - proposal := types.NewProposal(height, round, cs.TwoThirdPrevoteRound, propBlockID) + proposal := types.NewProposal(height, round, cs.ValidRound, propBlockID) p := proposal.ToProto() if err := cs.privValidator.SignProposal(cs.state.ChainID, p); err == nil { proposal.Signature = p.Signature @@ -1926,7 +1926,7 @@ func (cs *State) handleCompleteProposal(blockHeight int64) { // Update Valid* if we can. prevotes := cs.Votes.Prevotes(cs.Round) blockID, hasTwoThirds := prevotes.TwoThirdsMajority() - if hasTwoThirds && !blockID.IsZero() && (cs.TwoThirdPrevoteRound < cs.Round) { + if hasTwoThirds && !blockID.IsZero() && (cs.ValidRound < cs.Round) { if cs.ProposalBlock.HashesTo(blockID.Hash) { cs.Logger.Debug( "updating valid block to new proposal block", @@ -1934,9 +1934,9 @@ func (cs *State) handleCompleteProposal(blockHeight int64) { "valid_block_hash", log.NewLazyBlockHash(cs.ProposalBlock), ) - cs.TwoThirdPrevoteRound = cs.Round - cs.TwoThirdPrevoteBlock = cs.ProposalBlock - cs.TwoThirdPrevoteBlockParts = cs.ProposalBlockParts + cs.ValidRound = cs.Round + cs.ValidBlock = cs.ProposalBlock + cs.ValidBlockParts = cs.ProposalBlockParts } // TODO: In case there is +2/3 majority in Prevotes set for some // block and cs.ProposalBlock contains different block, either @@ -2096,12 +2096,12 @@ func (cs *State) addVote(vote *types.Vote, peerID p2p.ID) (added bool, err error // Update Valid* if we can. // NOTE: our proposal block may be nil or not what received a polka.. - if len(blockID.Hash) != 0 && (cs.TwoThirdPrevoteRound < vote.Round) && (vote.Round == cs.Round) { + if len(blockID.Hash) != 0 && (cs.ValidRound < vote.Round) && (vote.Round == cs.Round) { if cs.ProposalBlock.HashesTo(blockID.Hash) { - cs.Logger.Debug("updating valid block because of POL", "valid_round", cs.TwoThirdPrevoteRound, "pol_round", vote.Round) - cs.TwoThirdPrevoteRound = vote.Round - cs.TwoThirdPrevoteBlock = cs.ProposalBlock - cs.TwoThirdPrevoteBlockParts = cs.ProposalBlockParts + cs.Logger.Debug("updating valid block because of POL", "valid_round", cs.ValidRound, "pol_round", vote.Round) + cs.ValidRound = vote.Round + cs.ValidBlock = cs.ProposalBlock + cs.ValidBlockParts = cs.ProposalBlockParts } else { cs.Logger.Debug( "valid block we do not know about; set ProposalBlock=nil", diff --git a/consensus/state_test.go b/consensus/state_test.go index 8403f4950..1e3887fd9 100644 --- a/consensus/state_test.go +++ b/consensus/state_test.go @@ -1199,9 +1199,9 @@ func TestProposeValidBlock(t *testing.T) { rs = cs1.GetRoundState() assert.True(t, bytes.Equal(rs.ProposalBlock.Hash(), propBlockHash)) - assert.True(t, bytes.Equal(rs.ProposalBlock.Hash(), rs.TwoThirdPrevoteBlock.Hash())) - assert.True(t, rs.Proposal.POLRound == rs.TwoThirdPrevoteRound) - assert.True(t, bytes.Equal(rs.Proposal.BlockID.Hash, rs.TwoThirdPrevoteBlock.Hash())) + assert.True(t, bytes.Equal(rs.ProposalBlock.Hash(), rs.ValidBlock.Hash())) + assert.True(t, rs.Proposal.POLRound == rs.ValidRound) + assert.True(t, bytes.Equal(rs.Proposal.BlockID.Hash, rs.ValidBlock.Hash())) } // What we want: @@ -1249,9 +1249,9 @@ func TestSetValidBlockOnDelayedPrevote(t *testing.T) { rs = cs1.GetRoundState() - assert.True(t, rs.TwoThirdPrevoteBlock == nil) - assert.True(t, rs.TwoThirdPrevoteBlockParts == nil) - assert.True(t, rs.TwoThirdPrevoteRound == -1) + assert.True(t, rs.ValidBlock == nil) + assert.True(t, rs.ValidBlockParts == nil) + assert.True(t, rs.ValidRound == -1) // vs2 send (delayed) prevote for propBlock signAddVotes(cs1, tmproto.PrevoteType, propBlockHash, propBlockParts.Header(), vs4) @@ -1260,9 +1260,9 @@ func TestSetValidBlockOnDelayedPrevote(t *testing.T) { rs = cs1.GetRoundState() - assert.True(t, bytes.Equal(rs.TwoThirdPrevoteBlock.Hash(), propBlockHash)) - assert.True(t, rs.TwoThirdPrevoteBlockParts.Header().Equals(propBlockParts.Header())) - assert.True(t, rs.TwoThirdPrevoteRound == round) + assert.True(t, bytes.Equal(rs.ValidBlock.Hash(), propBlockHash)) + assert.True(t, rs.ValidBlockParts.Header().Equals(propBlockParts.Header())) + assert.True(t, rs.ValidRound == round) } // What we want: @@ -1316,9 +1316,9 @@ func TestSetValidBlockOnDelayedProposal(t *testing.T) { ensureNewProposal(proposalCh, height, round) rs := cs1.GetRoundState() - assert.True(t, bytes.Equal(rs.TwoThirdPrevoteBlock.Hash(), propBlockHash)) - assert.True(t, rs.TwoThirdPrevoteBlockParts.Header().Equals(propBlockParts.Header())) - assert.True(t, rs.TwoThirdPrevoteRound == round) + assert.True(t, bytes.Equal(rs.ValidBlock.Hash(), propBlockHash)) + assert.True(t, rs.ValidBlockParts.Header().Equals(propBlockParts.Header())) + assert.True(t, rs.ValidRound == round) } // 4 vals, 3 Nil Precommits at P0 diff --git a/consensus/types/round_state.go b/consensus/types/round_state.go index 3b11c2e17..7bdd1c101 100644 --- a/consensus/types/round_state.go +++ b/consensus/types/round_state.go @@ -80,12 +80,21 @@ type RoundState struct { LockedBlock *types.Block `json:"locked_block"` LockedBlockParts *types.PartSet `json:"locked_block_parts"` + // The variables below starting with "Valid..." derive their name from + // the algorithm presented in this paper: + // [The latest gossip on BFT consensus](https://arxiv.org/abs/1807.04938). + // Therefore, "Valid...": + // * means that the block or round that the variable refers to has + // received 2/3+ non-`nil` prevotes (a.k.a. a *polka*) + // * has nothing to do with whether the Application returned "Accept" in its + // response to `ProcessProposal`, or "Reject" + // Last known round with POL for non-nil valid block. - TwoThirdPrevoteRound int32 `json:"valid_round"` - TwoThirdPrevoteBlock *types.Block `json:"valid_block"` // Last known block of POL mentioned above. + ValidRound int32 `json:"valid_round"` + ValidBlock *types.Block `json:"valid_block"` // Last known block of POL mentioned above. // Last known block parts of POL mentioned above. - TwoThirdPrevoteBlockParts *types.PartSet `json:"valid_block_parts"` + ValidBlockParts *types.PartSet `json:"valid_block_parts"` Votes *HeightVoteSet `json:"votes"` CommitRound int32 `json:"commit_round"` // LastCommit *types.VoteSet `json:"last_commit"` // Last precommits at Height-1 @@ -119,7 +128,7 @@ func (rs *RoundState) RoundStateSimple() RoundStateSimple { StartTime: rs.StartTime, ProposalBlockHash: rs.ProposalBlock.Hash(), LockedBlockHash: rs.LockedBlock.Hash(), - ValidBlockHash: rs.TwoThirdPrevoteBlock.Hash(), + ValidBlockHash: rs.ValidBlock.Hash(), Votes: votesJSON, Proposer: types.ValidatorInfo{ Address: addr, @@ -186,8 +195,8 @@ func (rs *RoundState) StringIndented(indent string) string { %s ProposalBlock: %v %v %s LockedRound: %v %s LockedBlock: %v %v -%s TwoThirdPrevoteRound: %v -%s TwoThirdPrevoteBlock: %v %v +%s ValidRound: %v +%s ValidBlock: %v %v %s Votes: %v %s LastCommit: %v %s LastValidators:%v @@ -200,8 +209,8 @@ func (rs *RoundState) StringIndented(indent string) string { indent, rs.ProposalBlockParts.StringShort(), rs.ProposalBlock.StringShort(), indent, rs.LockedRound, indent, rs.LockedBlockParts.StringShort(), rs.LockedBlock.StringShort(), - indent, rs.TwoThirdPrevoteRound, - indent, rs.TwoThirdPrevoteBlockParts.StringShort(), rs.TwoThirdPrevoteBlock.StringShort(), + indent, rs.ValidRound, + indent, rs.ValidBlockParts.StringShort(), rs.ValidBlock.StringShort(), indent, rs.Votes.StringIndented(indent+" "), indent, rs.LastCommit.StringShort(), indent, rs.LastValidators.StringIndented(indent+" "),