From 2c125b6c78ad23f09b4fa6aa382f01e0f09ff23f Mon Sep 17 00:00:00 2001 From: Zarko Milosevic Date: Tue, 17 Apr 2018 15:43:40 +0200 Subject: [PATCH] Fix validValue rule --- benchmarks/codec_test.go | 2 +- cmd/tendermint/commands/show_node_id.go | 1 - cmd/tendermint/commands/show_validator.go | 1 + consensus/state.go | 20 ++++++++++++++++++-- rpc/client/helpers_test.go | 2 +- types/genesis_test.go | 3 ++- 6 files changed, 23 insertions(+), 6 deletions(-) diff --git a/benchmarks/codec_test.go b/benchmarks/codec_test.go index d8e4bc82..9acafce7 100644 --- a/benchmarks/codec_test.go +++ b/benchmarks/codec_test.go @@ -32,7 +32,7 @@ func BenchmarkEncodeStatusWire(b *testing.B) { LatestBlockTime: time.Unix(0, 1234), }, ValidatorInfo: ctypes.ValidatorInfo{ - PubKey: nodeKey.PubKey(), + PubKey: nodeKey.PubKey(), }, } b.StartTimer() diff --git a/cmd/tendermint/commands/show_node_id.go b/cmd/tendermint/commands/show_node_id.go index 1d94933e..02ab1a9b 100644 --- a/cmd/tendermint/commands/show_node_id.go +++ b/cmd/tendermint/commands/show_node_id.go @@ -6,7 +6,6 @@ import ( "github.com/spf13/cobra" "github.com/tendermint/tendermint/p2p" - ) // ShowNodeIDCmd dumps node's ID to the standard output. diff --git a/cmd/tendermint/commands/show_validator.go b/cmd/tendermint/commands/show_validator.go index 6ead4bad..b354683b 100644 --- a/cmd/tendermint/commands/show_validator.go +++ b/cmd/tendermint/commands/show_validator.go @@ -2,6 +2,7 @@ package commands import ( "fmt" + "github.com/spf13/cobra" privval "github.com/tendermint/tendermint/types/priv_validator" diff --git a/consensus/state.go b/consensus/state.go index 4450c74e..b8d741fb 100644 --- a/consensus/state.go +++ b/consensus/state.go @@ -1316,6 +1316,22 @@ func (cs *ConsensusState) addProposalBlockPart(height int64, part *types.Part, v } // NOTE: it's possible to receive complete proposal blocks for future rounds without having the proposal cs.Logger.Info("Received complete proposal block", "height", cs.ProposalBlock.Height, "hash", cs.ProposalBlock.Hash()) + + // Update ValidBlock + prevotes := cs.Votes.Prevotes(cs.Round) + blockID, ok := prevotes.TwoThirdsMajority() + if ok && !blockID.IsZero() && (cs.ValidRound < cs.Round) { + // update valid value + if !cs.ValidBlock.HashesTo(blockID.Hash) && cs.ProposalBlock.HashesTo(blockID.Hash) { + 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 proposer is faulty or voting power of faulty processes is more than 1/3. We should + //trigger in the future accountability procedure at this point. + } + if cs.Step == cstypes.RoundStepPropose && cs.isProposalComplete() { // Move onto the next step cs.enterPrevote(height, cs.Round) @@ -1422,9 +1438,9 @@ func (cs *ConsensusState) addVote(vote *types.Vote, peerID p2p.ID) (added bool, } } // Update ValidBlock - if ok && !blockID.IsZero() && !cs.ValidBlock.HashesTo(blockID.Hash) && vote.Round > cs.ValidRound { + if ok && !blockID.IsZero() && (cs.ValidRound < vote.Round) && (vote.Round <= cs.Round) { // update valid value - if cs.ProposalBlock.HashesTo(blockID.Hash) { + if !cs.ValidBlock.HashesTo(blockID.Hash) && cs.ProposalBlock.HashesTo(blockID.Hash) { cs.ValidRound = vote.Round cs.ValidBlock = cs.ProposalBlock cs.ValidBlockParts = cs.ProposalBlockParts diff --git a/rpc/client/helpers_test.go b/rpc/client/helpers_test.go index d5c31dda..8b843fcd 100644 --- a/rpc/client/helpers_test.go +++ b/rpc/client/helpers_test.go @@ -32,7 +32,7 @@ func TestWaitForHeight(t *testing.T) { // now set current block height to 10 m.Call = mock.Call{ - Response: &ctypes.ResultStatus{SyncInfo: ctypes.SyncInfo{LatestBlockHeight: 10} }, + Response: &ctypes.ResultStatus{SyncInfo: ctypes.SyncInfo{LatestBlockHeight: 10}}, } // we will not wait for more than 10 blocks diff --git a/types/genesis_test.go b/types/genesis_test.go index 17ebf1cf..bed4b90f 100644 --- a/types/genesis_test.go +++ b/types/genesis_test.go @@ -1,9 +1,10 @@ package types import ( + "testing" + "github.com/stretchr/testify/assert" "github.com/tendermint/go-crypto" - "testing" ) func TestGenesisBad(t *testing.T) {