/
state_validator.go
95 lines (72 loc) · 1.79 KB
/
state_validator.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
package state
import (
"io"
"fmt"
"github.com/MinterTeam/minter-go-node/core/types"
"github.com/MinterTeam/minter-go-node/rlp"
"github.com/tendermint/tendermint/crypto/ed25519"
"math/big"
)
// stateValidators represents a validators which is being modified.
type stateValidators struct {
data Validators
db *StateDB
onDirty func() // Callback method to mark a state object newly dirty
}
type Validators []Validator
func (c *stateValidators) Data() Validators {
return c.data
}
type Validator struct {
RewardAddress types.Address
TotalBipStake *big.Int
PubKey types.Pubkey
Commission uint
AccumReward *big.Int
AbsentTimes *types.BitArray
tmAddress *[20]byte
toDrop bool
}
func (validator *Validator) CountAbsentTimes() int {
count := 0
for i := 0; i < ValidatorMaxAbsentWindow; i++ {
if validator.AbsentTimes.GetIndex(i) {
count++
}
}
return count
}
func (validator *Validator) IsToDrop() bool {
return validator.toDrop
}
func (validator Validator) GetAddress() [20]byte {
if validator.tmAddress != nil {
return *validator.tmAddress
}
var pubkey ed25519.PubKeyEd25519
copy(pubkey[:], validator.PubKey)
var address [20]byte
copy(address[:], pubkey.Address().Bytes())
validator.tmAddress = &address
return address
}
func (validator Validator) String() string {
return fmt.Sprintf("Validator")
}
// newValidator creates a state object.
func newValidator(db *StateDB, data Validators, onDirty func()) *stateValidators {
validators := &stateValidators{
db: db,
data: data,
onDirty: onDirty,
}
validators.onDirty()
return validators
}
// EncodeRLP implements rlp.Encoder.
func (c *stateValidators) EncodeRLP(w io.Writer) error {
return rlp.Encode(w, c.data)
}
func (c *stateValidators) SetData(validators Validators) {
c.data = validators
}