mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-07-18 02:40:45 +00:00
check masternode before candidate in GetCandidateStatus
This commit is contained in:
parent
745e097040
commit
e17a0869e5
1 changed files with 15 additions and 11 deletions
|
|
@ -773,24 +773,19 @@ func (s *PublicBlockChainAPI) GetCandidateStatus(ctx context.Context, coinbaseAd
|
||||||
maxMasternodes = common.MaxMasternodes
|
maxMasternodes = common.MaxMasternodes
|
||||||
}
|
}
|
||||||
|
|
||||||
isTopCandidate := false
|
// check penalties from checkpoint headers and modify status of a node to SLASHED if it's in top maxMasternodes candidates.
|
||||||
// check penalties from checkpoint headers and modify status of a node to SLASHED if it's in top 150 candidates
|
// if it's SLASHED but it's out of top maxMasternodes, the status should be still PROPOSED.
|
||||||
// if it's SLASHED but it's out of top 150, the status should be still PROPOSED
|
isCandidate := false
|
||||||
for i := 0; i < len(candidates); i++ {
|
for i := 0; i < len(candidates); i++ {
|
||||||
if coinbaseAddress == candidates[i].Address {
|
if coinbaseAddress == candidates[i].Address {
|
||||||
if i < maxMasternodes {
|
isCandidate = true
|
||||||
isTopCandidate = true
|
|
||||||
}
|
|
||||||
result[fieldStatus] = statusProposed
|
result[fieldStatus] = statusProposed
|
||||||
result[fieldCapacity] = candidates[i].Stake
|
result[fieldCapacity] = candidates[i].Stake
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if !isTopCandidate {
|
|
||||||
return result, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Second, Find candidates that have masternode status
|
// Get masternode list
|
||||||
if engine, ok := s.b.GetEngine().(*XDPoS.XDPoS); ok {
|
if engine, ok := s.b.GetEngine().(*XDPoS.XDPoS); ok {
|
||||||
masternodes = engine.GetMasternodesFromCheckpointHeader(header)
|
masternodes = engine.GetMasternodesFromCheckpointHeader(header)
|
||||||
if len(masternodes) == 0 {
|
if len(masternodes) == 0 {
|
||||||
|
|
@ -801,14 +796,23 @@ func (s *PublicBlockChainAPI) GetCandidateStatus(ctx context.Context, coinbaseAd
|
||||||
} else {
|
} else {
|
||||||
log.Error("Undefined XDPoS consensus engine")
|
log.Error("Undefined XDPoS consensus engine")
|
||||||
}
|
}
|
||||||
// Set masternode status
|
|
||||||
|
// Set to statusMasternode if it is masternode
|
||||||
for _, masternode := range masternodes {
|
for _, masternode := range masternodes {
|
||||||
if coinbaseAddress == masternode {
|
if coinbaseAddress == masternode {
|
||||||
result[fieldStatus] = statusMasternode
|
result[fieldStatus] = statusMasternode
|
||||||
|
if !isCandidate {
|
||||||
|
result[fieldCapacity] = -1
|
||||||
|
log.Warn("Find non-candidate masternode", "masternode", masternode.String(), "checkpointNumber", checkpointNumber, "epoch", epoch, "epochNumber", epochNumber)
|
||||||
|
}
|
||||||
return result, nil
|
return result, nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if !isCandidate || len(masternodes) >= maxMasternodes {
|
||||||
|
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
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue