34 LogPrintf(
"DSACCEPT -- queue is already full!\n");
41 vRecv >> nDenom >> txCollateral;
64 LogPrintf(
"DSACCEPT -- is compatible, please submit!\n");
68 LogPrintf(
"DSACCEPT -- not compatible with existing transactions!\n");
78 LogPrint(
"privatesend",
"DSQUEUE -- incompatible version! nVersion: %d\n", pfrom->
nVersion);
93 LogPrint(
"privatesend",
"DSQUEUE -- %s new\n", dsq.ToString());
95 if(dsq.IsExpired())
return;
108 if(q.
vin == dsq.vin) {
110 LogPrint(
"privatesend",
"DSQUEUE -- Masternode %s is sending WAY too many dsq messages\n", mnInfo.
addr.
ToString());
119 LogPrint(
"privatesend",
"DSQUEUE -- Masternode %s is sending too many dsq messages\n", mnInfo.
addr.
ToString());
124 LogPrint(
"privatesend",
"DSQUEUE -- new PrivateSend queue (%s) from masternode %s\n", dsq.ToString(), mnInfo.
addr.
ToString());
139 LogPrintf(
"DSVIN -- session not complete!\n");
147 LogPrint(
"privatesend",
"DSVIN -- txCollateral %s", entry.txCollateral.ToString());
163 LogPrintf(
"DSVIN -- not compatible with existing transactions!\n");
175 BOOST_FOREACH(
const CTxOut txout, entry.vecTxDSOut) {
176 nValueOut += txout.
nValue;
177 tx.
vout.push_back(txout);
191 BOOST_FOREACH(
const CTxIn txin, entry.vecTxDSIn) {
192 tx.
vin.push_back(txin);
207 CAmount nFee = nValueIn - nValueOut;
209 LogPrintf(
"DSVIN -- there should be no fee in mixing tx! fees: %lld, tx=%s", nFee, tx.
ToString());
228 entry.addr = pfrom->
addr;
241 LogPrintf(
"DSSIGNFINALTX -- incompatible version! nVersion: %d\n", pfrom->
nVersion);
245 std::vector<CTxIn> vecTxIn;
248 LogPrint(
"privatesend",
"DSSIGNFINALTX -- vecTxIn.size() %s\n", vecTxIn.size());
251 int nTxInsCount = (int)vecTxIn.size();
253 BOOST_FOREACH(
const CTxIn txin, vecTxIn) {
256 LogPrint(
"privatesend",
"DSSIGNFINALTX -- AddScriptSig() failed at %d/%d, session: %d\n", nTxInIndex, nTxInsCount,
nSessionID);
260 LogPrint(
"privatesend",
"DSSIGNFINALTX -- AddScriptSig() %d/%d success\n", nTxInIndex, nTxInsCount);
285 LogPrint(
"privatesend",
"CPrivateSendServer::CheckPool -- FINALIZE TRANSACTIONS\n");
292 LogPrint(
"privatesend",
"CPrivateSendServer::CheckPool -- SIGNING\n");
300 LogPrint(
"privatesend",
"CPrivateSendServer::CheckPool -- timeout, RESETTING\n");
307 LogPrint(
"privatesend",
"CPrivateSendServer::CreateFinalTransaction -- FINALIZE TRANSACTIONS\n");
314 txNew.
vout.push_back(txdsout);
317 txNew.
vin.push_back(txdsin);
324 LogPrint(
"privatesend",
"CPrivateSendServer::CreateFinalTransaction -- finalMutableTransaction=%s", txNew.
ToString());
338 LogPrint(
"privatesend",
"CPrivateSendServer::CommitFinalTransaction -- finalTransaction=%s", finalTransaction.
ToString());
347 LogPrintf(
"CPrivateSendServer::CommitFinalTransaction -- AcceptToMemoryPool() error: Transaction not valid\n");
355 LogPrintf(
"CPrivateSendServer::CommitFinalTransaction -- CREATING DSTX\n");
364 LogPrintf(
"CPrivateSendServer::CommitFinalTransaction -- TRANSMITTING DSTX\n");
376 LogPrint(
"privatesend",
"CPrivateSendServer::CommitFinalTransaction -- COMPLETED -- RESETTING\n");
399 std::vector<CTransaction> vecOffendersCollaterals;
410 LogPrintf(
"CPrivateSendServer::ChargeFees -- found uncooperative node (didn't send transaction), found offence\n");
411 vecOffendersCollaterals.push_back(txCollateral);
421 LogPrintf(
"CPrivateSendServer::ChargeFees -- found uncooperative node (didn't sign), found offence\n");
429 if(vecOffendersCollaterals.empty())
return;
438 std::random_shuffle(vecOffendersCollaterals.begin(), vecOffendersCollaterals.end());
441 LogPrintf(
"CPrivateSendServer::ChargeFees -- found uncooperative node (didn't %s transaction), charging fees: %s\n",
450 LogPrintf(
"CPrivateSendServer::ChargeFees -- ERROR: AcceptToMemoryPool failed!\n");
479 LogPrintf(
"CPrivateSendServer::ChargeRandomFees -- charging random fees, txCollateral=%s", txCollateral.
ToString());
485 LogPrintf(
"CPrivateSendServer::ChargeRandomFees -- ERROR: AcceptToMemoryPool failed!\n");
504 if((*it).IsExpired()) {
505 LogPrint(
"privatesend",
"CPrivateSendServer::CheckTimeout -- Removing expired queue (%s)\n", (*it).ToString());
518 LogPrint(
"privatesend",
"CPrivateSendServer::CheckTimeout -- %s timed out (%ds) -- restting\n",
539 LogPrint(
"privatesend",
"CPrivateSendServer::CheckForCompleteQueue -- queue is ready, signing and relaying (%s)\n", dsq.
ToString());
559 txNew.
vout.push_back(txdsout);
562 txNew.
vin.push_back(txdsin);
572 if(nTxInIndex >= 0) {
576 LogPrint(
"privatesend",
"CPrivateSendServer::IsInputScriptSigValid -- VerifyScript() failed on input %d\n", nTxInIndex);
580 LogPrint(
"privatesend",
"CPrivateSendServer::IsInputScriptSigValid -- Failed to find matching input in pool, %s\n", txin.
ToString());
584 LogPrint(
"privatesend",
"CPrivateSendServer::IsInputScriptSigValid -- Successfully validated input and scriptSig\n");
597 LogPrint(
"privatesend",
"CPrivateSendServer::AddEntry -- input not valid!\n");
604 LogPrint(
"privatesend",
"CPrivateSendServer::AddEntry -- collateral not valid!\n");
610 LogPrint(
"privatesend",
"CPrivateSendServer::AddEntry -- entries is full!\n");
620 LogPrint(
"privatesend",
"CPrivateSendServer::AddEntry -- found in txin\n");
630 LogPrint(
"privatesend",
"CPrivateSendServer::AddEntry -- adding entry\n");
644 LogPrint(
"privatesend",
"CPrivateSendServer::AddScriptSig -- already exists\n");
651 LogPrint(
"privatesend",
"CPrivateSendServer::AddScriptSig -- Invalid scriptSig\n");
661 LogPrint(
"privatesend",
"CPrivateSendServer::AddScriptSig -- adding to finalMutableTransaction, scriptSig=%s\n",
ScriptToAsmStr(txinNew.
scriptSig).substr(0,24));
671 LogPrintf(
"CPrivateSendServer::AddScriptSig -- Couldn't set sig!\n" );
680 if(!txdsin.
fHasSig)
return false;
690 LogPrintf(
"CPrivateSendServer::IsOutputsCompatibleWithSessionDenom -- vecTxDSOut denom %d, entry.vecTxDSOut denom %d\n",
703 std::vector<int> vecBits;
705 LogPrint(
"privatesend",
"CPrivateSendServer::IsAcceptableDenomAndCollateral -- denom not valid!\n");
712 LogPrint(
"privatesend",
"CPrivateSendServer::IsAcceptableDenomAndCollateral -- collateral not valid!\n");
727 LogPrintf(
"CPrivateSendServer::CreateNewSession -- incompatible mode: nState=%d\n",
nState);
746 LogPrint(
"privatesend",
"CPrivateSendServer::CreateNewSession -- signing and relaying new queue: %s\n", dsq.
ToString());
753 LogPrintf(
"CPrivateSendServer::CreateNewSession -- new session created, nSessionID: %d nSessionDenom: %d (%s) vecSessionCollaterals.size(): %d\n",
770 LogPrintf(
"CPrivateSendServer::AddUserToExistingSession -- incompatible mode: nState=%d\n",
nState);
775 LogPrintf(
"CPrivateSendServer::AddUserToExistingSession -- incompatible denom %d (%s) != nSessionDenom %d (%s)\n",
787 LogPrintf(
"CPrivateSendServer::AddUserToExistingSession -- new user accepted, nSessionID: %d nSessionDenom: %d (%s) vecSessionCollaterals.size(): %d\n",
795 LogPrint(
"privatesend",
"CPrivateSendServer::%s -- nSessionID: %d nSessionDenom: %d (%s)\n",
800 bool fOk = connman.
ForNode(entry.addr, [&txFinal, &connman,
this](
CNode* pnode) {
801 connman.PushMessage(pnode, NetMsgType::DSFINALTX, nSessionID, txFinal);
820 unsigned int nDisconnected{};
824 bool fOk = connman.
ForNode(entry.addr, [&nStatusUpdate, &nMessageID, &connman,
this](
CNode* pnode) {
825 PushStatus(pnode, nStatusUpdate, nMessageID, connman);
833 if (nDisconnected == 0)
return;
836 LogPrintf(
"CPrivateSendServer::%s -- can't continue, %llu client(s) disconnected, nSessionID: %d nSessionDenom: %d (%s)\n",
841 connman.
ForNode(entry.addr, [&connman,
this](
CNode* pnode) {
842 PushStatus(pnode, STATUS_REJECTED, MSG_NOERR, connman);
856 LogPrint(
"privatesend",
"CPrivateSendServer::%s -- nSessionID: %d nSessionDenom: %d (%s)\n",
861 bool fOk = connman.
ForNode(entry.addr, [&nMessageID, &connman,
this](
CNode* pnode) {
862 connman.PushMessage(pnode, NetMsgType::DSCOMPLETE, nSessionID, (int)nMessageID);
876 LogPrint(
"privatesend",
"CPrivateSendServer::SetState -- Can't set state to ERROR or SUCCESS as a Masternode. \n");
880 LogPrintf(
"CPrivateSendServer::SetState -- nState: %d, nStateNew: %d\n",
nState, nStateNew);
889 static bool fOneThread;
890 if(fOneThread)
return;
896 unsigned int nTick = 0;
std::vector< CTransaction > vecSessionCollaterals
CMasternodeSync masternodeSync
CPrivateSendServer privateSendServer
void RelayTransaction(const CTransaction &tx)
void MilliSleep(int64_t n)
CActiveMasternode activeMasternode
#define TRY_LOCK(cs, name)
void CommitFinalTransaction(CConnman &connman)
bool GetUTXOCoins(const COutPoint &outpoint, CCoins &coins)
static const CAmount COIN
bool AddEntry(const CDarkSendEntry &entryNew, PoolMessage &nMessageIDRet)
Add a clients entry to the pool.
static std::string GetDenominationsToString(int nDenom)
int PoolMaxTransactions() const
bool ForNode(NodeId id, std::function< bool(const CNode *pnode)> cond, std::function< bool(CNode *pnode)> func)
std::string ToString() const
bool IsSessionReady()
Do we have enough users to take entries?
bool AcceptToMemoryPool(CTxMemPool &pool, CValidationState &state, const CTransaction &tx, bool fLimitFree, bool *pfMissingInputs, bool fOverrideMempoolLimit, bool fRejectAbsurdFee, bool fDryRun)
void RelayInv(CInv &inv, const int minProtoVersion=MIN_PEER_PROTO_VERSION)
static const int PRIVATESEND_QUEUE_TIMEOUT
void AskForMN(CNode *pnode, const COutPoint &outpoint, CConnman &connman)
Ask (source) node for mnb.
std::string ToString(bool fUseGetnameinfo=true) const
void RenameThread(const char *name)
static int GetDenominations(const std::vector< CTxOut > &vecTxOut, bool fSingleRandomDenom=false)
Get the denominations for a list of outputs (returns a bitshifted integer)
static void AddDSTX(const CDarksendBroadcastTx &dstx)
std::vector< CTxDSIn > vecTxDSIn
void CreateFinalTransaction(CConnman &connman)
bool IsOutputsCompatibleWithSessionDenom(const std::vector< CTxDSOut > &vecTxDSOut)
Are these outputs compatible with other client in the pool?
std::vector< CTxOut > vout
unspent transaction outputs; spent outputs are .IsNull(); spent outputs at the end of the array are d...
CCriticalSection cs_darksend
CTransaction txCollateral
static const CAmount PRIVATESEND_ENTRY_MAX_SIZE
std::string ScriptToAsmStr(const CScript &script, const bool fAttemptSighashDecode=false)
void CheckForCompleteQueue(CConnman &connman)
static int LogPrint(const char *category, const char *format)
std::string ToString() const
bool AddScriptSig(const CTxIn &txin)
Add signature to a txin.
bool Relay(CConnman &connman)
bool GetMasternodeInfo(const COutPoint &outpoint, masternode_info_t &mnInfoRet)
void SetState(PoolState nStateNew)
bool IsNormalPaymentScript() const
int64_t nTimeLastSuccessfulStep
bool AddUserToExistingSession(int nDenom, CTransaction txCollateral, PoolMessage &nMessageIDRet)
std::string ToString() const
static bool GetDenominationsBits(int nDenom, std::vector< int > &vecBitsRet)
CMutableTransaction finalMutableTransaction
void CheckPool(CConnman &connman)
Check for process.
void CheckTimeout(CConnman &connman)
bool VerifyScript(const CScript &scriptSig, const CScript &scriptPubKey, unsigned int flags, const BaseSignatureChecker &checker, ScriptError *serror)
static const int PRIVATESEND_SIGNING_TIMEOUT
std::vector< CTxOut > vout
const char * DSSIGNFINALTX
bool IsInputScriptSigValid(const CTxIn &txin)
Check to make sure a given input matches an input in the pool and its scriptSig is valid...
std::vector< CDarkSendEntry > vecEntries
int CountEnabled(int nProtocolVersion=-1)
bool CreateNewSession(int nDenom, CTransaction txCollateral, PoolMessage &nMessageIDRet, CConnman &connman)
int GetEntriesCount() const
const CChainParams & Params()
bool IsAcceptableDenomAndCollateral(int nDenom, CTransaction txCollateral, PoolMessage &nMessageIDRet)
Is this nDenom and txCollateral acceptable?
bool AllowMixing(const COutPoint &outpoint)
const uint256 & GetHash() const
static int GetMaxPoolTransactions()
Get the maximum number of transactions for the pool.
void PushStatus(CNode *pnode, PoolStatusUpdate nStatusUpdate, PoolMessage nMessageID, CConnman &connman)
int64_t GetAdjustedTime()
bool IsBlockchainSynced()
std::string ToString() const
static const int MIN_PRIVATESEND_PEER_PROTO_VERSION
minimum peer version accepted by mixing pool
bool IsSignaturesComplete()
Check that all inputs are signed. (Are all inputs signed?)
static bool IsCollateralValid(const CTransaction &txCollateral)
If the collateral is valid given by a client.
void ProcessMessage(CNode *pfrom, std::string &strCommand, CDataStream &vRecv, CConnman &connman)
void RelayCompletedTransaction(PoolMessage nMessageID, CConnman &connman)
void PrioritiseTransaction(const uint256 hash, const std::string strHash, double dPriorityDelta, const CAmount &nFeeDelta)
void ChargeRandomFees(CConnman &connman)
Rarely charge fees to pay miners.
void RelayStatus(PoolStatusUpdate nStatusUpdate, CConnman &connman, PoolMessage nMessageID=MSG_NOERR)
const char * DSSTATUSUPDATE
void ThreadCheckPrivateSendServer(CConnman &connman)
void ChargeFees(CConnman &connman)
Charge fees to bad actors (Charge clients a fee if they're abusive)
static CDarksendBroadcastTx GetDSTX(const uint256 &hash)
void PushMessage(CNode *pnode, const std::string &sCommand, Args &&... args)
std::atomic< int > nVersion
std::vector< CTxDSOut > vecTxDSOut
void RelayFinalTransaction(const CTransaction &txFinal, CConnman &connman)
Relay mixing Messages.
std::vector< CDarksendQueue > vecDarksendQueue