Skip to content

Commit ea434a1

Browse files
committed
CMasternodeMan::GetMasternodeRanks removed unneeded MN extra validations and totally unnecessary extra vector load.
As this function is only used in listmasternodes RPC command, the checks are redundant, the MN thread only should check and update `vMasternodes`, removing any invalid masternode.
1 parent 92035f8 commit ea434a1

File tree

3 files changed

+20
-33
lines changed

3 files changed

+20
-33
lines changed

src/masternodeman.cpp

Lines changed: 14 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -616,41 +616,27 @@ int CMasternodeMan::GetMasternodeRank(const CTxIn& vin, int64_t nBlockHeight, in
616616
return -1;
617617
}
618618

619-
std::vector<std::pair<int, CMasternode> > CMasternodeMan::GetMasternodeRanks(int64_t nBlockHeight, int minProtocol)
619+
std::vector<std::pair<int64_t, CMasternode>> CMasternodeMan::GetMasternodeRanks(int nBlockHeight)
620620
{
621-
std::vector<std::pair<int64_t, CMasternode> > vecMasternodeScores;
622-
std::vector<std::pair<int, CMasternode> > vecMasternodeRanks;
623-
621+
std::vector<std::pair<int64_t, CMasternode>> vecMasternodeScores;
624622
const uint256& hash = GetHashAtHeight(nBlockHeight - 1);
625623
// height outside range
626-
if (!hash) return vecMasternodeRanks;
627-
628-
// scan for winner
629-
for (CMasternode& mn : vMasternodes) {
630-
mn.Check();
631-
632-
if (mn.protocolVersion < minProtocol) continue;
624+
if (!hash) return vecMasternodeScores;
625+
{
626+
LOCK(cs);
627+
// scan for winner
628+
for (CMasternode& mn : vMasternodes) {
629+
if (!mn.IsEnabled()) {
630+
vecMasternodeScores.emplace_back(9999, mn);
631+
continue;
632+
}
633633

634-
if (!mn.IsEnabled()) {
635-
vecMasternodeScores.emplace_back(9999, mn);
636-
continue;
634+
int64_t n2 = mn.CalculateScore(hash).GetCompact(false);
635+
vecMasternodeScores.emplace_back(n2, mn);
637636
}
638-
639-
uint256 n = mn.CalculateScore(hash);
640-
int64_t n2 = n.GetCompact(false);
641-
642-
vecMasternodeScores.emplace_back(n2, mn);
643637
}
644-
645638
sort(vecMasternodeScores.rbegin(), vecMasternodeScores.rend(), CompareScoreMN());
646-
647-
int rank = 0;
648-
for (PAIRTYPE(int64_t, CMasternode) & s : vecMasternodeScores) {
649-
rank++;
650-
vecMasternodeRanks.emplace_back(rank, s.second);
651-
}
652-
653-
return vecMasternodeRanks;
639+
return vecMasternodeScores;
654640
}
655641

656642
void CMasternodeMan::ProcessMessage(CNode* pfrom, std::string& strCommand, CDataStream& vRecv)

src/masternodeman.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -146,8 +146,8 @@ class CMasternodeMan
146146
Check();
147147
return vMasternodes;
148148
}
149-
150-
std::vector<std::pair<int, CMasternode> > GetMasternodeRanks(int64_t nBlockHeight, int minProtocol = 0);
149+
// Retrieve the known masternodes ordered by scoring without checking them. (Only used for listmasternodes RPC call)
150+
std::vector<std::pair<int64_t, CMasternode>> GetMasternodeRanks(int nBlockHeight);
151151
int GetMasternodeRank(const CTxIn& vin, int64_t nBlockHeight, int minProtocol = 0, bool fOnlyActive = true);
152152

153153
void ProcessMessage(CNode* pfrom, std::string& strCommand, CDataStream& vRecv);

src/rpc/masternode.cpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -81,8 +81,9 @@ UniValue listmasternodes(const JSONRPCRequest& request)
8181
int nHeight = WITH_LOCK(cs_main, return chainActive.Height());
8282
if (nHeight < 0) return "[]";
8383

84-
std::vector<std::pair<int, CMasternode> > vMasternodeRanks = mnodeman.GetMasternodeRanks(nHeight);
85-
for (PAIRTYPE(int, CMasternode) & s : vMasternodeRanks) {
84+
std::vector<std::pair<int64_t, CMasternode>> vMasternodeRanks = mnodeman.GetMasternodeRanks(nHeight);
85+
for (int pos=0; pos < (int) vMasternodeRanks.size(); pos++) {
86+
const auto& s = vMasternodeRanks[pos];
8687
UniValue obj(UniValue::VOBJ);
8788
std::string strVin = s.second.vin.prevout.ToStringShort();
8889
std::string strTxHash = s.second.vin.prevout.hash.ToString();
@@ -103,7 +104,7 @@ UniValue listmasternodes(const JSONRPCRequest& request)
103104
LookupHost(strHost.c_str(), node, false);
104105
std::string strNetwork = GetNetworkName(node.GetNetwork());
105106

106-
obj.pushKV("rank", (strStatus == "ENABLED" ? s.first : 0));
107+
obj.pushKV("rank", (strStatus == "ENABLED" ? pos : 0));
107108
obj.pushKV("network", strNetwork);
108109
obj.pushKV("txhash", strTxHash);
109110
obj.pushKV("outidx", (uint64_t)oIdx);

0 commit comments

Comments
 (0)