Skip to content

Commit

Permalink
Replace uses of mnodeman in PS code when deterministicMNManager can b…
Browse files Browse the repository at this point in the history
…e used directly

Additionally, implement GetLastDsq in CMasternodeMan as a replacement
for direct access to the masternode_info_t object. Will move this variable
to another (PS specific) place later.
  • Loading branch information
codablock committed Dec 31, 2018
1 parent eedb158 commit 2f66d6a
Show file tree
Hide file tree
Showing 8 changed files with 115 additions and 96 deletions.
4 changes: 2 additions & 2 deletions src/masternode-payments.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -641,14 +641,14 @@ bool CMasternodePayments::GetBlockTxOuts(int nBlockHeight, CAmount blockReward,

// Is this masternode scheduled to get paid soon?
// -- Only look ahead up to 8 blocks to allow for propagation of the latest 2 blocks of votes
bool CMasternodePayments::IsScheduled(const masternode_info_t& mnInfo, int nNotBlockHeight) const
bool CMasternodePayments::IsScheduled(const CDeterministicMNCPtr& dmnIn, int nNotBlockHeight) const
{
LOCK(cs_mapMasternodeBlocks);

if (deterministicMNManager->IsDIP3Active()) {
auto projectedPayees = deterministicMNManager->GetListAtChainTip().GetProjectedMNPayees(8);
for (const auto &dmn : projectedPayees) {
if (dmn->collateralOutpoint == mnInfo.outpoint) {
if (dmn->proTxHash == dmnIn->proTxHash) {
return true;
}
}
Expand Down
2 changes: 1 addition & 1 deletion src/masternode-payments.h
Original file line number Diff line number Diff line change
Expand Up @@ -200,7 +200,7 @@ class CMasternodePayments

bool GetBlockTxOuts(int nBlockHeight, CAmount blockReward, std::vector<CTxOut>& voutMasternodePaymentsRet) const;
bool IsTransactionValid(const CTransaction& txNew, int nBlockHeight, CAmount blockReward) const;
bool IsScheduled(const masternode_info_t& mnInfo, int nNotBlockHeight) const;
bool IsScheduled(const CDeterministicMNCPtr& dmn, int nNotBlockHeight) const;

bool UpdateLastVote(const CMasternodePaymentVote& vote);

Expand Down
20 changes: 15 additions & 5 deletions src/masternodeman.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -163,6 +163,16 @@ bool CMasternodeMan::DisallowMixing(const COutPoint &outpoint)
return true;
}

int64_t CMasternodeMan::GetLastDsq(const COutPoint& outpoint)
{
LOCK(cs);
CMasternode* pmn = Find(outpoint);
if (!pmn) {
return 0;
}
return pmn->nLastDsq;
}

bool CMasternodeMan::PoSeBan(const COutPoint &outpoint)
{
LOCK(cs);
Expand Down Expand Up @@ -901,17 +911,17 @@ bool CMasternodeMan::GetMasternodeRanks(CMasternodeMan::rank_pair_vec_t& vecMast

void CMasternodeMan::ProcessMasternodeConnections(CConnman& connman)
{
std::vector<masternode_info_t> vecMnInfo; // will be empty when no wallet
std::vector<CDeterministicMNCPtr> vecDmns; // will be empty when no wallet
#ifdef ENABLE_WALLET
privateSendClient.GetMixingMasternodesInfo(vecMnInfo);
privateSendClient.GetMixingMasternodesInfo(vecDmns);
#endif // ENABLE_WALLET

connman.ForEachNode(CConnman::AllNodes, [&vecMnInfo](CNode* pnode) {
connman.ForEachNode(CConnman::AllNodes, [&](CNode* pnode) {
if (pnode->fMasternode) {
#ifdef ENABLE_WALLET
bool fFound = false;
for (const auto& mnInfo : vecMnInfo) {
if (pnode->addr == mnInfo.addr) {
for (const auto& dmn : vecDmns) {
if (pnode->addr == dmn->pdmnState->addr) {
fFound = true;
break;
}
Expand Down
1 change: 1 addition & 0 deletions src/masternodeman.h
Original file line number Diff line number Diff line change
Expand Up @@ -140,6 +140,7 @@ class CMasternodeMan
bool IsValidForMixingTxes(const COutPoint &outpoint);
bool AllowMixing(const COutPoint &outpoint);
bool DisallowMixing(const COutPoint &outpoint);
int64_t GetLastDsq(const COutPoint &outpoint);

/// Check all Masternodes
void Check();
Expand Down
132 changes: 67 additions & 65 deletions src/privatesend-client.cpp

Large diffs are not rendered by default.

11 changes: 7 additions & 4 deletions src/privatesend-client.h
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,11 @@
#include "privatesend.h"
#include "wallet/wallet.h"

#include "evo/deterministicmns.h"

class CPrivateSendClientManager;
class CConnman;
class CNode;

static const int DENOMS_COUNT_MAX = 100;

Expand Down Expand Up @@ -92,7 +95,7 @@ class CPrivateSendClientSession : public CPrivateSendBaseSession
std::string strLastMessage;
std::string strAutoDenomResult;

masternode_info_t infoMixingMasternode;
CDeterministicMNCPtr mixingMasternode;
CMutableTransaction txMyCollateral; // client side collateral
CPendingDsaRequest pendingDsaRequest;

Expand Down Expand Up @@ -139,7 +142,7 @@ class CPrivateSendClientSession : public CPrivateSendBaseSession
fLastEntryAccepted(false),
strLastMessage(),
strAutoDenomResult(),
infoMixingMasternode(),
mixingMasternode(),
txMyCollateral(),
pendingDsaRequest(),
keyHolderStorage()
Expand All @@ -154,7 +157,7 @@ class CPrivateSendClientSession : public CPrivateSendBaseSession

std::string GetStatus(bool fWaitForBlock);

bool GetMixingMasternodeInfo(masternode_info_t& mnInfoRet) const;
bool GetMixingMasternodeInfo(CDeterministicMNCPtr& ret) const;

/// Passively run mixing in the background according to the configuration in settings
bool DoAutomaticDenominating(CConnman& connman, bool fDryRun = false);
Expand Down Expand Up @@ -235,7 +238,7 @@ class CPrivateSendClientManager : public CPrivateSendBaseManager
std::string GetStatuses();
std::string GetSessionDenoms();

bool GetMixingMasternodesInfo(std::vector<masternode_info_t>& vecMnInfoRet) const;
bool GetMixingMasternodesInfo(std::vector<CDeterministicMNCPtr>& vecDmnsRet) const;

/// Passively run mixing in the background according to the configuration in settings
bool DoAutomaticDenominating(CConnman& connman, bool fDryRun = false);
Expand Down
31 changes: 17 additions & 14 deletions src/privatesend-server.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -44,8 +44,9 @@ void CPrivateSendServer::ProcessMessage(CNode* pfrom, const std::string& strComm

LogPrint("privatesend", "DSACCEPT -- nDenom %d (%s) txCollateral %s", dsa.nDenom, CPrivateSend::GetDenominationsToString(dsa.nDenom), dsa.txCollateral.ToString());

masternode_info_t mnInfo;
if (!mnodeman.GetMasternodeInfo(activeMasternodeInfo.outpoint, mnInfo)) {
auto mnList = deterministicMNManager->GetListAtChainTip();
auto dmn = mnList.GetValidMNByCollateral(activeMasternodeInfo.outpoint);
if (!dmn) {
PushStatus(pfrom, STATUS_REJECTED, ERR_MN_LIST, connman);
return;
}
Expand All @@ -65,7 +66,8 @@ void CPrivateSendServer::ProcessMessage(CNode* pfrom, const std::string& strComm
}
}

if (mnInfo.nLastDsq != 0 && mnInfo.nLastDsq + mnodeman.CountMasternodes() / 5 > mnodeman.nDsqCount) {
int64_t nLastDsq = mnodeman.GetLastDsq(dmn->collateralOutpoint);
if (nLastDsq != 0 && nLastDsq + mnList.GetValidMNsCount() / 5 > mnodeman.nDsqCount) {
LogPrintf("DSACCEPT -- last dsq too recent, must wait: addr=%s\n", pfrom->addr.ToString());
PushStatus(pfrom, STATUS_REJECTED, ERR_RECENT, connman);
return;
Expand Down Expand Up @@ -111,34 +113,35 @@ void CPrivateSendServer::ProcessMessage(CNode* pfrom, const std::string& strComm

if (dsq.IsExpired()) return;

masternode_info_t mnInfo;
if (!mnodeman.GetMasternodeInfo(dsq.masternodeOutpoint, mnInfo)) return;
auto mnList = deterministicMNManager->GetListAtChainTip();
auto dmn = mnList.GetValidMNByCollateral(dsq.masternodeOutpoint);
if (!dmn) return;

if (!dsq.CheckSignature(mnInfo.legacyKeyIDOperator, mnInfo.blsPubKeyOperator)) {
// we probably have outdated info
mnodeman.AskForMN(pfrom, dsq.masternodeOutpoint, connman);
if (!dsq.CheckSignature(dmn->pdmnState->pubKeyOperator)) {
// TODO ban?
return;
}

if (!dsq.fReady) {
for (const auto& q : vecPrivateSendQueue) {
if (q.masternodeOutpoint == dsq.masternodeOutpoint) {
// no way same mn can send another "not yet ready" dsq this soon
LogPrint("privatesend", "DSQUEUE -- Masternode %s is sending WAY too many dsq messages\n", mnInfo.addr.ToString());
LogPrint("privatesend", "DSQUEUE -- Masternode %s is sending WAY too many dsq messages\n", dmn->pdmnState->addr.ToString());
return;
}
}

int nThreshold = mnInfo.nLastDsq + mnodeman.CountMasternodes() / 5;
LogPrint("privatesend", "DSQUEUE -- nLastDsq: %d threshold: %d nDsqCount: %d\n", mnInfo.nLastDsq, nThreshold, mnodeman.nDsqCount);
int64_t nLastDsq = mnodeman.GetLastDsq(dmn->collateralOutpoint);
int nThreshold = nLastDsq + mnList.GetValidMNsCount() / 5;
LogPrint("privatesend", "DSQUEUE -- nLastDsq: %d threshold: %d nDsqCount: %d\n", nLastDsq, nThreshold, mnodeman.nDsqCount);
//don't allow a few nodes to dominate the queuing process
if (mnInfo.nLastDsq != 0 && nThreshold > mnodeman.nDsqCount) {
LogPrint("privatesend", "DSQUEUE -- Masternode %s is sending too many dsq messages\n", mnInfo.addr.ToString());
if (nLastDsq != 0 && nThreshold > mnodeman.nDsqCount) {
LogPrint("privatesend", "DSQUEUE -- Masternode %s is sending too many dsq messages\n", dmn->pdmnState->addr.ToString());
return;
}
mnodeman.AllowMixing(dsq.masternodeOutpoint);

LogPrint("privatesend", "DSQUEUE -- new PrivateSend queue (%s) from masternode %s\n", dsq.ToString(), mnInfo.addr.ToString());
LogPrint("privatesend", "DSQUEUE -- new PrivateSend queue (%s) from masternode %s\n", dsq.ToString(), dmn->pdmnState->addr.ToString());
vecPrivateSendQueue.push_back(dsq);
dsq.Relay(connman);
}
Expand Down
10 changes: 5 additions & 5 deletions src/rpc/masternode.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -99,13 +99,13 @@ UniValue getpoolinfo(const JSONRPCRequest& request)
// obj.push_back(Pair("entries", pprivateSendBase->GetEntriesCount()));
obj.push_back(Pair("status", privateSendClient.GetStatuses()));

std::vector<masternode_info_t> vecMnInfo;
if (privateSendClient.GetMixingMasternodesInfo(vecMnInfo)) {
std::vector<CDeterministicMNCPtr> vecDmns;
if (privateSendClient.GetMixingMasternodesInfo(vecDmns)) {
UniValue pools(UniValue::VARR);
for (const auto& mnInfo : vecMnInfo) {
for (const auto& dmn : vecDmns) {
UniValue pool(UniValue::VOBJ);
pool.push_back(Pair("outpoint", mnInfo.outpoint.ToStringShort()));
pool.push_back(Pair("addr", mnInfo.addr.ToString()));
pool.push_back(Pair("outpoint", dmn->collateralOutpoint.ToStringShort()));
pool.push_back(Pair("addr", dmn->pdmnState->addr.ToString()));
pools.push_back(pool);
}
obj.push_back(Pair("pools", pools));
Expand Down

0 comments on commit 2f66d6a

Please sign in to comment.