more fixes/cleanup/debug output to DS mixing

This commit is contained in:
UdjinM6 2015-01-26 00:18:26 +03:00
parent 9a4fac6bb6
commit 144b24bee5
4 changed files with 30 additions and 67 deletions

View File

@ -1388,7 +1388,6 @@ void CDarkSendPool::CompletedTransaction(bool error, std::string lastMessageNew)
// To avoid race conditions, we'll only let DS run once per block // To avoid race conditions, we'll only let DS run once per block
cachedLastSuccess = chainActive.Tip()->nHeight; cachedLastSuccess = chainActive.Tip()->nHeight;
splitUpInARow = 0;
} }
lastMessage = lastMessageNew; lastMessage = lastMessageNew;
@ -1414,9 +1413,9 @@ bool CDarkSendPool::DoAutomaticDenominating(bool fDryRun, bool ready)
if(fMasterNode) return false; if(fMasterNode) return false;
if(state == POOL_STATUS_ERROR || state == POOL_STATUS_SUCCESS) return false; if(state == POOL_STATUS_ERROR || state == POOL_STATUS_SUCCESS) return false;
if(chainActive.Tip()->nHeight-cachedLastSuccess < minBlockSpacing) { if(chainActive.Tip()->nHeight - cachedLastSuccess < minBlockSpacing) {
LogPrintf("CDarkSendPool::DoAutomaticDenominating - Last successful darksend was too recent\n"); LogPrintf("CDarkSendPool::DoAutomaticDenominating - Last successful darksend action was too recent\n");
strAutoDenomResult = "Last successful darksend was too recent"; strAutoDenomResult = "Last successful darksend action was too recent";
return false; return false;
} }
if(!fEnableDarksend) { if(!fEnableDarksend) {
@ -1445,7 +1444,7 @@ bool CDarkSendPool::DoAutomaticDenominating(bool fDryRun, bool ready)
// ** find the coins we'll use // ** find the coins we'll use
std::vector<CTxIn> vCoins; std::vector<CTxIn> vCoins;
std::vector<COutput> vCoins2; std::vector<COutput> vCoins2;
int64_t nValueMin = 0.01*COIN; int64_t nValueMin = CENT;
int64_t nValueIn = 0; int64_t nValueIn = 0;
// should not be less than fees in DARKSEND_FEE + few (lets say 5) smallest denoms // should not be less than fees in DARKSEND_FEE + few (lets say 5) smallest denoms
@ -1499,7 +1498,7 @@ bool CDarkSendPool::DoAutomaticDenominating(bool fDryRun, bool ready)
//check to see if we have the fee sized inputs, it requires these //check to see if we have the fee sized inputs, it requires these
if(!pwalletMain->HasDarksendFeeInputs()){ if(!pwalletMain->HasDarksendFeeInputs()){
if(!fDryRun) SplitUpMoney(true); if(!fDryRun) MakeCollateralAmounts();
return true; return true;
} }
@ -1713,31 +1712,17 @@ bool CDarkSendPool::SendRandomPaymentToSelf()
} }
// Split up large inputs or create fee sized inputs // Split up large inputs or create fee sized inputs
bool CDarkSendPool::SplitUpMoney(bool justCollateral) bool CDarkSendPool::MakeCollateralAmounts()
{ {
if((chainActive.Tip()->nHeight - lastSplitUpBlock) < 10){
LogPrintf("SplitUpMoney - Too soon to split up again\n");
return false;
}
if(splitUpInARow >= 2){
LogPrintf("Error: Darksend SplitUpMoney was called multiple times in a row. This should not happen. Please submit a detailed explanation of the steps it took to create this error and submit to evan@darkcoin.io. \n");
fEnableDarksend = false;
return false;
}
// should split up to remaining amount only... // should split up to remaining amount only...
int64_t nTotalBalance = pwalletMain->GetDenominatedBalance(false); int64_t nTotalBalance = pwalletMain->GetDenominatedBalance(false);
int64_t nSplitBalance = nAnonymizeDarkcoinAmount*COIN - pwalletMain->GetDenominatedBalance(); int64_t nSplitBalance = nAnonymizeDarkcoinAmount*COIN - pwalletMain->GetDenominatedBalance();
if(nSplitBalance > nTotalBalance) nSplitBalance = nTotalBalance; if(nSplitBalance > nTotalBalance) nSplitBalance = nTotalBalance;
// ...or up to 1 DRK if it's just collateral // ...but up to 1 DRK only
if(justCollateral && nSplitBalance > 1*COIN) nSplitBalance = 1*COIN; if(nSplitBalance > 1*COIN) nSplitBalance = 1*COIN;
int64_t nTotalOut = 0; int64_t nTotalOut = 0;
lastSplitUpBlock = chainActive.Tip()->nHeight;
LogPrintf("DoAutomaticDenominating: Split up large input (justCollateral %d):\n", justCollateral); LogPrintf("DoAutomaticDenominating: MakeCollateralAmounts: nSplitBalance %d nTotalBalance %d\n", nSplitBalance, pwalletMain->GetDenominatedBalance(false));
LogPrintf(" -- nSplitBalance %d\n", nSplitBalance);
LogPrintf(" -- denom %d \n", pwalletMain->GetDenominatedBalance(false));
// make our change address // make our change address
CReserveKey reservekey(pwalletMain); CReserveKey reservekey(pwalletMain);
@ -1752,54 +1737,31 @@ bool CDarkSendPool::SplitUpMoney(bool justCollateral)
std::string strFail = ""; std::string strFail = "";
vector< pair<CScript, int64_t> > vecSend; vector< pair<CScript, int64_t> > vecSend;
int64_t a = 1*COIN;
// ****** Add fees ************ / // ****** Add fees ************ /
vecSend.push_back(make_pair(scriptChange, (DARKSEND_COLLATERAL*2)+DARKSEND_FEE)); vecSend.push_back(make_pair(scriptChange, (DARKSEND_COLLATERAL*2)+DARKSEND_FEE));
nTotalOut += (DARKSEND_COLLATERAL*2)+DARKSEND_FEE; nTotalOut += (DARKSEND_COLLATERAL*2)+DARKSEND_FEE;
vecSend.push_back(make_pair(scriptChange, (DARKSEND_COLLATERAL*2)+DARKSEND_FEE)); vecSend.push_back(make_pair(scriptChange, (DARKSEND_COLLATERAL*2)+DARKSEND_FEE));
nTotalOut += (DARKSEND_COLLATERAL*2)+DARKSEND_FEE; nTotalOut += (DARKSEND_COLLATERAL*2)+DARKSEND_FEE;
// ****** Add outputs in bases of two from 1 darkcoin *** / if(nTotalOut > nSplitBalance) {
if(!justCollateral){ LogPrintf("MakeCollateralAmounts: Not enough outputs to make a transaction\n");
bool continuing = true;
while(continuing){
if(nTotalOut + a < nSplitBalance){
//LogPrintf(" nTotalOut %d, added %d\n", nTotalOut, a);
vecSend.push_back(make_pair(scriptChange, a));
nTotalOut += a;
} else {
continuing = false;
}
a = a * 2;
}
}
if((justCollateral && nTotalOut <= 0.1*COIN) || vecSend.size() < 1) {
LogPrintf("SplitUpMoney: Not enough outputs to make a transaction\n");
return false;
}
if((!justCollateral && nTotalOut <= 1*COIN) || vecSend.size() < 1){
LogPrintf("SplitUpMoney: Not enough outputs to make a transaction\n");
return false; return false;
} }
CCoinControl *coinControl=NULL; CCoinControl *coinControl=NULL;
bool success = pwalletMain->CreateTransaction(vecSend, wtx, reservekey, bool success = pwalletMain->CreateTransaction(vecSend, wtx, reservekey,
nFeeRet, strFail, coinControl, justCollateral ? ALL_COINS : ONLY_NONDENOMINATED); nFeeRet, strFail, coinControl, ONLY_NONDENOMINATED_NOTMN);
if(!success){ if(!success){
LogPrintf("SplitUpMoney: Error - %s\n", strFail.c_str()); LogPrintf("MakeCollateralAmounts: Error - %s\n", strFail.c_str());
return false; return false;
} }
pwalletMain->CommitTransaction(wtx, reservekey); // use the same cachedLastSuccess as for DS mixinx to prevent race
if(pwalletMain->CommitTransaction(wtx, reservekey))
cachedLastSuccess = chainActive.Tip()->nHeight;
LogPrintf("SplitUpMoney Success: tx %s\n", wtx.GetHash().GetHex().c_str()); LogPrintf("MakeCollateralAmounts Success: tx %s\n", wtx.GetHash().GetHex().c_str());
splitUpInARow++;
return true; return true;
} }
@ -1857,13 +1819,15 @@ bool CDarkSendPool::CreateDenominated(int64_t nTotalValue)
CCoinControl *coinControl=NULL; CCoinControl *coinControl=NULL;
bool success = pwalletMain->CreateTransaction(vecSend, wtx, reservekey, bool success = pwalletMain->CreateTransaction(vecSend, wtx, reservekey,
nFeeRet, strFail, coinControl, ONLY_NONDENOMINATED_MN); nFeeRet, strFail, coinControl, ONLY_NONDENOMINATED_NOTMN);
if(!success){ if(!success){
LogPrintf("CreateDenominated: Error - %s\n", strFail.c_str()); LogPrintf("CreateDenominated: Error - %s\n", strFail.c_str());
return false; return false;
} }
pwalletMain->CommitTransaction(wtx, reservekey); // use the same cachedLastSuccess as for DS mixinx to prevent race
if(pwalletMain->CommitTransaction(wtx, reservekey))
cachedLastSuccess = chainActive.Tip()->nHeight;
LogPrintf("CreateDenominated Success: tx %s\n", wtx.GetHash().GetHex().c_str()); LogPrintf("CreateDenominated Success: tx %s\n", wtx.GetHash().GetHex().c_str());
@ -2125,6 +2089,9 @@ bool CDarkSendSigner::VerifyMessage(CPubKey pubkey, vector<unsigned char>& vchSi
return false; return false;
} }
if (fDebug && pubkey2.GetID() != pubkey.GetID())
LogPrintf("CDarkSendSigner::VerifyMessage -- keys don't match: %s %s", pubkey2.GetID().ToString(), pubkey.GetID().ToString());
return (pubkey2.GetID() == pubkey.GetID()); return (pubkey2.GetID() == pubkey.GetID());
} }

