From 2f66d6ada12f53f4b596e746887e3000d7efe6aa Mon Sep 17 00:00:00 2001 From: Alexander Block Date: Mon, 17 Dec 2018 15:45:36 +0100 Subject: [PATCH] Replace uses of mnodeman in PS code when deterministicMNManager can be 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. --- src/masternode-payments.cpp | 4 +- src/masternode-payments.h | 2 +- src/masternodeman.cpp | 20 ++++-- src/masternodeman.h | 1 + src/privatesend-client.cpp | 132 ++++++++++++++++++------------------ src/privatesend-client.h | 11 +-- src/privatesend-server.cpp | 31 +++++---- src/rpc/masternode.cpp | 10 +-- 8 files changed, 115 insertions(+), 96 deletions(-) diff --git a/src/masternode-payments.cpp b/src/masternode-payments.cpp index aca4b632b4167..99a647178cb65 100644 --- a/src/masternode-payments.cpp +++ b/src/masternode-payments.cpp @@ -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; } } diff --git a/src/masternode-payments.h b/src/masternode-payments.h index 984551c923f47..9a41dae0c3219 100644 --- a/src/masternode-payments.h +++ b/src/masternode-payments.h @@ -200,7 +200,7 @@ class CMasternodePayments bool GetBlockTxOuts(int nBlockHeight, CAmount blockReward, std::vector& 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); diff --git a/src/masternodeman.cpp b/src/masternodeman.cpp index 9fb09bae5153d..88b86a9247036 100644 --- a/src/masternodeman.cpp +++ b/src/masternodeman.cpp @@ -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); @@ -901,17 +911,17 @@ bool CMasternodeMan::GetMasternodeRanks(CMasternodeMan::rank_pair_vec_t& vecMast void CMasternodeMan::ProcessMasternodeConnections(CConnman& connman) { - std::vector vecMnInfo; // will be empty when no wallet + std::vector 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; } diff --git a/src/masternodeman.h b/src/masternodeman.h index a2cb7c2c2bd07..58c3ff91b6631 100644 --- a/src/masternodeman.h +++ b/src/masternodeman.h @@ -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(); diff --git a/src/privatesend-client.cpp b/src/privatesend-client.cpp index 13b43e97f821c..6b809892388da 100644 --- a/src/privatesend-client.cpp +++ b/src/privatesend-client.cpp @@ -61,12 +61,12 @@ void CPrivateSendClientManager::ProcessMessage(CNode* pfrom, const std::string& if (dsq.IsExpired()) return; - masternode_info_t infoMn; - if (!mnodeman.GetMasternodeInfo(dsq.masternodeOutpoint, infoMn)) return; + auto mnList = deterministicMNManager->GetListAtChainTip(); + auto dmn = mnList.GetValidMNByCollateral(dsq.masternodeOutpoint); + if (!dmn) return; - if (!dsq.CheckSignature(infoMn.legacyKeyIDOperator, infoMn.blsPubKeyOperator)) { - // we probably have outdated info - mnodeman.AskForMN(pfrom, dsq.masternodeOutpoint, connman); + if (!dsq.CheckSignature(dmn->pdmnState->pubKeyOperator)) { + // TODO ban? return; } @@ -74,9 +74,9 @@ void CPrivateSendClientManager::ProcessMessage(CNode* pfrom, const std::string& if (dsq.fReady) { LOCK(cs_deqsessions); for (auto& session : deqSessions) { - masternode_info_t mnMixing; - if (session.GetMixingMasternodeInfo(mnMixing) && mnMixing.addr == infoMn.addr && session.GetState() == POOL_STATE_QUEUE) { - LogPrint("privatesend", "DSQUEUE -- PrivateSend queue (%s) is ready on masternode %s\n", dsq.ToString(), infoMn.addr.ToString()); + CDeterministicMNCPtr mnMixing; + if (session.GetMixingMasternodeInfo(mnMixing) && mnMixing->pdmnState->addr == dmn->pdmnState->addr && session.GetState() == POOL_STATE_QUEUE) { + LogPrint("privatesend", "DSQUEUE -- PrivateSend queue (%s) is ready on masternode %s\n", dsq.ToString(), dmn->pdmnState->addr.ToString()); session.SubmitDenominate(connman); return; } @@ -89,25 +89,26 @@ void CPrivateSendClientManager::ProcessMessage(CNode* pfrom, const std::string& 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", infoMn.addr.ToString()); + LogPrint("privatesend", "DSQUEUE -- Masternode %s is sending WAY too many dsq messages\n", dmn->pdmnState->ToString()); return; } } - int nThreshold = infoMn.nLastDsq + mnodeman.CountMasternodes() / 5; - LogPrint("privatesend", "DSQUEUE -- nLastDsq: %d threshold: %d nDsqCount: %d\n", infoMn.nLastDsq, nThreshold, mnodeman.nDsqCount); + int64_t nLastDsq = mnodeman.GetLastDsq(dsq.masternodeOutpoint); + 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 (infoMn.nLastDsq != 0 && nThreshold > mnodeman.nDsqCount) { - LogPrint("privatesend", "DSQUEUE -- Masternode %s is sending too many dsq messages\n", infoMn.addr.ToString()); + if (nLastDsq != 0 && nThreshold > mnodeman.nDsqCount) { + LogPrint("privatesend", "DSQUEUE -- Masternode %s is sending too many dsq messages\n", dmn->proTxHash.ToString()); return; } if (!mnodeman.AllowMixing(dsq.masternodeOutpoint)) return; - LogPrint("privatesend", "DSQUEUE -- new PrivateSend queue (%s) from masternode %s\n", dsq.ToString(), infoMn.addr.ToString()); + LogPrint("privatesend", "DSQUEUE -- new PrivateSend queue (%s) from masternode %s\n", dsq.ToString(), dmn->pdmnState->addr.ToString()); for (auto& session : deqSessions) { - masternode_info_t mnMixing; - if (session.GetMixingMasternodeInfo(mnMixing) && mnMixing.outpoint == dsq.masternodeOutpoint) { + CDeterministicMNCPtr mnMixing; + if (session.GetMixingMasternodeInfo(mnMixing) && mnMixing->collateralOutpoint == dsq.masternodeOutpoint) { dsq.fTried = true; } } @@ -139,8 +140,8 @@ void CPrivateSendClientSession::ProcessMessage(CNode* pfrom, const std::string& return; } - if (!infoMixingMasternode.fInfoValid) return; - if (infoMixingMasternode.addr != pfrom->addr) { + if (!mixingMasternode) return; + if (mixingMasternode->pdmnState->addr != pfrom->addr) { //LogPrintf("DSSTATUSUPDATE -- message doesn't match current Masternode: infoMixingMasternode %s addr %s\n", infoMixingMasternode.addr.ToString(), pfrom->addr.ToString()); return; } @@ -181,8 +182,8 @@ void CPrivateSendClientSession::ProcessMessage(CNode* pfrom, const std::string& return; } - if (!infoMixingMasternode.fInfoValid) return; - if (infoMixingMasternode.addr != pfrom->addr) { + if (!mixingMasternode) return; + if (mixingMasternode->pdmnState->addr != pfrom->addr) { //LogPrintf("DSFINALTX -- message doesn't match current Masternode: infoMixingMasternode %s addr %s\n", infoMixingMasternode.addr.ToString(), pfrom->addr.ToString()); return; } @@ -208,9 +209,9 @@ void CPrivateSendClientSession::ProcessMessage(CNode* pfrom, const std::string& return; } - if (!infoMixingMasternode.fInfoValid) return; - if (infoMixingMasternode.addr != pfrom->addr) { - LogPrint("privatesend", "DSCOMPLETE -- message doesn't match current Masternode: infoMixingMasternode=%s addr=%s\n", infoMixingMasternode.addr.ToString(), pfrom->addr.ToString()); + if (!mixingMasternode) return; + if (mixingMasternode->pdmnState->addr != pfrom->addr) { + LogPrint("privatesend", "DSCOMPLETE -- message doesn't match current Masternode: infoMixingMasternode=%s addr=%s\n", mixingMasternode->pdmnState->addr.ToString(), pfrom->addr.ToString()); return; } @@ -258,7 +259,7 @@ void CPrivateSendClientSession::SetNull() // Client side nEntriesCount = 0; fLastEntryAccepted = false; - infoMixingMasternode = masternode_info_t(); + mixingMasternode = nullptr; pendingDsaRequest = CPendingDsaRequest(); CPrivateSendBaseSession::SetNull(); @@ -368,22 +369,22 @@ std::string CPrivateSendClientManager::GetSessionDenoms() return strSessionDenoms.empty() ? "N/A" : strSessionDenoms; } -bool CPrivateSendClientSession::GetMixingMasternodeInfo(masternode_info_t& mnInfoRet) const +bool CPrivateSendClientSession::GetMixingMasternodeInfo(CDeterministicMNCPtr& ret) const { - mnInfoRet = infoMixingMasternode.fInfoValid ? infoMixingMasternode : masternode_info_t(); - return infoMixingMasternode.fInfoValid; + ret = mixingMasternode; + return ret != nullptr; } -bool CPrivateSendClientManager::GetMixingMasternodesInfo(std::vector& vecMnInfoRet) const +bool CPrivateSendClientManager::GetMixingMasternodesInfo(std::vector& vecDmnsRet) const { LOCK(cs_deqsessions); for (const auto& session : deqSessions) { - masternode_info_t mnInfo; - if (session.GetMixingMasternodeInfo(mnInfo)) { - vecMnInfoRet.push_back(mnInfo); + CDeterministicMNCPtr dmn; + if (session.GetMixingMasternodeInfo(dmn)) { + vecDmnsRet.push_back(dmn); } } - return !vecMnInfoRet.empty(); + return !vecDmnsRet.empty(); } // @@ -578,7 +579,7 @@ bool CPrivateSendClientSession::SignFinalTransaction(const CTransaction& finalTr if (!pwalletMain) return false; if (fMasternodeMode || pnode == nullptr) return false; - if (!infoMixingMasternode.fInfoValid) return false; + if (!mixingMasternode) return false; finalMutableTransaction = finalTransactionNew; LogPrintf("CPrivateSendClientSession::SignFinalTransaction -- finalMutableTransaction=%s", finalMutableTransaction.ToString()); @@ -588,7 +589,7 @@ bool CPrivateSendClientSession::SignFinalTransaction(const CTransaction& finalTr sort(finalMutableTransaction.vout.begin(), finalMutableTransaction.vout.end(), CompareOutputBIP69()); if (finalMutableTransaction.GetHash() != finalTransactionNew.GetHash()) { - LogPrintf("CPrivateSendClientSession::SignFinalTransaction -- WARNING! Masternode %s is not BIP69 compliant!\n", infoMixingMasternode.outpoint.ToStringShort()); + LogPrintf("CPrivateSendClientSession::SignFinalTransaction -- WARNING! Masternode %s is not BIP69 compliant!\n", mixingMasternode->proTxHash.ToString()); UnlockCoins(); keyHolderStorage.ReturnAll(); SetNull(); @@ -832,7 +833,7 @@ bool CPrivateSendClientSession::DoAutomaticDenominating(CConnman& connman, bool return false; } - if (mnodeman.size() == 0) { + if (deterministicMNManager->GetListAtChainTip().GetValidMNsCount() == 0) { LogPrint("privatesend", "CPrivateSendClientSession::DoAutomaticDenominating -- No Masternodes detected\n"); strAutoDenomResult = _("No Masternodes detected."); return false; @@ -952,7 +953,7 @@ bool CPrivateSendClientManager::DoAutomaticDenominating(CConnman& connman, bool return false; } - int nMnCountEnabled = mnodeman.CountEnabled(MIN_PRIVATESEND_PEER_PROTO_VERSION); + int nMnCountEnabled = deterministicMNManager->GetListAtChainTip().GetValidMNsCount(); // If we've used 90% of the Masternode list then drop the oldest first ~30% int nThreshold_high = nMnCountEnabled * 0.9; @@ -999,22 +1000,22 @@ bool CPrivateSendClientSession::JoinExistingQueue(CAmount nBalanceNeedsAnonymize { if (!pwalletMain) return false; + auto mnList = deterministicMNManager->GetListAtChainTip(); + std::vector vecStandardDenoms = CPrivateSend::GetStandardDenominations(); // Look through the queues and see if anything matches CPrivateSendQueue dsq; while (privateSendClient.GetQueueItemAndTry(dsq)) { - masternode_info_t infoMn; + auto dmn = mnList.GetValidMNByCollateral(dsq.masternodeOutpoint); - if (!mnodeman.GetMasternodeInfo(dsq.masternodeOutpoint, infoMn)) { + if (!dmn) { LogPrintf("CPrivateSendClientSession::JoinExistingQueue -- dsq masternode is not in masternode list, masternode=%s\n", dsq.masternodeOutpoint.ToStringShort()); continue; } - if (infoMn.nProtocolVersion < MIN_PRIVATESEND_PEER_PROTO_VERSION) continue; - // skip next mn payments winners - if (mnpayments.IsScheduled(infoMn, 0)) { - LogPrintf("CPrivateSendClientSession::JoinExistingQueue -- skipping winner, masternode=%s\n", infoMn.outpoint.ToStringShort()); + if (mnpayments.IsScheduled(dmn, 0)) { + LogPrintf("CPrivateSendClientSession::JoinExistingQueue -- skipping winner, masternode=%s\n", dmn->proTxHash.ToString()); continue; } @@ -1042,20 +1043,20 @@ bool CPrivateSendClientSession::JoinExistingQueue(CAmount nBalanceNeedsAnonymize privateSendClient.AddUsedMasternode(dsq.masternodeOutpoint); - if (connman.IsMasternodeOrDisconnectRequested(infoMn.addr)) { - LogPrintf("CPrivateSendClientSession::JoinExistingQueue -- skipping masternode connection, addr=%s\n", infoMn.addr.ToString()); + if (connman.IsMasternodeOrDisconnectRequested(dmn->pdmnState->addr)) { + LogPrintf("CPrivateSendClientSession::JoinExistingQueue -- skipping masternode connection, addr=%s\n", dmn->pdmnState->addr.ToString()); continue; } nSessionDenom = dsq.nDenom; - infoMixingMasternode = infoMn; - pendingDsaRequest = CPendingDsaRequest(infoMn.addr, CPrivateSendAccept(nSessionDenom, txMyCollateral)); - connman.AddPendingMasternode(infoMn.addr); + mixingMasternode = dmn; + pendingDsaRequest = CPendingDsaRequest(dmn->pdmnState->addr, CPrivateSendAccept(nSessionDenom, txMyCollateral)); + connman.AddPendingMasternode(dmn->pdmnState->addr); // TODO: add new state POOL_STATE_CONNECTING and bump MIN_PRIVATESEND_PEER_PROTO_VERSION SetState(POOL_STATE_QUEUE); nTimeLastSuccessfulStep = GetTime(); LogPrintf("CPrivateSendClientSession::JoinExistingQueue -- pending connection (from queue): nSessionDenom: %d (%s), addr=%s\n", - nSessionDenom, CPrivateSend::GetDenominationsToString(nSessionDenom), infoMn.addr.ToString()); + nSessionDenom, CPrivateSend::GetDenominationsToString(nSessionDenom), dmn->pdmnState->addr.ToString()); strAutoDenomResult = _("Trying to connect..."); return true; } @@ -1068,7 +1069,7 @@ bool CPrivateSendClientSession::StartNewQueue(CAmount nValueMin, CAmount nBalanc if (!pwalletMain) return false; int nTries = 0; - int nMnCount = mnodeman.CountMasternodes(); + int nMnCount = deterministicMNManager->GetListAtChainTip().GetValidMNsCount(); // ** find the coins we'll use std::vector vecTxIn; @@ -1082,39 +1083,40 @@ bool CPrivateSendClientSession::StartNewQueue(CAmount nValueMin, CAmount nBalanc // otherwise, try one randomly while (nTries < 10) { - masternode_info_t infoMn = privateSendClient.GetNotUsedMasternode(); + auto dmn = privateSendClient.GetRandomNotUsedMasternode(); - if (!infoMn.fInfoValid) { + if (!dmn) { LogPrintf("CPrivateSendClientSession::StartNewQueue -- Can't find random masternode!\n"); strAutoDenomResult = _("Can't find random Masternode."); return false; } - privateSendClient.AddUsedMasternode(infoMn.outpoint); + privateSendClient.AddUsedMasternode(dmn->collateralOutpoint); // skip next mn payments winners - if (mnpayments.IsScheduled(infoMn, 0)) { - LogPrintf("CPrivateSendClientSession::StartNewQueue -- skipping winner, masternode=%s\n", infoMn.outpoint.ToStringShort()); + if (mnpayments.IsScheduled(dmn, 0)) { + LogPrintf("CPrivateSendClientSession::StartNewQueue -- skipping winner, masternode=%s\n", dmn->proTxHash.ToString()); nTries++; continue; } - if (infoMn.nLastDsq != 0 && infoMn.nLastDsq + nMnCount / 5 > mnodeman.nDsqCount) { + int64_t nLastDsq = mnodeman.GetLastDsq(dmn->collateralOutpoint); + if (nLastDsq != 0 && nLastDsq + nMnCount / 5 > mnodeman.nDsqCount) { LogPrintf("CPrivateSendClientSession::StartNewQueue -- Too early to mix on this masternode!" " masternode=%s addr=%s nLastDsq=%d CountEnabled/5=%d nDsqCount=%d\n", - infoMn.outpoint.ToStringShort(), infoMn.addr.ToString(), infoMn.nLastDsq, + dmn->proTxHash.ToString(), dmn->pdmnState->addr.ToString(), nLastDsq, nMnCount / 5, mnodeman.nDsqCount); nTries++; continue; } - if (connman.IsMasternodeOrDisconnectRequested(infoMn.addr)) { - LogPrintf("CPrivateSendClientSession::StartNewQueue -- skipping masternode connection, addr=%s\n", infoMn.addr.ToString()); + if (connman.IsMasternodeOrDisconnectRequested(dmn->pdmnState->addr)) { + LogPrintf("CPrivateSendClientSession::StartNewQueue -- skipping masternode connection, addr=%s\n", dmn->pdmnState->addr.ToString()); nTries++; continue; } - LogPrintf("CPrivateSendClientSession::StartNewQueue -- attempt %d connection to Masternode %s\n", nTries, infoMn.addr.ToString()); + LogPrintf("CPrivateSendClientSession::StartNewQueue -- attempt %d connection to Masternode %s\n", nTries, dmn->pdmnState->addr.ToString()); std::vector vecAmounts; pwalletMain->ConvertList(vecTxIn, vecAmounts); @@ -1123,14 +1125,14 @@ bool CPrivateSendClientSession::StartNewQueue(CAmount nValueMin, CAmount nBalanc nSessionDenom = CPrivateSend::GetDenominationsByAmounts(vecAmounts); } - infoMixingMasternode = infoMn; - connman.AddPendingMasternode(infoMn.addr); - pendingDsaRequest = CPendingDsaRequest(infoMn.addr, CPrivateSendAccept(nSessionDenom, txMyCollateral)); + mixingMasternode = dmn; + connman.AddPendingMasternode(dmn->pdmnState->addr); + pendingDsaRequest = CPendingDsaRequest(dmn->pdmnState->addr, CPrivateSendAccept(nSessionDenom, txMyCollateral)); // TODO: add new state POOL_STATE_CONNECTING and bump MIN_PRIVATESEND_PEER_PROTO_VERSION SetState(POOL_STATE_QUEUE); nTimeLastSuccessfulStep = GetTime(); LogPrintf("CPrivateSendClientSession::StartNewQueue -- pending connection, nSessionDenom: %d (%s), addr=%s\n", - nSessionDenom, CPrivateSend::GetDenominationsToString(nSessionDenom), infoMn.addr.ToString()); + nSessionDenom, CPrivateSend::GetDenominationsToString(nSessionDenom), dmn->pdmnState->addr.ToString()); strAutoDenomResult = _("Trying to connect..."); return true; } @@ -1596,9 +1598,9 @@ bool CPrivateSendClientSession::CreateDenominated(const CompactTallyItem& tallyI void CPrivateSendClientSession::RelayIn(const CPrivateSendEntry& entry, CConnman& connman) { - if (!infoMixingMasternode.fInfoValid) return; + if (!mixingMasternode) return; - connman.ForNode(infoMixingMasternode.addr, [&entry, &connman](CNode* pnode) { + connman.ForNode(mixingMasternode->pdmnState->addr, [&entry, &connman](CNode* pnode) { LogPrintf("CPrivateSendClientSession::RelayIn -- found master, relaying message to %s\n", pnode->addr.ToString()); CNetMsgMaker msgMaker(pnode->GetSendVersion()); connman.PushMessage(pnode, msgMaker.Make(NetMsgType::DSVIN, entry)); diff --git a/src/privatesend-client.h b/src/privatesend-client.h index aec8a97d3db75..245089793ebea 100644 --- a/src/privatesend-client.h +++ b/src/privatesend-client.h @@ -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; @@ -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; @@ -139,7 +142,7 @@ class CPrivateSendClientSession : public CPrivateSendBaseSession fLastEntryAccepted(false), strLastMessage(), strAutoDenomResult(), - infoMixingMasternode(), + mixingMasternode(), txMyCollateral(), pendingDsaRequest(), keyHolderStorage() @@ -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); @@ -235,7 +238,7 @@ class CPrivateSendClientManager : public CPrivateSendBaseManager std::string GetStatuses(); std::string GetSessionDenoms(); - bool GetMixingMasternodesInfo(std::vector& vecMnInfoRet) const; + bool GetMixingMasternodesInfo(std::vector& vecDmnsRet) const; /// Passively run mixing in the background according to the configuration in settings bool DoAutomaticDenominating(CConnman& connman, bool fDryRun = false); diff --git a/src/privatesend-server.cpp b/src/privatesend-server.cpp index 57f8267f67ea8..51472a21ba64e 100644 --- a/src/privatesend-server.cpp +++ b/src/privatesend-server.cpp @@ -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; } @@ -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; @@ -111,12 +113,12 @@ 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; } @@ -124,21 +126,22 @@ void CPrivateSendServer::ProcessMessage(CNode* pfrom, const std::string& strComm 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); } diff --git a/src/rpc/masternode.cpp b/src/rpc/masternode.cpp index 87d8497648ea3..e98ea85a3f713 100644 --- a/src/rpc/masternode.cpp +++ b/src/rpc/masternode.cpp @@ -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 vecMnInfo; - if (privateSendClient.GetMixingMasternodesInfo(vecMnInfo)) { + std::vector 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));