diff --git a/consensus/bor/validator.go b/consensus/bor/validator.go index 1d12666138b3c18e570263cf89819e18215e0109..dab50e7b2c7eb9efa83d5fbb535d08b36c3e9ced 100644 --- a/consensus/bor/validator.go +++ b/consensus/bor/validator.go @@ -29,18 +29,23 @@ func NewValidator(address common.Address, votingPower int64) *Validator { } } -// Creates a new copy of the validator so we can mutate ProposerPriority. +// Copy creates a new copy of the validator so we can mutate ProposerPriority. // Panics if the validator is nil. func (v *Validator) Copy() *Validator { vCopy := *v return &vCopy } -// Returns the one with higher ProposerPriority. -func (v *Validator) CompareProposerPriority(other *Validator) *Validator { +// Cmp returns the one validator with a higher ProposerPriority. +// If ProposerPriority is same, it returns the validator with lexicographically smaller address +func (v *Validator) Cmp(other *Validator) *Validator { + // if both of v and other are nil, nil will be returned and that could possibly lead to nil pointer dereference bubbling up the stack if v == nil { return other } + if other == nil { + return v + } if v.ProposerPriority > other.ProposerPriority { return v } else if v.ProposerPriority < other.ProposerPriority { @@ -53,7 +58,6 @@ func (v *Validator) CompareProposerPriority(other *Validator) *Validator { return other } else { panic("Cannot compare identical validators") - return nil } } } diff --git a/consensus/bor/validator_set.go b/consensus/bor/validator_set.go index 2f22d5b59f389460c62a95a93b44ba0aba0bee7f..89e0c16b136968909723e8713e4aef22bbccea5c 100644 --- a/consensus/bor/validator_set.go +++ b/consensus/bor/validator_set.go @@ -182,7 +182,7 @@ func computeMaxMinPriorityDiff(vals *ValidatorSet) int64 { func (vals *ValidatorSet) getValWithMostPriority() *Validator { var res *Validator for _, val := range vals.Validators { - res = res.CompareProposerPriority(val) + res = res.Cmp(val) } return res } @@ -298,7 +298,7 @@ func (vals *ValidatorSet) findProposer() *Validator { var proposer *Validator for _, val := range vals.Validators { if proposer == nil || !bytes.Equal(val.Address.Bytes(), proposer.Address.Bytes()) { - proposer = proposer.CompareProposerPriority(val) + proposer = proposer.Cmp(val) } } return proposer