Merge pull request #82 from UdjinM6/110_select_nondenom_first

when Darksend is unchecked select nondenom inputs first - for v0.11.0.x
This commit is contained in:
Darkcoin 2014-12-26 12:51:47 -07:00
commit 9b710d2a86

View File

@ -1249,6 +1249,23 @@ static void ApproximateBestSubset(vector<pair<int64_t, pair<const CWalletTx*,uns
} }
// TODO: find appropriate place for this sort function
// move denoms down
bool less_then_denom (const COutput& out1, const COutput& out2)
{
const CWalletTx *pcoin1 = out1.tx;
const CWalletTx *pcoin2 = out2.tx;
bool found1 = false;
bool found2 = false;
BOOST_FOREACH(int64_t d, darkSendDenominations) // loop through predefined denoms
{
if(pcoin1->vout[out1.i].nValue == d) found1 = true;
if(pcoin2->vout[out2.i].nValue == d) found2 = true;
}
return (!found1 && found2);
}
bool CWallet::SelectCoinsMinConf(int64_t nTargetValue, int nConfMine, int nConfTheirs, vector<COutput> vCoins, bool CWallet::SelectCoinsMinConf(int64_t nTargetValue, int nConfMine, int nConfTheirs, vector<COutput> vCoins,
set<pair<const CWalletTx*,unsigned int> >& setCoinsRet, int64_t& nValueRet) const set<pair<const CWalletTx*,unsigned int> >& setCoinsRet, int64_t& nValueRet) const
{ {
@ -1264,16 +1281,37 @@ bool CWallet::SelectCoinsMinConf(int64_t nTargetValue, int nConfMine, int nConfT
random_shuffle(vCoins.begin(), vCoins.end(), GetRandInt); random_shuffle(vCoins.begin(), vCoins.end(), GetRandInt);
// move denoms down on the list
sort(vCoins.begin(), vCoins.end(), less_then_denom);
// try to find nondenom first to prevent unneeded spending of mixed coins
for (unsigned int tryDenom = 0; tryDenom < 2; tryDenom++)
{
if (fDebug) LogPrint("selectcoins", "tryDenom: %d\n", tryDenom);
setCoinsRet.clear();
nValueRet = 0;
nTotalLower = 0;
BOOST_FOREACH(COutput output, vCoins) BOOST_FOREACH(COutput output, vCoins)
{ {
const CWalletTx *pcoin = output.tx; const CWalletTx *pcoin = output.tx;
// if (fDebug) LogPrint("selectcoins", "value %s confirms %d\n", FormatMoney(pcoin->vout[output.i].nValue), output.nDepth);
if (output.nDepth < (pcoin->IsFromMe() ? nConfMine : nConfTheirs)) if (output.nDepth < (pcoin->IsFromMe() ? nConfMine : nConfTheirs))
continue; continue;
int i = output.i; int i = output.i;
int64_t n = pcoin->vout[i].nValue; int64_t n = pcoin->vout[i].nValue;
if (tryDenom == 0) // first run?
{
bool found = false;
BOOST_FOREACH(int64_t d, darkSendDenominations) // loop through predefined denoms
if(n == d)
found = true;
if (found) continue; // we don't want denom values on first run
}
pair<int64_t,pair<const CWalletTx*,unsigned int> > coin = make_pair(n,make_pair(pcoin, i)); pair<int64_t,pair<const CWalletTx*,unsigned int> > coin = make_pair(n,make_pair(pcoin, i));
if (n == nTargetValue) if (n == nTargetValue)
@ -1305,13 +1343,25 @@ bool CWallet::SelectCoinsMinConf(int64_t nTargetValue, int nConfMine, int nConfT
if (nTotalLower < nTargetValue) if (nTotalLower < nTargetValue)
{ {
if (coinLowestLarger.second.first == NULL) if (coinLowestLarger.second.first == NULL) // there is no input larger than nTargetValue
{
if (tryDenom == 0)
// we didn't look at denom yet, let's do it
continue;
else
// we looked at everything possible and didn't find anything, no luck
return false; return false;
}
setCoinsRet.insert(coinLowestLarger.second); setCoinsRet.insert(coinLowestLarger.second);
nValueRet += coinLowestLarger.first; nValueRet += coinLowestLarger.first;
return true; return true;
} }
// nTotalLower > nTargetValue
break;
}
// Solve subset sum by stochastic approximation // Solve subset sum by stochastic approximation
sort(vValue.rbegin(), vValue.rend(), CompareValueOnly()); sort(vValue.rbegin(), vValue.rend(), CompareValueOnly());
vector<char> vfBest; vector<char> vfBest;