Skip to content
Permalink
Browse files

Coinselection prunes extraneous inputs from ApproximateBestSubset

This is a combination of 3 commits.

- Coinselection prunes extraneous inputs from ApproximateBestSubset
  A further pass over the available inputs has been added to ApproximateBestSubset after a candidate set has been found. It will prune any extraneous inputs in the selected subset, in order to decrease the number of input and the resulting change.
- Moved set reduction to the end of ApproximateBestSubset to reduce performance impact
- Added a test for the pruning of extraneous inputs after ApproximateBestSet

Github-Pull: #4906
Rebased-From: 5c03483 af9510e fc0f52d
  • Loading branch information
Xekyo authored and laanwj committed Dec 8, 2015
1 parent b2d7ada commit 96e8d120336cf4312cd5f42ba2f9aff17d4ad414
Showing with 28 additions and 0 deletions.
  1. +18 −0 src/wallet/test/wallet_tests.cpp
  2. +10 −0 src/wallet/wallet.cpp
@@ -328,4 +328,22 @@ BOOST_AUTO_TEST_CASE(coin_selection_tests)
empty_wallet();
}

BOOST_AUTO_TEST_CASE(pruning_in_ApproximateBestSet)
{
CoinSet setCoinsRet;
CAmount nValueRet;

LOCK(wallet.cs_wallet);

empty_wallet();
for (int i = 0; i < 12; i++)
{
add_coin(10*CENT);
}
add_coin(100*CENT);
add_coin(100*CENT);
BOOST_CHECK(wallet.SelectCoinsMinConf(221*CENT, 1, 6, vCoins, setCoinsRet, nValueRet));
BOOST_CHECK_EQUAL(nValueRet, 230*CENT);
}

BOOST_AUTO_TEST_SUITE_END()
@@ -1632,6 +1632,16 @@ static void ApproximateBestSubset(vector<pair<CAmount, pair<const CWalletTx*,uns
}
}
}

//Reduces the approximate best subset by removing any inputs that are smaller than the surplus of nTotal beyond nTargetValue.
for (unsigned int i = 0; i < vValue.size(); i++)
{
if (vfBest[i] && (nBest - vValue[i].first) >= nTargetValue )
{
vfBest[i] = false;
nBest -= vValue[i].first;
}
}
}

bool CWallet::SelectCoinsMinConf(const CAmount& nTargetValue, int nConfMine, int nConfTheirs, vector<COutput> vCoins,

0 comments on commit 96e8d12

Please sign in to comment.