commit inicial do projeto
This commit is contained in:
64
internal/consensus/validator_set.go
Normal file
64
internal/consensus/validator_set.go
Normal file
@ -0,0 +1,64 @@
|
||||
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
|
||||
}
|
||||
Reference in New Issue
Block a user