View File

@ -259,8 +259,6 @@ public:
int64_t sessionTotalValue; //used for autoDenom int64_t sessionTotalValue; //used for autoDenom
std::vector<CTransaction> vecSessionCollateral; std::vector<CTransaction> vecSessionCollateral;
int lastSplitUpBlock;
int splitUpInARow; // how many splits we've done since a success?
int cachedLastSuccess; int cachedLastSuccess;
int cachedNumBlocks; //used for the overview screen int cachedNumBlocks; //used for the overview screen
int minBlockSpacing; //required blocks between mixes int minBlockSpacing; //required blocks between mixes
@ -277,11 +275,9 @@ public:
/* DarkSend uses collateral addresses to trust parties entering the pool /* DarkSend uses collateral addresses to trust parties entering the pool
to behave themselves. If they don't it takes their money. */ to behave themselves. If they don't it takes their money. */
lastSplitUpBlock = 0;
cachedLastSuccess = 0; cachedLastSuccess = 0;
cachedNumBlocks = 0; cachedNumBlocks = 0;
unitTest = false; unitTest = false;
splitUpInARow = 0;
txCollateral = CTransaction(); txCollateral = CTransaction();
minBlockSpacing = 1; minBlockSpacing = 1;
nDsqCount = 0; nDsqCount = 0;
@ -420,7 +416,7 @@ public:
// used for liquidity providers // used for liquidity providers
bool SendRandomPaymentToSelf(); bool SendRandomPaymentToSelf();
// split up large inputs or make fee sized inputs // split up large inputs or make fee sized inputs
bool SplitUpMoney(bool justCollateral=false); bool MakeCollateralAmounts();
bool CreateDenominated(int64_t nTotalValue); bool CreateDenominated(int64_t nTotalValue);
// get the denominations for a list of outputs (returns a bitshifted integer) // get the denominations for a list of outputs (returns a bitshifted integer)
int GetDenominations(const std::vector<CTxOut>& vout); int GetDenominations(const std::vector<CTxOut>& vout);

