diff --git a/src/coinjoin/server.cpp b/src/coinjoin/server.cpp index 6d9a3ba16578..f4fd8254d89d 100644 --- a/src/coinjoin/server.cpp +++ b/src/coinjoin/server.cpp @@ -490,7 +490,15 @@ void CCoinJoinServer::ChargeFees() const */ void CCoinJoinServer::ChargeRandomFees() const { - for (const auto& txCollateral : vecSessionCollaterals) { + AssertLockNotHeld(cs_coinjoin); + + std::vector session_collaterals; + { + LOCK(cs_coinjoin); + session_collaterals = vecSessionCollaterals; + } + + for (const auto& txCollateral : session_collaterals) { if (GetRand(/*nMax=*/100) > 10) return; LogPrint(BCLog::COINJOIN, /* Continued */ "CCoinJoinServer::ChargeRandomFees -- charging random fees, txCollateral=%s", txCollateral->ToString()); diff --git a/src/coinjoin/server.h b/src/coinjoin/server.h index 0c11576118fd..49cb7a3002d7 100644 --- a/src/coinjoin/server.h +++ b/src/coinjoin/server.h @@ -60,7 +60,7 @@ class CCoinJoinServer : public CCoinJoinBaseSession, public NetHandler /// Charge fees to bad actors (Charge clients a fee if they're abusive) void ChargeFees() const EXCLUSIVE_LOCKS_REQUIRED(!cs_coinjoin); /// Rarely charge fees to pay miners - void ChargeRandomFees() const; + void ChargeRandomFees() const EXCLUSIVE_LOCKS_REQUIRED(!cs_coinjoin); /// Consume collateral in cases when peer misbehaved void ConsumeCollateral(const CTransactionRef& txref) const;