mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-06-21 14:22:38 +02:00
Add SelectCoinsSRD function
This commit is contained in:
parent
2ad3b5d2ad
commit
8bf789b4b4
@ -5,9 +5,11 @@
|
||||
#include <wallet/coinselection.h>
|
||||
|
||||
#include <policy/feerate.h>
|
||||
#include <util/check.h>
|
||||
#include <util/system.h>
|
||||
#include <util/moneystr.h>
|
||||
|
||||
#include <numeric>
|
||||
#include <optional>
|
||||
|
||||
// Descending order comparator
|
||||
@ -168,6 +170,30 @@ bool SelectCoinsBnB(std::vector<OutputGroup>& utxo_pool, const CAmount& selectio
|
||||
return true;
|
||||
}
|
||||
|
||||
std::optional<std::pair<std::set<CInputCoin>, CAmount>> SelectCoinsSRD(const std::vector<OutputGroup>& utxo_pool, CAmount target_value)
|
||||
{
|
||||
std::set<CInputCoin> out_set;
|
||||
CAmount value_ret = 0;
|
||||
|
||||
std::vector<size_t> indexes;
|
||||
indexes.resize(utxo_pool.size());
|
||||
std::iota(indexes.begin(), indexes.end(), 0);
|
||||
Shuffle(indexes.begin(), indexes.end(), FastRandomContext());
|
||||
|
||||
CAmount selected_eff_value = 0;
|
||||
for (const size_t i : indexes) {
|
||||
const OutputGroup& group = utxo_pool.at(i);
|
||||
Assume(group.GetSelectionAmount() > 0);
|
||||
selected_eff_value += group.GetSelectionAmount();
|
||||
value_ret += group.m_value;
|
||||
util::insert(out_set, group.m_outputs);
|
||||
if (selected_eff_value >= target_value) {
|
||||
return std::make_pair(out_set, value_ret);
|
||||
}
|
||||
}
|
||||
return std::nullopt;
|
||||
}
|
||||
|
||||
static void ApproximateBestSubset(const std::vector<OutputGroup>& groups, const CAmount& nTotalLower, const CAmount& nTargetValue,
|
||||
std::vector<char>& vfBest, CAmount& nBest, int iterations = 1000)
|
||||
{
|
||||
|
@ -10,6 +10,8 @@
|
||||
#include <primitives/transaction.h>
|
||||
#include <random.h>
|
||||
|
||||
#include <optional>
|
||||
|
||||
//! target minimum change amount
|
||||
static constexpr CAmount MIN_CHANGE{COIN / 100};
|
||||
//! final minimum change amount after paying for fees
|
||||
@ -183,6 +185,15 @@ struct OutputGroup
|
||||
|
||||
bool SelectCoinsBnB(std::vector<OutputGroup>& utxo_pool, const CAmount& selection_target, const CAmount& cost_of_change, std::set<CInputCoin>& out_set, CAmount& value_ret);
|
||||
|
||||
/** Select coins by Single Random Draw. OutputGroups are selected randomly from the eligible
|
||||
* outputs until the target is satisfied
|
||||
*
|
||||
* @param[in] utxo_pool The positive effective value OutputGroups eligible for selection
|
||||
* @param[in] target_value The target value to select for
|
||||
* @returns If successful, a pair of set of outputs and total selected value, otherwise, std::nullopt
|
||||
*/
|
||||
std::optional<std::pair<std::set<CInputCoin>, CAmount>> SelectCoinsSRD(const std::vector<OutputGroup>& utxo_pool, CAmount target_value);
|
||||
|
||||
// Original coin selection algorithm as a fallback
|
||||
bool KnapsackSolver(const CAmount& nTargetValue, std::vector<OutputGroup>& groups, std::set<CInputCoin>& setCoinsRet, CAmount& nValueRet);
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user