Skip to content

Commit

Permalink
FEAT: Move all files on new branch
Browse files Browse the repository at this point in the history
  • Loading branch information
mariusmihaic committed Mar 16, 2022
1 parent 4fddf7b commit 40715e9
Show file tree
Hide file tree
Showing 4 changed files with 627 additions and 0 deletions.
62 changes: 62 additions & 0 deletions state/interface.go
Original file line number Diff line number Diff line change
Expand Up @@ -182,3 +182,65 @@ type StoragePruningManager interface {
Close() error
IsInterfaceNil() bool
}

// ShardValidatorsInfoMapHandler shall be used to manage operations inside
// a <shardID, []ValidatorInfoHandler> map in a concurrent-safe way.
type ShardValidatorsInfoMapHandler interface {
GetShardValidatorsInfoMap() map[uint32][]ValidatorInfoHandler
GetAllValidatorsInfo() []ValidatorInfoHandler
GetValidator(blsKey []byte) ValidatorInfoHandler

Add(validator ValidatorInfoHandler)
Delete(validator ValidatorInfoHandler)
Replace(old ValidatorInfoHandler, new ValidatorInfoHandler)
SetValidatorsInShard(shardID uint32, validators []ValidatorInfoHandler)

GetValInfoPointerMap() map[uint32][]*ValidatorInfo
}

//ValidatorInfoHandler defines which data shall a validator info hold.
type ValidatorInfoHandler interface {
IsInterfaceNil() bool

GetPublicKey() []byte
GetShardId() uint32
GetList() string
GetIndex() uint32
GetTempRating() uint32
GetRating() uint32
GetRatingModifier() float32
GetRewardAddress() []byte
GetLeaderSuccess() uint32
GetLeaderFailure() uint32
GetValidatorSuccess() uint32
GetValidatorFailure() uint32
GetValidatorIgnoredSignatures() uint32
GetNumSelectedInSuccessBlocks() uint32
GetAccumulatedFees() *big.Int
GetTotalLeaderSuccess() uint32
GetTotalLeaderFailure() uint32
GetTotalValidatorSuccess() uint32
GetTotalValidatorFailure() uint32
GetTotalValidatorIgnoredSignatures() uint32

SetPublicKey(publicKey []byte)
SetShardId(shardID uint32)
SetList(list string)
SetIndex(index uint32)
SetTempRating(tempRating uint32)
SetRating(rating uint32)
SetRatingModifier(ratingModifier float32)
SetRewardAddress(rewardAddress []byte)
SetLeaderSuccess(leaderSuccess uint32)
SetLeaderFailure(leaderFailure uint32)
SetValidatorSuccess(validatorSuccess uint32)
SetValidatorFailure(validatorFailure uint32)
SetValidatorIgnoredSignatures(validatorIgnoredSignatures uint32)
SetNumSelectedInSuccessBlocks(numSelectedInSuccessBlock uint32)
SetAccumulatedFees(accumulatedFees *big.Int)
SetTotalLeaderSuccess(totalLeaderSuccess uint32)
SetTotalLeaderFailure(totalLeaderFailure uint32)
SetTotalValidatorSuccess(totalValidatorSuccess uint32)
SetTotalValidatorFailure(totalValidatorFailure uint32)
SetTotalValidatorIgnoredSignatures(totalValidatorIgnoredSignatures uint32)
}
102 changes: 102 additions & 0 deletions state/validatorInfo.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,113 @@

package state

import mathbig "math/big"

// IsInterfaceNil returns true if there is no value under the interface
func (vi *ValidatorInfo) IsInterfaceNil() bool {
return vi == nil
}

// SetPublicKey sets validator's public key
func (vi *ValidatorInfo) SetPublicKey(publicKey []byte) {
vi.PublicKey = publicKey
}

// SetList sets validator's list
func (vi *ValidatorInfo) SetList(list string) {
vi.List = list
}

// SetShardId sets validator's public shard id
func (vi *ValidatorInfo) SetShardId(shardID uint32) {
vi.ShardId = shardID
}

// SetIndex sets validator's index
func (vi *ValidatorInfo) SetIndex(index uint32) {
vi.Index = index
}

// SetTempRating sets validator's temp rating
func (vi *ValidatorInfo) SetTempRating(tempRating uint32) {
vi.TempRating = tempRating
}

// SetRating sets validator's rating
func (vi *ValidatorInfo) SetRating(rating uint32) {
vi.Rating = rating
}

// SetRatingModifier sets validator's rating modifier
func (vi *ValidatorInfo) SetRatingModifier(ratingModifier float32) {
vi.RatingModifier = ratingModifier
}

// SetRewardAddress sets validator's reward address
func (vi *ValidatorInfo) SetRewardAddress(rewardAddress []byte) {
vi.RewardAddress = rewardAddress
}

// SetLeaderSuccess sets leader success
func (vi *ValidatorInfo) SetLeaderSuccess(leaderSuccess uint32) {
vi.LeaderSuccess = leaderSuccess
}

