diff --git a/consensus/state.go b/consensus/state.go index 015c3b513cd..edab0a5971d 100644 --- a/consensus/state.go +++ b/consensus/state.go @@ -1461,20 +1461,26 @@ func (cs *ConsensusState) finalizeCommit(height int64) { func (cs *ConsensusState) recordMetrics(height int64, block *types.Block) { cs.metrics.Validators.Set(float64(cs.Validators.Size())) cs.metrics.ValidatorsPower.Set(float64(cs.Validators.TotalVotingPower())) - missingValidators := 0 - missingValidatorsPower := int64(0) - for i, val := range cs.Validators.Validators { - if i >= len(block.LastCommit.Signatures) { - break - } - commitSig := block.LastCommit.Signatures[i] - if commitSig.Absent() { - missingValidators++ - missingValidatorsPower += val.VotingPower + + var ( + missingValidators int + missingValidatorsPower int64 + ) + // height=0 -> MissingValidators and MissingValidatorsPower are both 0. + // Remember that the first LastCommit is intentionally empty, so it's not + // fair to increment missing validators number. + if height > 1 { + for i, val := range cs.Validators.Validators { + commitSig := block.LastCommit.Signatures[i] + if commitSig.Absent() { + missingValidators++ + missingValidatorsPower += val.VotingPower + } } } cs.metrics.MissingValidators.Set(float64(missingValidators)) cs.metrics.MissingValidatorsPower.Set(float64(missingValidatorsPower)) + cs.metrics.ByzantineValidators.Set(float64(len(block.Evidence.Evidence))) byzantineValidatorsPower := int64(0) for _, ev := range block.Evidence.Evidence { diff --git a/state/execution.go b/state/execution.go index 1db51590955..3848d2a5c1d 100644 --- a/state/execution.go +++ b/state/execution.go @@ -332,16 +332,17 @@ func getBeginBlockValidatorInfo(block *types.Block, stateDB dbm.DB) (abci.LastCo lastValSet = types.NewValidatorSet(nil) } - for i, val := range lastValSet.Validators { - if i >= len(block.LastCommit.Signatures) { - break - } - commitSig := block.LastCommit.Signatures[i] - voteInfo := abci.VoteInfo{ - Validator: types.TM2PB.Validator(val), - SignedLastBlock: !commitSig.Absent(), + // block.Height=1 -> LastCommitInfo.Votes are empty. + // Remember that the first LastCommit is intentionally empty, so it makes + // sense for LastCommitInfo.Votes to also be empty. + if block.Height > 1 { + for i, val := range lastValSet.Validators { + commitSig := block.LastCommit.Signatures[i] + voteInfos[i] = abci.VoteInfo{ + Validator: types.TM2PB.Validator(val), + SignedLastBlock: !commitSig.Absent(), + } } - voteInfos[i] = voteInfo } for i, ev := range block.Evidence.Evidence {