diff --git a/src/Makefile.am b/src/Makefile.am index 2e58ef28ef2f..792c884f0850 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -324,6 +324,7 @@ BITCOIN_CORE_H = \ util/enumerate.h \ util/epochguard.h \ util/error.h \ + util/expected.h \ util/fastrange.h \ util/fees.h \ util/golombrice.h \ diff --git a/src/coinjoin/client.cpp b/src/coinjoin/client.cpp index bf9776103f80..0df53e39e52c 100644 --- a/src/coinjoin/client.cpp +++ b/src/coinjoin/client.cpp @@ -11,7 +11,7 @@ #include #include #include -#include +#include #include #include #include @@ -29,24 +29,24 @@ #include #include -void CCoinJoinClientQueueManager::ProcessMessage(const CNode& peer, PeerManager& peerman, std::string_view msg_type, CDataStream& vRecv) +PeerMsgRet CCoinJoinClientQueueManager::ProcessMessage(const CNode& peer, std::string_view msg_type, CDataStream& vRecv) { - if (fMasternodeMode) return; - if (!m_mn_sync.IsBlockchainSynced()) return; + if (fMasternodeMode) return {}; + if (!m_mn_sync.IsBlockchainSynced()) return {}; if (msg_type == NetMsgType::DSQUEUE) { - CCoinJoinClientQueueManager::ProcessDSQueue(peer, peerman, vRecv); + return CCoinJoinClientQueueManager::ProcessDSQueue(peer, vRecv); } + return {}; } -void CCoinJoinClientQueueManager::ProcessDSQueue(const CNode& peer, PeerManager& peerman, CDataStream& vRecv) +PeerMsgRet CCoinJoinClientQueueManager::ProcessDSQueue(const CNode& peer, CDataStream& vRecv) { CCoinJoinQueue dsq; vRecv >> dsq; if (dsq.masternodeOutpoint.IsNull() && dsq.m_protxHash.IsNull()) { - peerman.Misbehaving(peer.GetId(), 100); - return; + return tl::unexpected{100}; } if (dsq.masternodeOutpoint.IsNull()) { @@ -54,8 +54,7 @@ void CCoinJoinClientQueueManager::ProcessDSQueue(const CNode& peer, PeerManager& if (auto dmn = mnList.GetValidMN(dsq.m_protxHash)) { dsq.masternodeOutpoint = dmn->collateralOutpoint; } else { - peerman.Misbehaving(peer.GetId(), 10); - return; + return tl::unexpected{10}; } } @@ -67,33 +66,32 @@ void CCoinJoinClientQueueManager::ProcessDSQueue(const CNode& peer, PeerManager& // process every dsq only once for (const auto &q: vecCoinJoinQueue) { if (q == dsq) { - return; + return {}; } if (q.fReady == dsq.fReady && q.masternodeOutpoint == dsq.masternodeOutpoint) { // no way the same mn can send another dsq with the same readiness this soon LogPrint(BCLog::COINJOIN, /* Continued */ "DSQUEUE -- Peer %s is sending WAY too many dsq messages for a masternode with collateral %s\n", peer.GetLogString(), dsq.masternodeOutpoint.ToStringShort()); - return; + return {}; } } } // cs_vecqueue LogPrint(BCLog::COINJOIN, "DSQUEUE -- %s new\n", dsq.ToString()); - if (dsq.IsTimeOutOfBounds()) return; + if (dsq.IsTimeOutOfBounds()) return {}; auto mnList = deterministicMNManager->GetListAtChainTip(); auto dmn = mnList.GetValidMNByCollateral(dsq.masternodeOutpoint); - if (!dmn) return; + if (!dmn) return {}; if (dsq.m_protxHash.IsNull()) { dsq.m_protxHash = dmn->proTxHash; } if (!dsq.CheckSignature(dmn->pdmnState->pubKeyOperator.Get())) { - peerman.Misbehaving(peer.GetId(), 10); - return; + return tl::unexpected{10}; } // if the queue is ready, submit if we can @@ -104,7 +102,7 @@ void CCoinJoinClientQueueManager::ProcessDSQueue(const CNode& peer, PeerManager& })) { LogPrint(BCLog::COINJOIN, "DSQUEUE -- CoinJoin queue (%s) is ready on masternode %s\n", dsq.ToString(), dmn->pdmnState->addr.ToString()); - return; + return {}; } else { int64_t nLastDsq = mmetaman->GetMetaInfo(dmn->proTxHash)->GetLastDsq(); int64_t nDsqThreshold = mmetaman->GetDsqThreshold(dmn->proTxHash, mnList.GetValidMNsCount()); @@ -114,7 +112,7 @@ void CCoinJoinClientQueueManager::ProcessDSQueue(const CNode& peer, PeerManager& if (nLastDsq != 0 && nDsqThreshold > mmetaman->GetDsqCount()) { LogPrint(BCLog::COINJOIN, "DSQUEUE -- Masternode %s is sending too many dsq messages\n", dmn->proTxHash.ToString()); - return; + return {}; } mmetaman->AllowMixing(dmn->proTxHash); @@ -129,9 +127,10 @@ void CCoinJoinClientQueueManager::ProcessDSQueue(const CNode& peer, PeerManager& } } // cs_ProcessDSQueue dsq.Relay(connman); + return {}; } -void CCoinJoinClientManager::ProcessMessage(CNode& peer, PeerManager& peerman, CConnman& connman, const CTxMemPool& mempool, std::string_view msg_type, CDataStream& vRecv) +void CCoinJoinClientManager::ProcessMessage(CNode& peer, CConnman& connman, const CTxMemPool& mempool, std::string_view msg_type, CDataStream& vRecv) { if (fMasternodeMode) return; if (!CCoinJoinClientOptions::IsEnabled()) return; @@ -150,7 +149,7 @@ void CCoinJoinClientManager::ProcessMessage(CNode& peer, PeerManager& peerman, C AssertLockNotHeld(cs_deqsessions); LOCK(cs_deqsessions); for (auto& session : deqSessions) { - session.ProcessMessage(peer, peerman, connman, mempool, msg_type, vRecv); + session.ProcessMessage(peer, connman, mempool, msg_type, vRecv); } } } @@ -164,7 +163,7 @@ CCoinJoinClientSession::CCoinJoinClientSession(CWallet& wallet, CoinJoinWalletMa m_queueman(queueman) {} -void CCoinJoinClientSession::ProcessMessage(CNode& peer, PeerManager& peerman, CConnman& connman, const CTxMemPool& mempool, std::string_view msg_type, CDataStream& vRecv) +void CCoinJoinClientSession::ProcessMessage(CNode& peer, CConnman& connman, const CTxMemPool& mempool, std::string_view msg_type, CDataStream& vRecv) { if (fMasternodeMode) return; if (!CCoinJoinClientOptions::IsEnabled()) return; diff --git a/src/coinjoin/client.h b/src/coinjoin/client.h index 1536c58af932..b3a12db68d9d 100644 --- a/src/coinjoin/client.h +++ b/src/coinjoin/client.h @@ -7,6 +7,8 @@ #include #include + +#include #include #include @@ -23,7 +25,6 @@ class CoinJoinWalletManager; class CNode; class CMasternodeSync; class CTxMemPool; -class PeerManager; class UniValue; @@ -159,7 +160,7 @@ class CCoinJoinClientSession : public CCoinJoinBaseSession explicit CCoinJoinClientSession(CWallet& wallet, CoinJoinWalletManager& walletman, const CMasternodeSync& mn_sync, const std::unique_ptr& queueman); - void ProcessMessage(CNode& peer, PeerManager& peerman, CConnman& connman, const CTxMemPool& mempool, std::string_view msg_type, CDataStream& vRecv); + void ProcessMessage(CNode& peer, CConnman& connman, const CTxMemPool& mempool, std::string_view msg_type, CDataStream& vRecv); void UnlockCoins(); @@ -196,8 +197,8 @@ class CCoinJoinClientQueueManager : public CCoinJoinBaseManager explicit CCoinJoinClientQueueManager(CConnman& _connman, CoinJoinWalletManager& walletman, const CMasternodeSync& mn_sync) : connman(_connman), m_walletman(walletman), m_mn_sync(mn_sync) {}; - void ProcessMessage(const CNode& peer, PeerManager& peerman, std::string_view msg_type, CDataStream& vRecv) LOCKS_EXCLUDED(cs_vecqueue); - void ProcessDSQueue(const CNode& peer, PeerManager& peerman, CDataStream& vRecv); + PeerMsgRet ProcessMessage(const CNode& peer, std::string_view msg_type, CDataStream& vRecv) LOCKS_EXCLUDED(cs_vecqueue); + PeerMsgRet ProcessDSQueue(const CNode& peer, CDataStream& vRecv); void DoMaintenance(); }; @@ -245,7 +246,7 @@ class CCoinJoinClientManager const std::unique_ptr& queueman) : m_wallet(wallet), m_walletman(walletman), m_mn_sync(mn_sync), m_queueman(queueman) {} - void ProcessMessage(CNode& peer, PeerManager& peerman, CConnman& connman, const CTxMemPool& mempool, std::string_view msg_type, CDataStream& vRecv) LOCKS_EXCLUDED(cs_deqsessions); + void ProcessMessage(CNode& peer, CConnman& connman, const CTxMemPool& mempool, std::string_view msg_type, CDataStream& vRecv) LOCKS_EXCLUDED(cs_deqsessions); bool StartMixing(); void StopMixing(); diff --git a/src/coinjoin/server.cpp b/src/coinjoin/server.cpp index c81abb5359f2..7d415023fcb4 100644 --- a/src/coinjoin/server.cpp +++ b/src/coinjoin/server.cpp @@ -10,10 +10,11 @@ #include #include #include -#include +#include #include #include