64 lines
1.3 KiB
Go
64 lines
1.3 KiB
Go
package consensus
|
|
|
|
import (
|
|
"dejo_node/internal/staking"
|
|
"sort"
|
|
)
|
|
|
|
type Validator struct {
|
|
Address string
|
|
Stake uint64
|
|
}
|
|
|
|
type ValidatorSet struct {
|
|
Validators []Validator
|
|
IndexMap map[string]int
|
|
}
|
|
|
|
func NewValidatorSetFromStaking(store *staking.StakingStore, minStake uint64) *ValidatorSet {
|
|
vals := []Validator{}
|
|
storeSnapshot := store.Snapshot()
|
|
for addr, entry := range storeSnapshot {
|
|
if entry.Amount >= minStake {
|
|
vals = append(vals, Validator{Address: addr, Stake: entry.Amount})
|
|
}
|
|
}
|
|
|
|
sort.Slice(vals, func(i, j int) bool {
|
|
return vals[i].Stake > vals[j].Stake
|
|
})
|
|
idx := make(map[string]int)
|
|
for i, v := range vals {
|
|
idx[v.Address] = i
|
|
}
|
|
return &ValidatorSet{Validators: vals, IndexMap: idx}
|
|
}
|
|
|
|
func (vs *ValidatorSet) SelectProposer(height uint64) *Validator {
|
|
if len(vs.Validators) == 0 {
|
|
return nil
|
|
}
|
|
index := int(height % uint64(len(vs.Validators)))
|
|
return &vs.Validators[index]
|
|
}
|
|
|
|
func (vs *ValidatorSet) IsValidator(address string) bool {
|
|
_, ok := vs.IndexMap[address]
|
|
return ok
|
|
}
|
|
|
|
func (vs *ValidatorSet) TotalStake() uint64 {
|
|
sum := uint64(0)
|
|
for _, v := range vs.Validators {
|
|
sum += v.Stake
|
|
}
|
|
return sum
|
|
}
|
|
|
|
func (vs *ValidatorSet) ValidatorByAddress(addr string) (Validator, bool) {
|
|
i, ok := vs.IndexMap[addr]
|
|
if !ok {
|
|
return Validator{}, false
|
|
}
|
|
return vs.Validators[i], true
|
|
} |