Files
dejo-node/internal/consensus/validator_set.go
2025-05-23 10:44:32 -03:00

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
}