Reintroduce mixing hard cap for all but the largest denom (#3489)

* Split -privatesenddenoms option into two to be able to specify initial/batched denom "checkpoint" and the hard cap

* Introduce MAX_PRIVATESEND_DENOM_OUTPUTS = 500 constant

Also make sure to never exceed it while looping

* Make sure to never exceed nPrivateSendDenomsBatched while creating batches

* Tweak debug logging

* Use auto for nDenomValue

* Fix detection of so called "final" denom

Now that we don't skip denoms anymore conditions are slightly different. Without this fix the "final" denom is created in a separate tx even when there is enough room in the current one.

* batched -> goal

* Tweak json and a warning

* Drop excessive checks for MAX_PRIVATESEND_DENOM_OUTPUTS in the "goal" part of the algo

Rename it to PRIVATESEND_DENOM_OUTPUTS_THRESHOLD to beter match the meaning and tweak comments

* fix log
This commit is contained in:
UdjinM6 2020-05-20 12:23:48 +03:00 committed by GitHub
parent 397630a82c
commit 9d3546baee
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 89 additions and 38 deletions

View File

@ -1528,22 +1528,17 @@ bool CPrivateSendClientSession::CreateDenominated(CAmount nBalanceToDenominate,
mapDenomCount.insert(std::pair<CAmount, int>(nDenomValue, GetWallets()[0]->CountInputsWithAmount(nDenomValue))); mapDenomCount.insert(std::pair<CAmount, int>(nDenomValue, GetWallets()[0]->CountInputsWithAmount(nDenomValue)));
} }
// NOTE: We do not allow txes larger than 100kB, so we have to limit the number of outputs here.
// We still want to create a lot of outputs though.
// Knowing that each CTxOut is ~35b big, 400 outputs should take 400 x ~35b = ~17.5kb.
// More than 500 outputs starts to make qt quite laggy.
// Additionally to need all 500 outputs (assuming a max per denom of 50) you'd need to be trying to
// create denominations for over 3000 dash!
// Will generate outputs for the createdenoms up to privatesendmaxdenoms per denom // Will generate outputs for the createdenoms up to privatesendmaxdenoms per denom
// This works in the way creating PS denoms has traditionally worked, assuming enough funds, // This works in the way creating PS denoms has traditionally worked, assuming enough funds,
// it will start with the smallest denom then create 11 of those, then go up to the next biggest denom create 11 // it will start with the smallest denom then create 11 of those, then go up to the next biggest denom create 11
// and repeat. Previously, once the largest denom was reached, as many would be created were created as possible and // and repeat. Previously, once the largest denom was reached, as many would be created were created as possible and
// then any remaining was put into a change address and denominations were created in the same manner a block later. // then any remaining was put into a change address and denominations were created in the same manner a block later.
// Now, in this system, so long as we don't reach 500 outputs the process repeats in the same transaction, // Now, in this system, so long as we don't reach PRIVATESEND_DENOM_OUTPUTS_THRESHOLD outputs the process repeats in
// creating up to privatesenddenoms per denomination in a single transaction. // the same transaction, creating up to nPrivateSendDenomsHardCap per denomination in a single transaction.
while (nValueLeft >= CPrivateSend::GetSmallestDenomination() && nOutputsTotal <= 500) {
while (nValueLeft >= CPrivateSend::GetSmallestDenomination() && nOutputsTotal < PRIVATESEND_DENOM_OUTPUTS_THRESHOLD) {
for (auto it = vecStandardDenoms.rbegin(); it != vecStandardDenoms.rend(); ++it) { for (auto it = vecStandardDenoms.rbegin(); it != vecStandardDenoms.rend(); ++it) {
CAmount nDenomValue = *it; CAmount nDenomValue = *it;
auto currentDenomIt = mapDenomCount.find(nDenomValue); auto currentDenomIt = mapDenomCount.find(nDenomValue);
@ -1556,13 +1551,18 @@ bool CPrivateSendClientSession::CreateDenominated(CAmount nBalanceToDenominate,
&& nValueLeft >= nDenomValue && nValueLeft >= nDenomValue
&& nBalanceToDenominate > 0 && nBalanceToDenominate > 0
&& nBalanceToDenominate < nDenomValue); && nBalanceToDenominate < nDenomValue);
fAddFinal = false; // add final denom only once, only the smalest possible one if (fFinal) {
fAddFinal = false; // add final denom only once, only the smalest possible one
LogPrint(BCLog::PRIVATESEND,
"CPrivateSendClientSession::CreateDenominated -- 1 - FINAL - nDenomValue: %f, nValueLeft: %f, nBalanceToDenominate: %f\n",
(float) nDenomValue / COIN, (float) nValueLeft / COIN, (float) nBalanceToDenominate / COIN);
}
return fRegular || fFinal; return fRegular || fFinal;
}; };
// add each output up to 11 times or until it can't be added again or until we reach nPrivateSendDenoms // add each output up to 11 times or until it can't be added again or until we reach nPrivateSendDenomsGoal
while (needMoreOutputs() && nOutputs <= 10 && currentDenomIt->second <= privateSendClient.nPrivateSendDenoms) { while (needMoreOutputs() && nOutputs <= 10 && currentDenomIt->second < privateSendClient.nPrivateSendDenomsGoal) {
CScript scriptDenom = keyHolderStorageDenom.AddKey(GetWallets()[0]); CScript scriptDenom = keyHolderStorageDenom.AddKey(GetWallets()[0]);
vecSend.push_back((CRecipient) {scriptDenom, nDenomValue, false}); vecSend.push_back((CRecipient) {scriptDenom, nDenomValue, false});
@ -1573,8 +1573,8 @@ bool CPrivateSendClientSession::CreateDenominated(CAmount nBalanceToDenominate,
nValueLeft -= nDenomValue; nValueLeft -= nDenomValue;
nBalanceToDenominate -= nDenomValue; nBalanceToDenominate -= nDenomValue;
LogPrint(BCLog::PRIVATESEND, LogPrint(BCLog::PRIVATESEND,
"CPrivateSendClientSession::CreateDenominated -- 1 - totalOutputs: %d, nOutputsTotal: %d, nOutputs: %d, nValueLeft: %f\n", "CPrivateSendClientSession::CreateDenominated -- 1 - nDenomValue: %f, totalOutputs: %d, nOutputsTotal: %d, nOutputs: %d, nValueLeft: %f, nBalanceToDenominate: %f\n",
nOutputsTotal + nOutputs, nOutputsTotal, nOutputs, (float) nValueLeft / COIN); (float) nDenomValue / COIN, nOutputsTotal + nOutputs, nOutputsTotal, nOutputs, (float) nValueLeft / COIN, (float) nBalanceToDenominate / COIN);
} }
nOutputsTotal += nOutputs; nOutputsTotal += nOutputs;
@ -1582,24 +1582,32 @@ bool CPrivateSendClientSession::CreateDenominated(CAmount nBalanceToDenominate,
} }
bool finished = true; bool finished = true;
for (auto it : mapDenomCount) { for (const auto it : mapDenomCount) {
// Check if this specific denom could use another loop, check that there aren't nPrivateSendDenoms of this // Check if this specific denom could use another loop, check that there aren't nPrivateSendDenomsGoal of this
// denom and that our nValueLeft/nBalanceToDenominate is enough to create one of these denoms, if so, loop again. // denom and that our nValueLeft/nBalanceToDenominate is enough to create one of these denoms, if so, loop again.
if (it.second <= privateSendClient.nPrivateSendDenoms && nValueLeft >= it.first && nBalanceToDenominate >= it.first) { if (it.second < privateSendClient.nPrivateSendDenomsGoal && nValueLeft >= it.first && nBalanceToDenominate > 0) {
finished = false; finished = false;
LogPrint(BCLog::PRIVATESEND,
"CPrivateSendClientSession::CreateDenominated -- 1 - NOT finished - nDenomValue: %f, count: %d, nValueLeft: %f, nBalanceToDenominate: %f\n",
(float) it.first / COIN, it.second, (float) nValueLeft / COIN, (float) nBalanceToDenominate / COIN);
break; break;
} }
LogPrint(BCLog::PRIVATESEND,
"CPrivateSendClientSession::CreateDenominated -- 1 - FINSHED - nDenomValue: %f, count: %d, nValueLeft: %f, nBalanceToDenominate: %f\n",
(float) it.first / COIN, it.second, (float) nValueLeft / COIN, (float) nBalanceToDenominate / COIN);
} }
if (finished) break; if (finished) break;
} }
// Now that nPrivateSendDenoms worth of each denom have been created, do something with the remainder. // Now that nPrivateSendDenomsGoal worth of each denom have been created or the max number of denoms given the value of the input, do something with the remainder.
while (nValueLeft >= CPrivateSend::GetSmallestDenomination() && nBalanceToDenominate >= CPrivateSend::GetSmallestDenomination() if (nValueLeft >= CPrivateSend::GetSmallestDenomination() && nBalanceToDenominate >= CPrivateSend::GetSmallestDenomination()
&& nOutputsTotal <= 500) { && nOutputsTotal < PRIVATESEND_DENOM_OUTPUTS_THRESHOLD) {
CAmount nLargestDenomValue = vecStandardDenoms.front();
// Go big to small // Go big to small
for (long nDenomValue : vecStandardDenoms) { for (auto nDenomValue : vecStandardDenoms) {
int nOutputs = 0; int nOutputs = 0;
// Number of denoms we can create given our denom and the amount of funds we have left // Number of denoms we can create given our denom and the amount of funds we have left
@ -1607,26 +1615,37 @@ bool CPrivateSendClientSession::CreateDenominated(CAmount nBalanceToDenominate,
int denomsToCreateBal = nBalanceToDenominate / nDenomValue; int denomsToCreateBal = nBalanceToDenominate / nDenomValue;
// Use the smaller value // Use the smaller value
int denomsToCreate = denomsToCreateValue > denomsToCreateBal ? denomsToCreateBal : denomsToCreateValue; int denomsToCreate = denomsToCreateValue > denomsToCreateBal ? denomsToCreateBal : denomsToCreateValue;
auto it = mapDenomCount.find(nDenomValue);
for (int i = 0; i < denomsToCreate; i++) { for (int i = 0; i < denomsToCreate; i++) {
CScript scriptDenom = keyHolderStorageDenom.AddKey(GetWallets()[0]); // Never go above the cap unless it's the largest denom
if (nDenomValue != nLargestDenomValue && it->second >= privateSendClient.nPrivateSendDenomsHardCap) break;
CScript scriptDenom = keyHolderStorageDenom.AddKey(GetWallets()[0]);
vecSend.push_back((CRecipient) {scriptDenom, nDenomValue, false}); vecSend.push_back((CRecipient) {scriptDenom, nDenomValue, false});
// increment outputs and subtract denomination amount // increment outputs and subtract denomination amount
nOutputs++; nOutputs++;
mapDenomCount.find(nDenomValue)->second++; it->second++;
nValueLeft -= nDenomValue; nValueLeft -= nDenomValue;
nBalanceToDenominate -= nDenomValue; nBalanceToDenominate -= nDenomValue;
LogPrint(BCLog::PRIVATESEND, LogPrint(BCLog::PRIVATESEND,
"CPrivateSendClientSession::CreateDenominated -- 1 - totalOutputs: %d, nOutputsTotal: %d, nOutputs: %d, nValueLeft: %f\n", "CPrivateSendClientSession::CreateDenominated -- 2 - nDenomValue: %f, totalOutputs: %d, nOutputsTotal: %d, nOutputs: %d, nValueLeft: %f, nBalanceToDenominate: %f\n",
nOutputsTotal + nOutputs, nOutputsTotal, nOutputs, (float) nValueLeft / COIN); (float) nDenomValue / COIN, nOutputsTotal + nOutputs, nOutputsTotal, nOutputs, (float) nValueLeft / COIN, (float) nBalanceToDenominate / COIN);
if (nOutputs + nOutputsTotal >= PRIVATESEND_DENOM_OUTPUTS_THRESHOLD) break;
} }
nOutputsTotal += nOutputs; nOutputsTotal += nOutputs;
if (nOutputsTotal >= PRIVATESEND_DENOM_OUTPUTS_THRESHOLD) break;
} }
} }
LogPrint(BCLog::PRIVATESEND, "CPrivateSendClientSession::CreateDenominated -- 2 - nOutputsTotal: %d, nValueLeft: %f\n", nOutputsTotal, (float)nValueLeft / COIN); LogPrint(BCLog::PRIVATESEND, "CPrivateSendClientSession::CreateDenominated -- 3 - nOutputsTotal: %d, nValueLeft: %f, nBalanceToDenominate: %f\n",
nOutputsTotal, (float)nValueLeft / COIN, (float)nBalanceToDenominate / COIN);
for (const auto it : mapDenomCount) {
LogPrint(BCLog::PRIVATESEND,
"CPrivateSendClientSession::CreateDenominated -- 3 - DONE - nDenomValue: %f, count: %d\n",
(float) it.first / COIN, it.second);
}
// No reasons to create mixing collaterals if we can't create denoms to mix // No reasons to create mixing collaterals if we can't create denoms to mix
if (nOutputsTotal == 0) return false; if (nOutputsTotal == 0) return false;
@ -1742,7 +1761,8 @@ void CPrivateSendClientManager::GetJsonInfo(UniValue& obj) const
obj.push_back(Pair("max_sessions", nPrivateSendSessions)); obj.push_back(Pair("max_sessions", nPrivateSendSessions));
obj.push_back(Pair("max_rounds", nPrivateSendRounds)); obj.push_back(Pair("max_rounds", nPrivateSendRounds));
obj.push_back(Pair("max_amount", nPrivateSendAmount)); obj.push_back(Pair("max_amount", nPrivateSendAmount));
obj.push_back(Pair("max_denoms", nPrivateSendDenoms)); obj.push_back(Pair("denoms_goal", nPrivateSendDenomsGoal));
obj.push_back(Pair("denoms_hardcap", nPrivateSendDenomsHardCap));
obj.push_back(Pair("queue_size", GetQueueSize())); obj.push_back(Pair("queue_size", GetQueueSize()));
UniValue arrSessions(UniValue::VARR); UniValue arrSessions(UniValue::VARR);

View File

@ -19,19 +19,32 @@ class UniValue;
static const int MIN_PRIVATESEND_SESSIONS = 1; static const int MIN_PRIVATESEND_SESSIONS = 1;
static const int MIN_PRIVATESEND_ROUNDS = 2; static const int MIN_PRIVATESEND_ROUNDS = 2;
static const int MIN_PRIVATESEND_AMOUNT = 2; static const int MIN_PRIVATESEND_AMOUNT = 2;
static const int MIN_PRIVATESEND_DENOMS = 10; static const int MIN_PRIVATESEND_DENOMS_GOAL = 10;
static const int MIN_PRIVATESEND_DENOMS_HARDCAP = 10;
static const int MAX_PRIVATESEND_SESSIONS = 10; static const int MAX_PRIVATESEND_SESSIONS = 10;
static const int MAX_PRIVATESEND_ROUNDS = 16; static const int MAX_PRIVATESEND_ROUNDS = 16;
static const int MAX_PRIVATESEND_DENOMS = 100000; static const int MAX_PRIVATESEND_DENOMS_GOAL = 100000;
static const int MAX_PRIVATESEND_DENOMS_HARDCAP = 100000;
static const int MAX_PRIVATESEND_AMOUNT = MAX_MONEY / COIN; static const int MAX_PRIVATESEND_AMOUNT = MAX_MONEY / COIN;
static const int DEFAULT_PRIVATESEND_SESSIONS = 4; static const int DEFAULT_PRIVATESEND_SESSIONS = 4;
static const int DEFAULT_PRIVATESEND_ROUNDS = 4; static const int DEFAULT_PRIVATESEND_ROUNDS = 4;
static const int DEFAULT_PRIVATESEND_AMOUNT = 1000; static const int DEFAULT_PRIVATESEND_AMOUNT = 1000;
static const int DEFAULT_PRIVATESEND_DENOMS = 50; static const int DEFAULT_PRIVATESEND_DENOMS_GOAL = 50;
static const int DEFAULT_PRIVATESEND_DENOMS_HARDCAP = 300;
static const bool DEFAULT_PRIVATESEND_AUTOSTART = false; static const bool DEFAULT_PRIVATESEND_AUTOSTART = false;
static const bool DEFAULT_PRIVATESEND_MULTISESSION = false; static const bool DEFAULT_PRIVATESEND_MULTISESSION = false;
// How many new denom outputs to create before we consider the "goal" loop in CreateDenominated
// a final one and start creating an actual tx. Same limit applies for the "hard cap" part of the algo.
// NOTE: We do not allow txes larger than 100kB, so we have to limit the number of outputs here.
// We still want to create a lot of outputs though.
// Knowing that each CTxOut is ~35b big, 400 outputs should take 400 x ~35b = ~17.5kb.
// More than 500 outputs starts to make qt quite laggy.
// Additionally to need all 500 outputs (assuming a max per denom of 50) you'd need to be trying to
// create denominations for over 3000 dash!
static const int PRIVATESEND_DENOM_OUTPUTS_THRESHOLD = 500;
// Warn user if mixing in gui or try to create backup if mixing in daemon mode // Warn user if mixing in gui or try to create backup if mixing in daemon mode
// when we have only this many keys left // when we have only this many keys left
static const int PRIVATESEND_KEYS_THRESHOLD_WARNING = 100; static const int PRIVATESEND_KEYS_THRESHOLD_WARNING = 100;
@ -192,7 +205,8 @@ public:
int nPrivateSendSessions; int nPrivateSendSessions;
int nPrivateSendRounds; int nPrivateSendRounds;
int nPrivateSendAmount; int nPrivateSendAmount;
int nPrivateSendDenoms; int nPrivateSendDenomsGoal;
int nPrivateSendDenomsHardCap;
bool fEnablePrivateSend; bool fEnablePrivateSend;
bool fPrivateSendRunning; bool fPrivateSendRunning;
bool fPrivateSendMultiSession; bool fPrivateSendMultiSession;
@ -209,7 +223,8 @@ public:
nCachedBlockHeight(0), nCachedBlockHeight(0),
nPrivateSendRounds(DEFAULT_PRIVATESEND_ROUNDS), nPrivateSendRounds(DEFAULT_PRIVATESEND_ROUNDS),
nPrivateSendAmount(DEFAULT_PRIVATESEND_AMOUNT), nPrivateSendAmount(DEFAULT_PRIVATESEND_AMOUNT),
nPrivateSendDenoms(DEFAULT_PRIVATESEND_DENOMS), nPrivateSendDenomsGoal(DEFAULT_PRIVATESEND_DENOMS_GOAL),
nPrivateSendDenomsHardCap(DEFAULT_PRIVATESEND_DENOMS_HARDCAP),
fEnablePrivateSend(false), fEnablePrivateSend(false),
fPrivateSendRunning(false), fPrivateSendRunning(false),
fPrivateSendMultiSession(DEFAULT_PRIVATESEND_MULTISESSION), fPrivateSendMultiSession(DEFAULT_PRIVATESEND_MULTISESSION),

View File

@ -63,7 +63,8 @@ std::string WalletInit::GetHelpString(bool showDebug)
strUsage += HelpMessageOpt("-privatesendsessions=<n>", strprintf(_("Use N separate masternodes in parallel to mix funds (%u-%u, default: %u)"), MIN_PRIVATESEND_SESSIONS, MAX_PRIVATESEND_SESSIONS, DEFAULT_PRIVATESEND_SESSIONS)); strUsage += HelpMessageOpt("-privatesendsessions=<n>", strprintf(_("Use N separate masternodes in parallel to mix funds (%u-%u, default: %u)"), MIN_PRIVATESEND_SESSIONS, MAX_PRIVATESEND_SESSIONS, DEFAULT_PRIVATESEND_SESSIONS));
strUsage += HelpMessageOpt("-privatesendrounds=<n>", strprintf(_("Use N separate masternodes for each denominated input to mix funds (%u-%u, default: %u)"), MIN_PRIVATESEND_ROUNDS, MAX_PRIVATESEND_ROUNDS, DEFAULT_PRIVATESEND_ROUNDS)); strUsage += HelpMessageOpt("-privatesendrounds=<n>", strprintf(_("Use N separate masternodes for each denominated input to mix funds (%u-%u, default: %u)"), MIN_PRIVATESEND_ROUNDS, MAX_PRIVATESEND_ROUNDS, DEFAULT_PRIVATESEND_ROUNDS));
strUsage += HelpMessageOpt("-privatesendamount=<n>", strprintf(_("Target PrivateSend balance (%u-%u, default: %u)"), MIN_PRIVATESEND_AMOUNT, MAX_PRIVATESEND_AMOUNT, DEFAULT_PRIVATESEND_AMOUNT)); strUsage += HelpMessageOpt("-privatesendamount=<n>", strprintf(_("Target PrivateSend balance (%u-%u, default: %u)"), MIN_PRIVATESEND_AMOUNT, MAX_PRIVATESEND_AMOUNT, DEFAULT_PRIVATESEND_AMOUNT));
strUsage += HelpMessageOpt("-privatesenddenoms=<n>", strprintf(_("Create up to N inputs of each denominated amount (%u-%u, default: %u)"), MIN_PRIVATESEND_DENOMS, MAX_PRIVATESEND_DENOMS, DEFAULT_PRIVATESEND_DENOMS)); strUsage += HelpMessageOpt("-privatesenddenomsgoal=<n>", strprintf(_("Try to create at least N inputs of each denominated amount (%u-%u, default: %u)"), MIN_PRIVATESEND_DENOMS_GOAL, MAX_PRIVATESEND_DENOMS_GOAL, DEFAULT_PRIVATESEND_DENOMS_GOAL));
strUsage += HelpMessageOpt("-privatesenddenomshardcap=<n>", strprintf(_("Create up to N inputs of each denominated amount (%u-%u, default: %u)"), MIN_PRIVATESEND_DENOMS_HARDCAP, MAX_PRIVATESEND_DENOMS_HARDCAP, DEFAULT_PRIVATESEND_DENOMS_HARDCAP));
if (showDebug) if (showDebug)
{ {
@ -220,6 +221,19 @@ bool WalletInit::ParameterInteraction()
LogPrintf("%s: parameter interaction: can't use -hdseed and -mnemonic/-mnemonicpassphrase together, will prefer -seed\n", __func__); LogPrintf("%s: parameter interaction: can't use -hdseed and -mnemonic/-mnemonicpassphrase together, will prefer -seed\n", __func__);
} }
if (gArgs.IsArgSet("-privatesenddenoms")) {
int nDenomsDeprecated = gArgs.GetArg("-privatesenddenoms", DEFAULT_PRIVATESEND_DENOMS_HARDCAP);
InitWarning("Warning: -privatesenddenoms is deprecated, please use -privatesenddenomshardcap or -privatesenddenomsgoal.\n");
if (gArgs.SoftSetArg("-privatesenddenomshardcap", itostr(nDenomsDeprecated))) {
LogPrintf("%s: parameter interaction: -privatesenddenoms=%d -> setting -privatesenddenomshardcap=%d\n", __func__, nDenomsDeprecated, nDenomsDeprecated);
}
gArgs.ForceRemoveArg("-privatesenddenoms");
}
if (gArgs.GetArg("-privatesenddenomshardcap", DEFAULT_PRIVATESEND_DENOMS_HARDCAP) < gArgs.GetArg("-privatesenddenomsgoal", DEFAULT_PRIVATESEND_DENOMS_GOAL)) {
return InitError("-privatesenddenomshardcap can't be lower than -privatesenddenomsgoal");
}
return true; return true;
} }
@ -361,14 +375,16 @@ void WalletInit::InitPrivateSendSettings()
privateSendClient.nPrivateSendSessions = std::min(std::max((int)gArgs.GetArg("-privatesendsessions", DEFAULT_PRIVATESEND_SESSIONS), MIN_PRIVATESEND_SESSIONS), MAX_PRIVATESEND_SESSIONS); privateSendClient.nPrivateSendSessions = std::min(std::max((int)gArgs.GetArg("-privatesendsessions", DEFAULT_PRIVATESEND_SESSIONS), MIN_PRIVATESEND_SESSIONS), MAX_PRIVATESEND_SESSIONS);
privateSendClient.nPrivateSendRounds = std::min(std::max((int)gArgs.GetArg("-privatesendrounds", DEFAULT_PRIVATESEND_ROUNDS), MIN_PRIVATESEND_ROUNDS), MAX_PRIVATESEND_ROUNDS); privateSendClient.nPrivateSendRounds = std::min(std::max((int)gArgs.GetArg("-privatesendrounds", DEFAULT_PRIVATESEND_ROUNDS), MIN_PRIVATESEND_ROUNDS), MAX_PRIVATESEND_ROUNDS);
privateSendClient.nPrivateSendAmount = std::min(std::max((int)gArgs.GetArg("-privatesendamount", DEFAULT_PRIVATESEND_AMOUNT), MIN_PRIVATESEND_AMOUNT), MAX_PRIVATESEND_AMOUNT); privateSendClient.nPrivateSendAmount = std::min(std::max((int)gArgs.GetArg("-privatesendamount", DEFAULT_PRIVATESEND_AMOUNT), MIN_PRIVATESEND_AMOUNT), MAX_PRIVATESEND_AMOUNT);
privateSendClient.nPrivateSendDenoms = std::min(std::max((int)gArgs.GetArg("-privatesenddenoms", DEFAULT_PRIVATESEND_DENOMS), MIN_PRIVATESEND_DENOMS), MAX_PRIVATESEND_DENOMS); privateSendClient.nPrivateSendDenomsGoal = std::min(std::max((int)gArgs.GetArg("-privatesenddenomsgoal", DEFAULT_PRIVATESEND_DENOMS_GOAL), MIN_PRIVATESEND_DENOMS_GOAL), MAX_PRIVATESEND_DENOMS_GOAL);
privateSendClient.nPrivateSendDenomsHardCap = std::min(std::max((int)gArgs.GetArg("-privatesenddenomshardcap", DEFAULT_PRIVATESEND_DENOMS_HARDCAP), MIN_PRIVATESEND_DENOMS_HARDCAP), MAX_PRIVATESEND_DENOMS_HARDCAP);
if (privateSendClient.fEnablePrivateSend) { if (privateSendClient.fEnablePrivateSend) {
LogPrintf("PrivateSend: autostart=%d, multisession=%d, " LogPrintf("PrivateSend: autostart=%d, multisession=%d, "
"sessions=%d, rounds=%d, amount=%d, denoms=%d\n", "sessions=%d, rounds=%d, amount=%d, denoms_goal=%d, denoms_hardcap=%d\n",
privateSendClient.fPrivateSendRunning, privateSendClient.fPrivateSendMultiSession, privateSendClient.fPrivateSendRunning, privateSendClient.fPrivateSendMultiSession,
privateSendClient.nPrivateSendSessions, privateSendClient.nPrivateSendRounds, privateSendClient.nPrivateSendSessions, privateSendClient.nPrivateSendRounds,
privateSendClient.nPrivateSendAmount, privateSendClient.nPrivateSendDenoms); privateSendClient.nPrivateSendAmount,
privateSendClient.nPrivateSendDenomsGoal, privateSendClient.nPrivateSendDenomsHardCap);
} }
} }