// SetLeaderFailure sets validator's leader failure
func (vi *ValidatorInfo) SetLeaderFailure(leaderFailure uint32) {
vi.LeaderFailure = leaderFailure
}

// SetValidatorSuccess sets validator's success
func (vi *ValidatorInfo) SetValidatorSuccess(validatorSuccess uint32) {
vi.ValidatorSuccess = validatorSuccess
}

// SetValidatorFailure sets validator's failure
func (vi *ValidatorInfo) SetValidatorFailure(validatorFailure uint32) {
vi.ValidatorFailure = validatorFailure
}

// SetValidatorIgnoredSignatures sets validator's ignored signatures
func (vi *ValidatorInfo) SetValidatorIgnoredSignatures(validatorIgnoredSignatures uint32) {
vi.ValidatorIgnoredSignatures = validatorIgnoredSignatures
}

// SetNumSelectedInSuccessBlocks sets validator's num of selected in success block
func (vi *ValidatorInfo) SetNumSelectedInSuccessBlocks(numSelectedInSuccessBlock uint32) {
vi.NumSelectedInSuccessBlocks = numSelectedInSuccessBlock
}

// SetAccumulatedFees sets validator's accumulated fees
func (vi *ValidatorInfo) SetAccumulatedFees(accumulatedFees *mathbig.Int) {
vi.AccumulatedFees = mathbig.NewInt(0).Set(accumulatedFees)
}

// SetTotalLeaderSuccess sets validator's total leader success
func (vi *ValidatorInfo) SetTotalLeaderSuccess(totalLeaderSuccess uint32) {
vi.TotalLeaderSuccess = totalLeaderSuccess
}

// SetTotalLeaderFailure sets validator's total leader failure
func (vi *ValidatorInfo) SetTotalLeaderFailure(totalLeaderFailure uint32) {
vi.TotalLeaderFailure = totalLeaderFailure
}

// SetTotalValidatorSuccess sets validator's total success
func (vi *ValidatorInfo) SetTotalValidatorSuccess(totalValidatorSuccess uint32) {
vi.TotalValidatorSuccess = totalValidatorSuccess
}

// SetTotalValidatorFailure sets validator's total failure
func (vi *ValidatorInfo) SetTotalValidatorFailure(totalValidatorFailure uint32) {
vi.TotalValidatorFailure = totalValidatorFailure
}

// SetTotalValidatorIgnoredSignatures sets validator's total ignored signatures
func (vi *ValidatorInfo) SetTotalValidatorIgnoredSignatures(totalValidatorIgnoredSignatures uint32) {
vi.TotalValidatorIgnoredSignatures = totalValidatorIgnoredSignatures
}