View File

@ -1237,12 +1237,12 @@ void CWallet::AvailableCoins(vector<COutput>& vCoins, bool fOnlyConfirmed, const
CTxIn vin = CTxIn(out.tx->GetHash(), out.i); CTxIn vin = CTxIn(out.tx->GetHash(), out.i);
int rounds = GetInputDarksendRounds(vin); int rounds = GetInputDarksendRounds(vin);
if(rounds >= 0) found = true; if(rounds >= 0) found = true;
} else if(coin_type == ONLY_NONDENOMINATED || coin_type == ONLY_NONDENOMINATED_MN) { } else if(coin_type == ONLY_NONDENOMINATED || coin_type == ONLY_NONDENOMINATED_NOTMN) {
found = true; found = true;
BOOST_FOREACH(int64_t d, darkSendDenominations) BOOST_FOREACH(int64_t d, darkSendDenominations)
if(pcoin->vout[i].nValue == d) if(pcoin->vout[i].nValue == d)
found = false; found = false;
if(coin_type == ONLY_NONDENOMINATED_MN) found = found && (pcoin->vout[i].nValue != 1000*COIN); if(coin_type == ONLY_NONDENOMINATED_NOTMN) found = found && (pcoin->vout[i].nValue != 1000*COIN);
} else { } else {
found = true; found = true;
} }
@ -1590,7 +1590,7 @@ bool CWallet::SelectCoinsDark(int64_t nValueMin, int64_t nValueMax, std::vector<
nValueRet = 0; nValueRet = 0;
vector<COutput> vCoins; vector<COutput> vCoins;
AvailableCoins(vCoins, false, coinControl, nDarksendRoundsMin < 0 ? ONLY_NONDENOMINATED : ONLY_DENOMINATED); AvailableCoins(vCoins, false, coinControl, nDarksendRoundsMin < 0 ? ONLY_NONDENOMINATED_NOTMN : ONLY_DENOMINATED);
set<pair<const CWalletTx*,unsigned int> > setCoinsRet2; set<pair<const CWalletTx*,unsigned int> > setCoinsRet2;
@ -1849,7 +1849,7 @@ bool CWallet::CreateTransaction(const vector<pair<CScript, int64_t> >& vecSend,
strFailReason = _("Insufficient funds"); strFailReason = _("Insufficient funds");
else if (coin_type == ONLY_NONDENOMINATED) else if (coin_type == ONLY_NONDENOMINATED)
strFailReason = _("Unable to locate enough Darksend non-denominated funds for this transaction"); strFailReason = _("Unable to locate enough Darksend non-denominated funds for this transaction");
else if (coin_type == ONLY_NONDENOMINATED_MN) else if (coin_type == ONLY_NONDENOMINATED_NOTMN)
strFailReason = _("Unable to locate enough Darksend non-denominated funds for this transaction that are not equal 1000 DRK"); strFailReason = _("Unable to locate enough Darksend non-denominated funds for this transaction that are not equal 1000 DRK");
else else
strFailReason = _("Unable to locate enough Darksend denominated funds for this transaction"); strFailReason = _("Unable to locate enough Darksend denominated funds for this transaction");

View File

@ -56,7 +56,7 @@ enum AvailableCoinsType
ALL_COINS = 1, ALL_COINS = 1,
ONLY_DENOMINATED = 2, ONLY_DENOMINATED = 2,
ONLY_NONDENOMINATED = 3, ONLY_NONDENOMINATED = 3,
ONLY_NONDENOMINATED_MN = 4 // ONLY_NONDENOMINATED and not 1000 DRK at the same time ONLY_NONDENOMINATED_NOTMN = 4 // ONLY_NONDENOMINATED and not 1000 DRK at the same time
}; };