Skip to content

Commit

Permalink
Move logic from FindRandomNotInVec into GetRandomNotUsedMasternode
Browse files Browse the repository at this point in the history
And adapt it to directly use deterministicMNManager
  • Loading branch information
codablock committed Dec 31, 2018
1 parent 2f66d6a commit 71a6951
Show file tree
Hide file tree
Showing 4 changed files with 37 additions and 51 deletions.
45 changes: 0 additions & 45 deletions src/masternodeman.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -747,51 +747,6 @@ bool CMasternodeMan::GetNextMasternodeInQueueForPayment(int nBlockHeight, bool f
return mnInfoRet.fInfoValid;
}

masternode_info_t CMasternodeMan::FindRandomNotInVec(const std::vector<COutPoint> &vecToExclude, int nProtocolVersion)
{
LOCK(cs);

nProtocolVersion = nProtocolVersion == -1 ? mnpayments.GetMinMasternodePaymentsProto() : nProtocolVersion;

int nCountEnabled = CountEnabled(nProtocolVersion);
int nCountNotExcluded = nCountEnabled - vecToExclude.size();

LogPrintf("CMasternodeMan::FindRandomNotInVec -- %d enabled masternodes, %d masternodes to choose from\n", nCountEnabled, nCountNotExcluded);
if(nCountNotExcluded < 1) return masternode_info_t();

// fill a vector of pointers
std::vector<const CMasternode*> vpMasternodesShuffled;
for (const auto& mnpair : mapMasternodes) {
vpMasternodesShuffled.push_back(&mnpair.second);
}

FastRandomContext insecure_rand;
// shuffle pointers
std::random_shuffle(vpMasternodesShuffled.begin(), vpMasternodesShuffled.end(), insecure_rand);
bool fExclude;

// loop through
for (const auto& pmn : vpMasternodesShuffled) {
if(pmn->nProtocolVersion < nProtocolVersion || !pmn->IsEnabled()) continue;
fExclude = false;
for (const auto& outpointToExclude : vecToExclude) {
if(pmn->outpoint == outpointToExclude) {
fExclude = true;
break;
}
}
if(fExclude) continue;
if (deterministicMNManager->IsDIP3Active() && !deterministicMNManager->HasValidMNCollateralAtChainTip(pmn->outpoint))
continue;
// found the one not in vecToExclude
LogPrint("masternode", "CMasternodeMan::FindRandomNotInVec -- found, masternode=%s\n", pmn->outpoint.ToStringShort());
return pmn->GetInfo();
}

LogPrint("masternode", "CMasternodeMan::FindRandomNotInVec -- failed\n");
return masternode_info_t();
}

std::map<COutPoint, CMasternode> CMasternodeMan::GetFullMasternodeMap()
{
LOCK(cs);
Expand Down
3 changes: 0 additions & 3 deletions src/masternodeman.h
Original file line number Diff line number Diff line change
Expand Up @@ -182,9 +182,6 @@ class CMasternodeMan
/// Same as above but use current block height
bool GetNextMasternodeInQueueForPayment(bool fFilterSigTime, int& nCountRet, masternode_info_t& mnInfoRet);

/// Find a random entry
masternode_info_t FindRandomNotInVec(const std::vector<COutPoint> &vecToExclude, int nProtocolVersion = -1);

std::map<COutPoint, CMasternode> GetFullMasternodeMap();

bool GetMasternodeRanks(rank_pair_vec_t& vecMasternodeRanksRet, int nBlockHeight = -1, int nMinProtocol = 0);
Expand Down
38 changes: 36 additions & 2 deletions src/privatesend-client.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -991,9 +991,43 @@ void CPrivateSendClientManager::AddUsedMasternode(const COutPoint& outpointMn)
vecMasternodesUsed.push_back(outpointMn);
}

masternode_info_t CPrivateSendClientManager::GetNotUsedMasternode()
CDeterministicMNCPtr CPrivateSendClientManager::GetRandomNotUsedMasternode()
{
return mnodeman.FindRandomNotInVec(vecMasternodesUsed, MIN_PRIVATESEND_PEER_PROTO_VERSION);
auto mnList = deterministicMNManager->GetListAtChainTip();

int nCountEnabled = mnList.GetValidMNsCount();
int nCountNotExcluded = nCountEnabled - vecMasternodesUsed.size();

LogPrintf("CPrivateSendClientManager::%s -- %d enabled masternodes, %d masternodes to choose from\n", __func__, nCountEnabled, nCountNotExcluded);
if(nCountNotExcluded < 1) {
return nullptr;
}

// fill a vector
std::vector<CDeterministicMNCPtr> vpMasternodesShuffled;
vpMasternodesShuffled.reserve((size_t)nCountEnabled);
mnList.ForEachMN(true, [&](const CDeterministicMNCPtr& dmn) {
vpMasternodesShuffled.emplace_back(dmn);
});

FastRandomContext insecure_rand;
// shuffle pointers
std::random_shuffle(vpMasternodesShuffled.begin(), vpMasternodesShuffled.end(), insecure_rand);

std::set<COutPoint> excludeSet(vecMasternodesUsed.begin(), vecMasternodesUsed.end());

// loop through
for (const auto& dmn : vpMasternodesShuffled) {
if (excludeSet.count(dmn->collateralOutpoint)) {
continue;
}

LogPrint("masternode", "CPrivateSendClientManager::%s -- found, masternode=%s\n", __func__, dmn->collateralOutpoint.ToStringShort());
return dmn;
}

LogPrint("masternode", "CPrivateSendClientManager::%s -- failed\n", __func__);
return nullptr;
}

bool CPrivateSendClientSession::JoinExistingQueue(CAmount nBalanceNeedsAnonymized, CConnman& connman)
Expand Down
2 changes: 1 addition & 1 deletion src/privatesend-client.h
Original file line number Diff line number Diff line change
Expand Up @@ -248,7 +248,7 @@ class CPrivateSendClientManager : public CPrivateSendBaseManager
void ProcessPendingDsaRequest(CConnman& connman);

void AddUsedMasternode(const COutPoint& outpointMn);
masternode_info_t GetNotUsedMasternode();
CDeterministicMNCPtr GetRandomNotUsedMasternode();

void UpdatedSuccessBlock();

Expand Down

0 comments on commit 71a6951

Please sign in to comment.