Skip to content

Commit

Permalink
Merge pull request #3926 from ElrondNetwork/validators-info-into-vali…
Browse files Browse the repository at this point in the history
…dator-creator

Integrate validators info map into validator creator
  • Loading branch information
mariusmihaic committed Mar 24, 2022
2 parents 8410cb1 + ac68d06 commit 217afb9
Show file tree
Hide file tree
Showing 8 changed files with 145 additions and 183 deletions.
27 changes: 14 additions & 13 deletions epochStart/metachain/validators.go
Original file line number Diff line number Diff line change
Expand Up @@ -67,15 +67,16 @@ func NewValidatorInfoCreator(args ArgsNewValidatorInfoCreator) (*validatorInfoCr
}

// CreateValidatorInfoMiniBlocks creates the validatorInfo miniblocks according to the provided validatorInfo map
func (vic *validatorInfoCreator) CreateValidatorInfoMiniBlocks(validatorsInfo map[uint32][]*state.ValidatorInfo) (block.MiniBlockSlice, error) {
func (vic *validatorInfoCreator) CreateValidatorInfoMiniBlocks(validatorsInfo state.ShardValidatorsInfoMapHandler) (block.MiniBlockSlice, error) {
if validatorsInfo == nil {
return nil, epochStart.ErrNilValidatorInfo
}

miniblocks := make([]*block.MiniBlock, 0)

validatorsMap := validatorsInfo.GetShardValidatorsInfoMap()
for shardId := uint32(0); shardId < vic.shardCoordinator.NumberOfShards(); shardId++ {
validators := validatorsInfo[shardId]
validators := validatorsMap[shardId]
if len(validators) == 0 {
continue
}
Expand All @@ -88,7 +89,7 @@ func (vic *validatorInfoCreator) CreateValidatorInfoMiniBlocks(validatorsInfo ma
miniblocks = append(miniblocks, miniBlock)
}

validators := validatorsInfo[core.MetachainShardId]
validators := validatorsMap[core.MetachainShardId]
if len(validators) == 0 {
return miniblocks, nil
}
Expand All @@ -103,17 +104,17 @@ func (vic *validatorInfoCreator) CreateValidatorInfoMiniBlocks(validatorsInfo ma
return miniblocks, nil
}

func (vic *validatorInfoCreator) createMiniBlock(validatorsInfo []*state.ValidatorInfo) (*block.MiniBlock, error) {
func (vic *validatorInfoCreator) createMiniBlock(validatorsInfo []state.ValidatorInfoHandler) (*block.MiniBlock, error) {
miniBlock := &block.MiniBlock{}
miniBlock.SenderShardID = vic.shardCoordinator.SelfId()
miniBlock.ReceiverShardID = core.AllShardId
miniBlock.TxHashes = make([][]byte, len(validatorsInfo))
miniBlock.Type = block.PeerBlock

validatorCopy := make([]*state.ValidatorInfo, len(validatorsInfo))
validatorCopy := make([]state.ValidatorInfoHandler, len(validatorsInfo))
copy(validatorCopy, validatorsInfo)
sort.Slice(validatorCopy, func(a, b int) bool {
return bytes.Compare(validatorCopy[a].PublicKey, validatorCopy[b].PublicKey) < 0
return bytes.Compare(validatorCopy[a].GetPublicKey(), validatorCopy[b].GetPublicKey()) < 0
})

for index, validator := range validatorCopy {
Expand All @@ -129,20 +130,20 @@ func (vic *validatorInfoCreator) createMiniBlock(validatorsInfo []*state.Validat
return miniBlock, nil
}

func createShardValidatorInfo(validator *state.ValidatorInfo) *state.ShardValidatorInfo {
func createShardValidatorInfo(validator state.ValidatorInfoHandler) *state.ShardValidatorInfo {
return &state.ShardValidatorInfo{
PublicKey: validator.PublicKey,
ShardId: validator.ShardId,
List: validator.List,
Index: validator.Index,
TempRating: validator.TempRating,
PublicKey: validator.GetPublicKey(),
ShardId: validator.GetShardId(),
List: validator.GetList(),
Index: validator.GetIndex(),
TempRating: validator.GetTempRating(),
}
}

// VerifyValidatorInfoMiniBlocks verifies if received validatorinfo miniblocks are correct
func (vic *validatorInfoCreator) VerifyValidatorInfoMiniBlocks(
miniblocks []*block.MiniBlock,
validatorsInfo map[uint32][]*state.ValidatorInfo,
validatorsInfo state.ShardValidatorsInfoMapHandler,
) error {
if len(miniblocks) == 0 {
return epochStart.ErrNilMiniblocks
Expand Down
186 changes: 93 additions & 93 deletions epochStart/metachain/validators_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,90 +21,90 @@ import (
"github.com/stretchr/testify/require"
)

func createMockValidatorInfo() map[uint32][]*state.ValidatorInfo {
validatorInfo := map[uint32][]*state.ValidatorInfo{
0: {
&state.ValidatorInfo{
PublicKey: []byte("a1"),
ShardId: 0,
List: "eligible",
Index: 1,
TempRating: 100,
Rating: 1000,
RewardAddress: []byte("rewardA1"),
LeaderSuccess: 1,
LeaderFailure: 2,
ValidatorSuccess: 3,
ValidatorFailure: 4,
TotalLeaderSuccess: 10,
TotalLeaderFailure: 20,
TotalValidatorSuccess: 30,
TotalValidatorFailure: 40,
NumSelectedInSuccessBlocks: 5,
AccumulatedFees: big.NewInt(100),
},
&state.ValidatorInfo{
PublicKey: []byte("a2"),
ShardId: 0,
List: "waiting",
Index: 2,
TempRating: 101,
Rating: 1001,
RewardAddress: []byte("rewardA2"),
LeaderSuccess: 6,
LeaderFailure: 7,
ValidatorSuccess: 8,
ValidatorFailure: 9,
TotalLeaderSuccess: 60,
TotalLeaderFailure: 70,
TotalValidatorSuccess: 80,
TotalValidatorFailure: 90,
NumSelectedInSuccessBlocks: 10,
AccumulatedFees: big.NewInt(101),
},
},
core.MetachainShardId: {
&state.ValidatorInfo{
PublicKey: []byte("m1"),
ShardId: core.MetachainShardId,
List: "eligible",
Index: 1,
TempRating: 100,
Rating: 1000,
RewardAddress: []byte("rewardM1"),
LeaderSuccess: 1,
LeaderFailure: 2,
ValidatorSuccess: 3,
ValidatorFailure: 4,
TotalLeaderSuccess: 10,
TotalLeaderFailure: 20,
TotalValidatorSuccess: 30,
TotalValidatorFailure: 40,
NumSelectedInSuccessBlocks: 5,
AccumulatedFees: big.NewInt(100),
},
&state.ValidatorInfo{
PublicKey: []byte("m0"),
ShardId: core.MetachainShardId,
List: "waiting",
Index: 2,
TempRating: 101,
Rating: 1001,
RewardAddress: []byte("rewardM2"),
LeaderSuccess: 6,
LeaderFailure: 7,
ValidatorSuccess: 8,
ValidatorFailure: 9,
TotalLeaderSuccess: 60,
TotalLeaderFailure: 70,
TotalValidatorSuccess: 80,
TotalValidatorFailure: 90,
NumSelectedInSuccessBlocks: 10,
AccumulatedFees: big.NewInt(101),
},
},
}
return validatorInfo
func createMockValidatorInfo() state.ShardValidatorsInfoMapHandler {
validatorsInfo := state.NewShardValidatorsInfoMap()

_ = validatorsInfo.Add(&state.ValidatorInfo{
PublicKey: []byte("a1"),
ShardId: 0,
List: "eligible",
Index: 1,
TempRating: 100,
Rating: 1000,
RewardAddress: []byte("rewardA1"),
LeaderSuccess: 1,
LeaderFailure: 2,
ValidatorSuccess: 3,
ValidatorFailure: 4,
TotalLeaderSuccess: 10,
TotalLeaderFailure: 20,
TotalValidatorSuccess: 30,
TotalValidatorFailure: 40,
NumSelectedInSuccessBlocks: 5,
AccumulatedFees: big.NewInt(100),
})

_ = validatorsInfo.Add(&state.ValidatorInfo{
PublicKey: []byte("a2"),
ShardId: 0,
List: "waiting",
Index: 2,
TempRating: 101,
Rating: 1001,
RewardAddress: []byte("rewardA2"),
LeaderSuccess: 6,
LeaderFailure: 7,
ValidatorSuccess: 8,
ValidatorFailure: 9,
TotalLeaderSuccess: 60,
TotalLeaderFailure: 70,
TotalValidatorSuccess: 80,
TotalValidatorFailure: 90,
NumSelectedInSuccessBlocks: 10,
AccumulatedFees: big.NewInt(101),
})

_ = validatorsInfo.Add(&state.ValidatorInfo{
PublicKey: []byte("m1"),
ShardId: core.MetachainShardId,
List: "eligible",
Index: 1,
TempRating: 100,
Rating: 1000,
RewardAddress: []byte("rewardM1"),
LeaderSuccess: 1,
LeaderFailure: 2,
ValidatorSuccess: 3,
ValidatorFailure: 4,
TotalLeaderSuccess: 10,
TotalLeaderFailure: 20,
TotalValidatorSuccess: 30,
TotalValidatorFailure: 40,
NumSelectedInSuccessBlocks: 5,
AccumulatedFees: big.NewInt(100),
})

_ = validatorsInfo.Add(&state.ValidatorInfo{
PublicKey: []byte("m0"),
ShardId: core.MetachainShardId,
List: "waiting",
Index: 2,
TempRating: 101,
Rating: 1001,
RewardAddress: []byte("rewardM2"),
LeaderSuccess: 6,
LeaderFailure: 7,
ValidatorSuccess: 8,
ValidatorFailure: 9,
TotalLeaderSuccess: 60,
TotalLeaderFailure: 70,
TotalValidatorSuccess: 80,
TotalValidatorFailure: 90,
NumSelectedInSuccessBlocks: 10,
AccumulatedFees: big.NewInt(101),
})

return validatorsInfo
}

func createMockEpochValidatorInfoCreatorsArguments() ArgsNewValidatorInfoCreator {
Expand All @@ -127,18 +127,18 @@ func createMockEpochValidatorInfoCreatorsArguments() ArgsNewValidatorInfoCreator
return argsNewEpochEconomics
}

func verifyMiniBlocks(bl *block.MiniBlock, infos []*state.ValidatorInfo, marshalizer marshal.Marshalizer) bool {
func verifyMiniBlocks(bl *block.MiniBlock, infos []state.ValidatorInfoHandler, marshalizer marshal.Marshalizer) bool {
if bl.SenderShardID != core.MetachainShardId ||
bl.ReceiverShardID != core.AllShardId ||
len(bl.TxHashes) == 0 ||
bl.Type != block.PeerBlock {
return false
}

validatorCopy := make([]*state.ValidatorInfo, len(infos))
validatorCopy := make([]state.ValidatorInfoHandler, len(infos))
copy(validatorCopy, infos)
sort.Slice(validatorCopy, func(a, b int) bool {
return bytes.Compare(validatorCopy[a].PublicKey, validatorCopy[b].PublicKey) < 0
return bytes.Compare(validatorCopy[a].GetPublicKey(), validatorCopy[b].GetPublicKey()) < 0
})

for i, txHash := range bl.TxHashes {
Expand Down Expand Up @@ -264,9 +264,9 @@ func TestEpochValidatorInfoCreator_CreateValidatorInfoMiniBlocksShouldBeCorrect(
vic, _ := NewValidatorInfoCreator(arguments)
mbs, _ := vic.CreateValidatorInfoMiniBlocks(validatorInfo)

correctMB0 := verifyMiniBlocks(mbs[0], validatorInfo[0], arguments.Marshalizer)
correctMB0 := verifyMiniBlocks(mbs[0], validatorInfo.GetShardValidatorsInfoMap()[0], arguments.Marshalizer)
require.True(t, correctMB0)
correctMbMeta := verifyMiniBlocks(mbs[1], validatorInfo[core.MetachainShardId], arguments.Marshalizer)
correctMbMeta := verifyMiniBlocks(mbs[1], validatorInfo.GetShardValidatorsInfoMap()[core.MetachainShardId], arguments.Marshalizer)
require.True(t, correctMbMeta)
}

Expand Down Expand Up @@ -345,11 +345,11 @@ func TestEpochValidatorInfoCreator_VerifyValidatorInfoMiniBlocksNilOneMiniblock(
}

func createValidatorInfoMiniBlocks(
validatorInfo map[uint32][]*state.ValidatorInfo,
validatorInfo state.ShardValidatorsInfoMapHandler,
arguments ArgsNewValidatorInfoCreator,
) []*block.MiniBlock {
miniblocks := make([]*block.MiniBlock, 0)
for _, validators := range validatorInfo {
for _, validators := range validatorInfo.GetShardValidatorsInfoMap() {
if len(validators) == 0 {
continue
}
Expand All @@ -360,10 +360,10 @@ func createValidatorInfoMiniBlocks(
miniBlock.TxHashes = make([][]byte, len(validators))
miniBlock.Type = block.PeerBlock

validatorCopy := make([]*state.ValidatorInfo, len(validators))
validatorCopy := make([]state.ValidatorInfoHandler, len(validators))
copy(validatorCopy, validators)
sort.Slice(validatorCopy, func(a, b int) bool {
return bytes.Compare(validatorCopy[a].PublicKey, validatorCopy[b].PublicKey) < 0
return bytes.Compare(validatorCopy[a].GetPublicKey(), validatorCopy[b].GetPublicKey()) < 0
})

for index, validator := range validatorCopy {
Expand Down
2 changes: 1 addition & 1 deletion integrationTests/testSyncNode.go
Original file line number Diff line number Diff line change
Expand Up @@ -239,7 +239,7 @@ func (tpn *TestProcessorNode) initBlockProcessorWithSync() {
EpochStartDataCreator: &mock.EpochStartDataCreatorStub{},
EpochEconomics: &mock.EpochEconomicsStub{},
EpochRewardsCreator: &mock.EpochRewardsCreatorStub{},
EpochValidatorInfoCreator: &mock.EpochValidatorInfoCreatorStub{},
EpochValidatorInfoCreator: &testscommon.EpochValidatorInfoCreatorStub{},
ValidatorStatisticsProcessor: &testscommon.ValidatorStatisticsProcessorStub{},
EpochSystemSCProcessor: &testscommon.EpochStartSystemSCStub{},
}
Expand Down
26 changes: 23 additions & 3 deletions process/block/metablock.go
Original file line number Diff line number Diff line change
Expand Up @@ -446,7 +446,7 @@ func (mp *metaProcessor) processEpochStartMetaBlock(
return err
}

err = mp.validatorInfoCreator.VerifyValidatorInfoMiniBlocks(body.MiniBlocks, oldValidatorsInfoMap)
err = mp.verifyValidatorInfoMiniBlocks(oldValidatorsInfoMap, body.MiniBlocks)
if err != nil {
return err
}
Expand Down Expand Up @@ -918,7 +918,7 @@ func (mp *metaProcessor) createEpochStartBody(metaBlock *block.MetaBlock) (data.
return nil, err
}

validatorMiniBlocks, err := mp.validatorInfoCreator.CreateValidatorInfoMiniBlocks(oldValidatorsInfoMap)
validatorMiniBlocks, err := mp.createValidatorInfoMiniBlocks(oldValidatorsInfoMap)
if err != nil {
return nil, err
}
Expand Down Expand Up @@ -2506,7 +2506,7 @@ func (mp *metaProcessor) DecodeBlockHeader(dta []byte) data.HeaderHandler {
return metaBlock
}

// TODO: StakingV4 delete this once map[uint32][]*ValidatorInfo is replaced with interface
// TODO: StakingV4 delete these funcs once map[uint32][]*ValidatorInfo is replaced with interface
func (mp *metaProcessor) processSystemSCsWithNewValidatorsInfo(allValidatorsInfo map[uint32][]*state.ValidatorInfo, header data.HeaderHandler) error {
validatorsInfoMap := state.CreateShardValidatorsMap(allValidatorsInfo)
err := mp.epochSystemSCProcessor.ProcessSystemSmartContract(validatorsInfoMap, header)
Expand All @@ -2516,3 +2516,23 @@ func (mp *metaProcessor) processSystemSCsWithNewValidatorsInfo(allValidatorsInfo
state.Replace(allValidatorsInfo, validatorsInfoMap.GetValInfoPointerMap())
return nil
}

func (mp *metaProcessor) verifyValidatorInfoMiniBlocks(allValidatorsInfo map[uint32][]*state.ValidatorInfo, miniBlocks []*block.MiniBlock) error {
validatorsInfoMap := state.CreateShardValidatorsMap(allValidatorsInfo)
err := mp.validatorInfoCreator.VerifyValidatorInfoMiniBlocks(miniBlocks, validatorsInfoMap)
if err != nil {
return err
}
state.Replace(allValidatorsInfo, validatorsInfoMap.GetValInfoPointerMap())
return nil
}

func (mp *metaProcessor) createValidatorInfoMiniBlocks(allValidatorsInfo map[uint32][]*state.ValidatorInfo) (block.MiniBlockSlice, error) {
validatorsInfoMap := state.CreateShardValidatorsMap(allValidatorsInfo)
validatorMiniBlocks, err := mp.validatorInfoCreator.CreateValidatorInfoMiniBlocks(validatorsInfoMap)
if err != nil {
return nil, err
}
state.Replace(allValidatorsInfo, validatorsInfoMap.GetValInfoPointerMap())
return validatorMiniBlocks, err
}

0 comments on commit 217afb9

Please sign in to comment.