// IsInterfaceNil returns true if there is no value under the interface
func (svi *ShardValidatorInfo) IsInterfaceNil() bool {
return svi == nil
Expand Down
183 changes: 183 additions & 0 deletions state/validatorsInfoMap.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,183 @@
package state

import (
"bytes"
"sync"
)

type shardValidatorsInfoMap struct {
mutex sync.RWMutex
valInfoMap map[uint32][]ValidatorInfoHandler
}

// NewShardValidatorsInfoMap creates an instance of shardValidatorsInfoMap which manages a
// <shardID, validatorsInfo> map internally
func NewShardValidatorsInfoMap(numOfShards uint32) *shardValidatorsInfoMap {
return &shardValidatorsInfoMap{
mutex: sync.RWMutex{},
valInfoMap: make(map[uint32][]ValidatorInfoHandler, numOfShards),
}
}

// TODO: Delete this once map[uint32][]*ValidatorInfo is completely replaced with new interface

// CreateShardValidatorsMap creates an instance of shardValidatorsInfoMap which manages a shard validator
// info map internally.
func CreateShardValidatorsMap(input map[uint32][]*ValidatorInfo) *shardValidatorsInfoMap {
ret := &shardValidatorsInfoMap{valInfoMap: make(map[uint32][]ValidatorInfoHandler, len(input))}

for shardID, valInShard := range input {
for _, val := range valInShard {
ret.valInfoMap[shardID] = append(ret.valInfoMap[shardID], val)
}
}

return ret
}

// GetAllValidatorsInfo returns a ValidatorInfoHandler copy slice with validators from all shards.
func (vi *shardValidatorsInfoMap) GetAllValidatorsInfo() []ValidatorInfoHandler {
ret := make([]ValidatorInfoHandler, 0)

vi.mutex.RLock()
validatorsMapCopy := vi.valInfoMap
vi.mutex.RUnlock()

for _, validatorsInShard := range validatorsMapCopy {
validatorsCopy := make([]ValidatorInfoHandler, len(validatorsInShard))
copy(validatorsCopy, validatorsInShard)
ret = append(ret, validatorsCopy...)
}

return ret
}

// GetShardValidatorsInfoMap returns a <shard, ValidatorInfoHandler> copy map of internally stored data
func (vi *shardValidatorsInfoMap) GetShardValidatorsInfoMap() map[uint32][]ValidatorInfoHandler {
ret := make(map[uint32][]ValidatorInfoHandler, 0)

vi.mutex.RLock()
validatorsMapCopy := vi.valInfoMap
vi.mutex.RUnlock()

for shardID, valInShard := range validatorsMapCopy {
validatorsCopy := make([]ValidatorInfoHandler, len(valInShard))
copy(validatorsCopy, valInShard)
ret[shardID] = validatorsCopy
}

return ret
}

// Add adds a new ValidatorInfoHandler in its corresponding shardID, if it doesn't already exists
func (vi *shardValidatorsInfoMap) Add(validator ValidatorInfoHandler) {
if vi.GetValidator(validator.GetPublicKey()) != nil {
return
}

shardID := validator.GetShardId()

vi.mutex.Lock()
vi.valInfoMap[shardID] = append(vi.valInfoMap[shardID], validator)
vi.mutex.Unlock()
}

// GetValidator returns a ValidatorInfoHandler with the provided blsKey, if it is present in the map
func (vi *shardValidatorsInfoMap) GetValidator(blsKey []byte) ValidatorInfoHandler {
for _, validator := range vi.GetAllValidatorsInfo() {
if bytes.Equal(validator.GetPublicKey(), blsKey) {
return validator
}
}

return nil
}

// Replace will replace an existing ValidatorInfoHandler with a new one. The old and new validator
// shall be in the same shard and have the same public key.
func (vi *shardValidatorsInfoMap) Replace(old ValidatorInfoHandler, new ValidatorInfoHandler) {
if old.GetShardId() != new.GetShardId() {
return
}

shardID := old.GetShardId()

vi.mutex.Lock()
defer vi.mutex.Unlock()

for idx, validator := range vi.valInfoMap[shardID] {
if bytes.Equal(validator.GetPublicKey(), old.GetPublicKey()) {
vi.valInfoMap[shardID][idx] = new
break
}
}
}

// SetValidatorsInShard resets all validators saved in a specific shard with the provided []ValidatorInfoHandler.
// Before setting them, it checks that provided validators have the same shardID as the one provided.
func (vi *shardValidatorsInfoMap) SetValidatorsInShard(shardID uint32, validators []ValidatorInfoHandler) {
sameShardValidators := make([]ValidatorInfoHandler, 0, len(validators))
for _, validator := range validators {
if validator.GetShardId() == shardID {
sameShardValidators = append(sameShardValidators, validator)
}
}

vi.mutex.Lock()
vi.valInfoMap[shardID] = sameShardValidators
vi.mutex.Unlock()
}

// Delete will delete the provided validator from the internally stored map. The validators slice at the
// corresponding shardID key will be re-sliced, without reordering
func (vi *shardValidatorsInfoMap) Delete(validator ValidatorInfoHandler) {
shardID := validator.GetShardId()

vi.mutex.Lock()
defer vi.mutex.Unlock()

for index, validatorInfo := range vi.valInfoMap[shardID] {
if bytes.Equal(validatorInfo.GetPublicKey(), validator.GetPublicKey()) {
length := len(vi.valInfoMap[shardID])
vi.valInfoMap[shardID][index] = vi.valInfoMap[shardID][length-1]
vi.valInfoMap[shardID][length-1] = nil
vi.valInfoMap[shardID] = vi.valInfoMap[shardID][:length-1]
break
}
}
}

// TODO: Delete this once map[uint32][]*ValidatorInfo is completely replaced with new interface

// GetValInfoPointerMap returns a <shardID, []validators> from internally stored data
func (vi *shardValidatorsInfoMap) GetValInfoPointerMap() map[uint32][]*ValidatorInfo {
ret := make(map[uint32][]*ValidatorInfo, 0)

for shardID, valInShard := range vi.valInfoMap {
for _, val := range valInShard {
ret[shardID] = append(ret[shardID], &ValidatorInfo{
PublicKey: val.GetPublicKey(),
ShardId: val.GetShardId(),
List: val.GetList(),
Index: val.GetIndex(),
TempRating: val.GetTempRating(),
Rating: val.GetRating(),
RatingModifier: val.GetRatingModifier(),
RewardAddress: val.GetRewardAddress(),
LeaderSuccess: val.GetLeaderSuccess(),
LeaderFailure: val.GetLeaderFailure(),
ValidatorSuccess: val.GetValidatorSuccess(),
ValidatorFailure: val.GetValidatorFailure(),
ValidatorIgnoredSignatures: val.GetValidatorIgnoredSignatures(),
NumSelectedInSuccessBlocks: val.GetNumSelectedInSuccessBlocks(),
AccumulatedFees: val.GetAccumulatedFees(),
TotalLeaderSuccess: val.GetTotalLeaderSuccess(),
TotalLeaderFailure: val.GetTotalLeaderFailure(),
TotalValidatorSuccess: val.GetValidatorSuccess(),
TotalValidatorFailure: val.GetValidatorFailure(),
TotalValidatorIgnoredSignatures: val.GetValidatorIgnoredSignatures(),
})
}
}
return ret
}

0 comments on commit 40715e9

Please sign in to comment.