20 #include <boost/lexical_cast.hpp> 23 txCollateral(txCollateral), addr(
CService())
25 BOOST_FOREACH(
CTxIn txin, vecTxIn)
27 BOOST_FOREACH(
CTxOut txout, vecTxOut)
35 if(txdsin.
fHasSig)
return false;
52 std::string strMessage =
vin.
ToString() + boost::lexical_cast<std::string>(
nDenom) + boost::lexical_cast<std::string>(
nTime) + boost::lexical_cast<std::string>(
fReady);
64 std::string strMessage =
vin.
ToString() + boost::lexical_cast<std::string>(
nDenom) + boost::lexical_cast<std::string>(
nTime) + boost::lexical_cast<std::string>(
fReady);
65 std::string strError =
"";
68 LogPrintf(
"CDarksendQueue::CheckSignature -- Got bad Masternode queue signature: %s; error: %s\n",
ToString(), strError);
78 BOOST_FOREACH(
CNode* pnode, vNodesCopy)
93 LogPrintf(
"CDarksendBroadcastTx::Sign -- SignMessage() failed\n");
103 std::string strError =
"";
106 LogPrintf(
"CDarksendBroadcastTx::CheckSignature -- Got bad dstx signature, error: %s\n", strError);
140 default:
return "UNKNOWN";
176 if(txCollateral.
vout.empty())
return false;
177 if(txCollateral.
nLockTime != 0)
return false;
182 BOOST_FOREACH(
const CTxOut txout, txCollateral.
vout) {
183 nValueOut += txout.
nValue;
186 LogPrintf (
"CPrivateSend::IsCollateralValid -- Invalid Script, txCollateral=%s", txCollateral.
ToString());
191 BOOST_FOREACH(
const CTxIn txin, txCollateral.
vin) {
194 LogPrint(
"privatesend",
"CPrivateSend::IsCollateralValid -- Unknown inputs in collateral transaction, txCollateral=%s", txCollateral.
ToString());
202 LogPrint(
"privatesend",
"CPrivateSend::IsCollateralValid -- did not include enough fees in transaction: fees: %d, txCollateral=%s", nValueOut - nValueIn, txCollateral.
ToString());
206 LogPrint(
"privatesend",
"CPrivateSend::IsCollateralValid -- %s", txCollateral.
ToString());
212 LogPrint(
"privatesend",
"CPrivateSend::IsCollateralValid -- didn't pass AcceptToMemoryPool()\n");
232 std::string strDenom =
"";
235 if(nDenom >= (1 << nMaxDenoms)) {
236 return "out-of-bounds";
239 for (
int i = 0; i < nMaxDenoms; ++i) {
240 if(nDenom & (1 << i)) {
245 if(strDenom.empty()) {
254 std::vector<CTxOut> vecTxOut;
257 vecTxOut.push_back(
out);
273 std::vector<std::pair<CAmount, int> > vecDenomUsed;
277 vecDenomUsed.push_back(std::make_pair(nDenomValue, 0));
280 BOOST_FOREACH(
CTxOut txout, vecTxOut) {
283 if(txout.
nValue == s.first) {
295 int bit = (fSingleRandomDenom ?
GetRandInt(2) : 1) & s.second;
296 nDenom |= bit << c++;
297 if(fSingleRandomDenom && bit)
break;
313 if(nDenom >= (1 << nMaxDenoms))
return false;
317 for (
int i = 0; i < nMaxDenoms; ++i) {
318 if(nDenom & (1 << i)) {
319 vecBitsRet.push_back(i);
323 return !vecBitsRet.empty();
329 std::vector<CTxOut> vecTxOut;
331 BOOST_REVERSE_FOREACH(
CAmount nAmount, vecAmount) {
332 CTxOut txout(nAmount, scriptTmp);
333 vecTxOut.push_back(txout);
341 switch (nMessageID) {
343 case ERR_DENOM:
return _(
"No matching denominations found for mixing.");
345 case ERR_EXISTING_TX:
return _(
"Not compatible with existing transactions.");
346 case ERR_FEES:
return _(
"Transaction fees are too high.");
351 case ERR_MAXIMUM:
return _(
"Entry exceeds maximum size.");
352 case ERR_MN_LIST:
return _(
"Not in the Masternode list.");
353 case ERR_MODE:
return _(
"Incompatible mode.");
357 case ERR_RECENT:
return _(
"Last PrivateSend was too recent.");
359 case ERR_MISSING_TX:
return _(
"Missing input transaction information.");
361 case MSG_NOERR:
return _(
"No errors detected.");
362 case MSG_SUCCESS:
return _(
"Transaction created successfully.");
364 default:
return _(
"Unknown response.");
384 std::map<uint256, CDarksendBroadcastTx>::iterator it =
mapDSTX.begin();
386 if (it->second.IsExpired(nHeight)) {
392 LogPrint(
"privatesend",
"CPrivateSend::CheckDSTXes -- mapDSTX.size()=%llu\n",
mapDSTX.size());
402 if (!
mapDSTX.count(txHash))
return;
411 LogPrint(
"privatesend",
"CPrivateSendClient::SyncTransaction -- Failed to find block %s\n", blockHash.
ToString());
414 pblockindex = mi->second;
416 mapDSTX[txHash].SetConfirmedHeight(pblockindex ? pblockindex->
nHeight : -1);
417 LogPrint(
"privatesend",
"CPrivateSendClient::SyncTransaction -- txid=%s\n", txHash.
ToString());
425 static bool fOneThread;
426 if(fOneThread)
return;
432 unsigned int nTick = 0;
453 if(nTick % 60 == 0) {
463 if(nTick % (60 * 5) == 0) {
std::string GetStateString() const
CMasternodeSync masternodeSync
void MilliSleep(int64_t n)
CActiveMasternode activeMasternode
bool GetUTXOCoins(const COutPoint &outpoint, CCoins &coins)
static const CAmount COIN
static std::string GetDenominationsToString(int nDenom)
void ProcessTick(CConnman &connman)
bool AddScriptSig(const CTxIn &txin)
static CAmount GetCollateralAmount()
bool AcceptToMemoryPool(CTxMemPool &pool, CValidationState &state, const CTransaction &tx, bool fLimitFree, bool *pfMissingInputs, bool fOverrideMempoolLimit, bool fRejectAbsurdFee, bool fDryRun)
std::vector< unsigned char > vchSig
static std::vector< CAmount > vecStandardDenominations
static void SyncTransaction(const CTransaction &tx, const CBlock *pblock)
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)
bool CheckSignature(const CPubKey &pubKeyMasternode)
std::vector< CTxDSIn > vecTxDSIn
void Check()
Check all Masternodes.
bool IsExpired(int nHeight)
void ReleaseNodeVector(const std::vector< CNode *> &vecNodes)
std::vector< CTxOut > vout
unspent transaction outputs; spent outputs are .IsNull(); spent outputs at the end of the array are d...
CMasternodePayments mnpayments
static int LogPrint(const char *category, const char *format)
std::string ToString() const
static CCriticalSection cs_mapdstx
bool Relay(CConnman &connman)
void DoFullVerificationStep(CConnman &connman)
bool IsNormalPaymentScript() const
int64_t nTimeLastSuccessfulStep
static std::string GetMessageByID(PoolMessage nMessageID)
static bool VerifyMessage(const CPubKey pubkey, const std::vector< unsigned char > &vchSig, const std::string strMessage, std::string &strErrorRet)
Verify the message signature, returns true if succcessful.
std::string ToString() const
static bool GetDenominationsBits(int nDenom, std::vector< int > &vecBitsRet)
void ProcessMasternodeConnections(CConnman &connman)
std::vector< CNode * > CopyNodeVector()
CMutableTransaction finalMutableTransaction
void DoMaintenance(CConnman &connman)
std::string FormatMoney(const CAmount &n)
static const int MASTERNODE_MIN_MNP_SECONDS
static std::map< uint256, CDarksendBroadcastTx > mapDSTX
std::vector< CTxOut > vout
void ManageState(CConnman &connman)
Manage state of active Masternode.
const std::vector< CTxIn > vin
std::vector< CDarkSendEntry > vecEntries
const uint256 & GetHash() const
bool IsBlockchainSynced()
std::string ToString() const
static const int MIN_PRIVATESEND_PEER_PROTO_VERSION
minimum peer version accepted by mixing pool
bool CheckSignature(const CPubKey &pubKeyMasternode)
Check if we have a valid Masternode address.
void CheckAndRemove(CConnman &connman)
Check all Masternodes and remove inactive.
const std::vector< CTxOut > vout
static bool IsCollateralValid(const CTransaction &txCollateral)
If the collateral is valid given by a client.
static bool SignMessage(const std::string strMessage, std::vector< unsigned char > &vchSigRet, const CKey key)
Sign the message, returns true if successful.
CGovernanceManager governance
static void InitStandardDenominations()
void ThreadCheckPrivateSend(CConnman &connman)
int nHeight
height of the entry in the chain. The genesis block has height 0
static int GetDenominationsByAmounts(const std::vector< CAmount > &vecAmount)
Get the denominations for a specific amount of dash.
static void CheckDSTXes(int nHeight)
static CDarksendBroadcastTx GetDSTX(const uint256 &hash)
void PushMessage(CNode *pnode, const std::string &sCommand, Args &&... args)
std::atomic< int > nVersion
std::string _(const char *psz)
std::vector< CTxDSOut > vecTxDSOut
std::vector< unsigned char > vchSig