-
Notifications
You must be signed in to change notification settings - Fork 199
/
blockSigningRater.go
100 lines (85 loc) · 3.53 KB
/
blockSigningRater.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
96
97
98
99
100
package rating
import (
"github.com/ElrondNetwork/elrond-go/core/check"
"github.com/ElrondNetwork/elrond-go/process"
"github.com/ElrondNetwork/elrond-go/process/economics"
"github.com/ElrondNetwork/elrond-go/sharding"
)
// BlockSigningRater defines the behaviour of a struct able to do ratings for validators
type BlockSigningRater struct {
sharding.RatingReader
startRating uint32
maxRating uint32
minRating uint32
proposerIncreaseRatingStep int32
proposerDecreaseRatingStep int32
validatorIncreaseRatingStep int32
validatorDecreaseRatingStep int32
}
//NewBlockSigningRater creates a new RaterHandler of Type BlockSigningRater
func NewBlockSigningRater(ratingsData *economics.RatingsData) (*BlockSigningRater, error) {
if ratingsData.MinRating() > ratingsData.MaxRating() {
return nil, process.ErrMaxRatingIsSmallerThanMinRating
}
if ratingsData.MaxRating() < ratingsData.StartRating() || ratingsData.MinRating() > ratingsData.StartRating() {
return nil, process.ErrStartRatingNotBetweenMinAndMax
}
return &BlockSigningRater{
startRating: ratingsData.StartRating(),
minRating: ratingsData.MinRating(),
maxRating: ratingsData.MaxRating(),
proposerIncreaseRatingStep: int32(ratingsData.ProposerIncreaseRatingStep()),
proposerDecreaseRatingStep: int32(0 - ratingsData.ProposerDecreaseRatingStep()),
validatorIncreaseRatingStep: int32(ratingsData.ValidatorIncreaseRatingStep()),
validatorDecreaseRatingStep: int32(0 - ratingsData.ValidatorDecreaseRatingStep()),
RatingReader: &NilRatingReader{},
}, nil
}
func (bsr *BlockSigningRater) computeRating(ratingStep int32, val uint32) uint32 {
newVal := int64(val) + int64(ratingStep)
if newVal < int64(bsr.minRating) {
return bsr.minRating
}
if newVal > int64(bsr.maxRating) {
return bsr.maxRating
}
return uint32(newVal)
}
//GetRating returns the Rating for the specified public key
func (bsr *BlockSigningRater) GetRating(pk string) uint32 {
return bsr.RatingReader.GetRating(pk)
}
//GetRatings gets all the ratings that the current rater has
func (bsr *BlockSigningRater) GetRatings(addresses []string) map[string]uint32 {
return bsr.RatingReader.GetRatings(addresses)
}
//SetRatingReader sets the Reader that can read ratings
func (bsr *BlockSigningRater) SetRatingReader(reader sharding.RatingReader) {
if !check.IfNil(reader) {
bsr.RatingReader = reader
}
}
//SetRatingReader sets the Reader that can read ratings
func (bsr *BlockSigningRater) IsInterfaceNil() bool {
return bsr == nil
}
//GetStartRating gets the StartingRating
func (bsr *BlockSigningRater) GetStartRating() uint32 {
return bsr.startRating
}
//ComputeIncreaseProposer computes the new rating for the increaseLeader
func (bsr *BlockSigningRater) ComputeIncreaseProposer(val uint32) uint32 {
return bsr.computeRating(bsr.proposerIncreaseRatingStep, val)
}
//ComputeDecreaseProposer computes the new rating for the decreaseLeader
func (bsr *BlockSigningRater) ComputeDecreaseProposer(val uint32) uint32 {
return bsr.computeRating(bsr.proposerDecreaseRatingStep, val)
}
//ComputeIncreaseValidator computes the new rating for the increaseValidator
func (bsr *BlockSigningRater) ComputeIncreaseValidator(val uint32) uint32 {
return bsr.computeRating(bsr.validatorIncreaseRatingStep, val)
}
//ComputeDecreaseValidator computes the new rating for the decreaseValidator
func (bsr *BlockSigningRater) ComputeDecreaseValidator(val uint32) uint32 {
return bsr.computeRating(bsr.validatorDecreaseRatingStep, val)
}