return non-candidate masternode in GetCandidates

This commit is contained in:
Daniel Liu 2023-07-14 15:10:19 +08:00
parent 5d24dfdf7e
commit 6e7d7f5002

View file

@ -851,7 +851,6 @@ func (s *PublicBlockChainAPI) GetCandidates(ctx context.Context, epoch rpc.Epoch
fieldSuccess: true, fieldSuccess: true,
} }
epochConfig := s.b.ChainConfig().XDPoS.Epoch epochConfig := s.b.ChainConfig().XDPoS.Epoch
candidatesStatusMap := map[string]map[string]interface{}{}
checkpointNumber, epochNumber = s.GetPreviousCheckpointFromEpoch(ctx, epoch) checkpointNumber, epochNumber = s.GetPreviousCheckpointFromEpoch(ctx, epoch)
result[fieldEpoch] = epochNumber.Int64() result[fieldEpoch] = epochNumber.Int64()
@ -903,7 +902,8 @@ func (s *PublicBlockChainAPI) GetCandidates(ctx context.Context, epoch rpc.Epoch
log.Error("Undefined XDPoS consensus engine") log.Error("Undefined XDPoS consensus engine")
} }
// Set all candidate to propose // Set all candidate to statusProposed
candidatesStatusMap := make(map[string]map[string]interface{}, len(candidates))
for _, candidate := range candidates { for _, candidate := range candidates {
candidatesStatusMap[candidate.Address.String()] = map[string]interface{}{ candidatesStatusMap[candidate.Address.String()] = map[string]interface{}{
fieldStatus: statusProposed, fieldStatus: statusProposed,
@ -911,10 +911,17 @@ func (s *PublicBlockChainAPI) GetCandidates(ctx context.Context, epoch rpc.Epoch
} }
} }
// Set masternode status // Set masternodes to statusMasternode
for _, masternode := range masternodes { for _, masternode := range masternodes {
if candidatesStatusMap[masternode.String()] != nil { key := masternode.String()
candidatesStatusMap[masternode.String()][fieldStatus] = statusMasternode if candidatesStatusMap[key] != nil {
candidatesStatusMap[key][fieldStatus] = statusMasternode
} else {
candidatesStatusMap[key] = map[string]interface{}{
fieldStatus: statusMasternode,
fieldCapacity: -1,
}
log.Warn("Masternode is not candidate", "masternode", key, "checkpointNumber", checkpointNumber, "epoch", epoch, "epochNumber", epochNumber)
} }
} }
@ -925,6 +932,11 @@ func (s *PublicBlockChainAPI) GetCandidates(ctx context.Context, epoch rpc.Epoch
maxMasternodes = common.MaxMasternodes maxMasternodes = common.MaxMasternodes
} }
if len(masternodes) >= maxMasternodes {
result[fieldCandidates] = candidatesStatusMap
return result, nil
}
if len(candidates) > maxMasternodes { if len(candidates) > maxMasternodes {
sort.Slice(candidates, func(i, j int) bool { sort.Slice(candidates, func(i, j int) bool {
return candidates[i].Stake.Cmp(candidates[j].Stake) > 0 return candidates[i].Stake.Cmp(candidates[j].Stake) > 0