|
@ -83,6 +83,8 @@ func (valSet *ValidatorSet) Copy() *ValidatorSet { |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// HasAddress returns true if address given is in the validator set, false -
|
|
|
|
|
|
// otherwise.
|
|
|
func (valSet *ValidatorSet) HasAddress(address []byte) bool { |
|
|
func (valSet *ValidatorSet) HasAddress(address []byte) bool { |
|
|
idx := sort.Search(len(valSet.Validators), func(i int) bool { |
|
|
idx := sort.Search(len(valSet.Validators), func(i int) bool { |
|
|
return bytes.Compare(address, valSet.Validators[i].Address) <= 0 |
|
|
return bytes.Compare(address, valSet.Validators[i].Address) <= 0 |
|
@ -96,16 +98,16 @@ func (valSet *ValidatorSet) GetByAddress(address []byte) (index int, val *Valida |
|
|
idx := sort.Search(len(valSet.Validators), func(i int) bool { |
|
|
idx := sort.Search(len(valSet.Validators), func(i int) bool { |
|
|
return bytes.Compare(address, valSet.Validators[i].Address) <= 0 |
|
|
return bytes.Compare(address, valSet.Validators[i].Address) <= 0 |
|
|
}) |
|
|
}) |
|
|
if idx != len(valSet.Validators) && bytes.Equal(valSet.Validators[idx].Address, address) { |
|
|
|
|
|
|
|
|
if idx < len(valSet.Validators) && bytes.Equal(valSet.Validators[idx].Address, address) { |
|
|
return idx, valSet.Validators[idx].Copy() |
|
|
return idx, valSet.Validators[idx].Copy() |
|
|
} else { |
|
|
} else { |
|
|
return -1, nil |
|
|
return -1, nil |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
// GetByIndex returns the validator by index.
|
|
|
|
|
|
// It returns nil values if index < 0 or
|
|
|
|
|
|
// index >= len(ValidatorSet.Validators)
|
|
|
|
|
|
|
|
|
// GetByIndex returns the validator's address and validator itself by index.
|
|
|
|
|
|
// It returns nil values if index is less than 0 or greater or equal to
|
|
|
|
|
|
// len(ValidatorSet.Validators).
|
|
|
func (valSet *ValidatorSet) GetByIndex(index int) (address []byte, val *Validator) { |
|
|
func (valSet *ValidatorSet) GetByIndex(index int) (address []byte, val *Validator) { |
|
|
if index < 0 || index >= len(valSet.Validators) { |
|
|
if index < 0 || index >= len(valSet.Validators) { |
|
|
return nil, nil |
|
|
return nil, nil |
|
@ -114,10 +116,12 @@ func (valSet *ValidatorSet) GetByIndex(index int) (address []byte, val *Validato |
|
|
return val.Address, val.Copy() |
|
|
return val.Address, val.Copy() |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// Size returns the length of the validator set.
|
|
|
func (valSet *ValidatorSet) Size() int { |
|
|
func (valSet *ValidatorSet) Size() int { |
|
|
return len(valSet.Validators) |
|
|
return len(valSet.Validators) |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// TotalVotingPower returns the sum of the voting powers of all validators.
|
|
|
func (valSet *ValidatorSet) TotalVotingPower() int64 { |
|
|
func (valSet *ValidatorSet) TotalVotingPower() int64 { |
|
|
if valSet.totalVotingPower == 0 { |
|
|
if valSet.totalVotingPower == 0 { |
|
|
for _, val := range valSet.Validators { |
|
|
for _, val := range valSet.Validators { |
|
@ -128,6 +132,8 @@ func (valSet *ValidatorSet) TotalVotingPower() int64 { |
|
|
return valSet.totalVotingPower |
|
|
return valSet.totalVotingPower |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// GetProposer returns the current proposer. If the validator set is empty, nil
|
|
|
|
|
|
// is returned.
|
|
|
func (valSet *ValidatorSet) GetProposer() (proposer *Validator) { |
|
|
func (valSet *ValidatorSet) GetProposer() (proposer *Validator) { |
|
|
if len(valSet.Validators) == 0 { |
|
|
if len(valSet.Validators) == 0 { |
|
|
return nil |
|
|
return nil |
|
@ -148,6 +154,8 @@ func (valSet *ValidatorSet) findProposer() *Validator { |
|
|
return proposer |
|
|
return proposer |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// Hash returns the Merkle root hash build using validators (as leaves) in the
|
|
|
|
|
|
// set.
|
|
|
func (valSet *ValidatorSet) Hash() []byte { |
|
|
func (valSet *ValidatorSet) Hash() []byte { |
|
|
if len(valSet.Validators) == 0 { |
|
|
if len(valSet.Validators) == 0 { |
|
|
return nil |
|
|
return nil |
|
@ -159,6 +167,8 @@ func (valSet *ValidatorSet) Hash() []byte { |
|
|
return merkle.SimpleHashFromHashers(hashers) |
|
|
return merkle.SimpleHashFromHashers(hashers) |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// Add adds val to the validator set and returns true. It returns false if val
|
|
|
|
|
|
// is already in the set.
|
|
|
func (valSet *ValidatorSet) Add(val *Validator) (added bool) { |
|
|
func (valSet *ValidatorSet) Add(val *Validator) (added bool) { |
|
|
val = val.Copy() |
|
|
val = val.Copy() |
|
|
idx := sort.Search(len(valSet.Validators), func(i int) bool { |
|
|
idx := sort.Search(len(valSet.Validators), func(i int) bool { |
|
@ -185,6 +195,8 @@ func (valSet *ValidatorSet) Add(val *Validator) (added bool) { |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// Update updates val and returns true. It returns false if val is not present
|
|
|
|
|
|
// in the set.
|
|
|
func (valSet *ValidatorSet) Update(val *Validator) (updated bool) { |
|
|
func (valSet *ValidatorSet) Update(val *Validator) (updated bool) { |
|
|
index, sameVal := valSet.GetByAddress(val.Address) |
|
|
index, sameVal := valSet.GetByAddress(val.Address) |
|
|
if sameVal == nil { |
|
|
if sameVal == nil { |
|
@ -197,6 +209,8 @@ func (valSet *ValidatorSet) Update(val *Validator) (updated bool) { |
|
|
return true |
|
|
return true |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// Remove deletes the validator with address. It returns the validator removed
|
|
|
|
|
|
// and true. If returns nil and false if validator is not present in the set.
|
|
|
func (valSet *ValidatorSet) Remove(address []byte) (val *Validator, removed bool) { |
|
|
func (valSet *ValidatorSet) Remove(address []byte) (val *Validator, removed bool) { |
|
|
idx := sort.Search(len(valSet.Validators), func(i int) bool { |
|
|
idx := sort.Search(len(valSet.Validators), func(i int) bool { |
|
|
return bytes.Compare(address, valSet.Validators[i].Address) <= 0 |
|
|
return bytes.Compare(address, valSet.Validators[i].Address) <= 0 |
|
@ -216,6 +230,7 @@ func (valSet *ValidatorSet) Remove(address []byte) (val *Validator, removed bool |
|
|
return removedVal, true |
|
|
return removedVal, true |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// Iterate will run the given function over the set.
|
|
|
func (valSet *ValidatorSet) Iterate(fn func(index int, val *Validator) bool) { |
|
|
func (valSet *ValidatorSet) Iterate(fn func(index int, val *Validator) bool) { |
|
|
for i, val := range valSet.Validators { |
|
|
for i, val := range valSet.Validators { |
|
|
stop := fn(i, val.Copy()) |
|
|
stop := fn(i, val.Copy()) |
|
|