Bitcoin ABC  0.26.3
P2P Digital Currency
coinselection.h
Go to the documentation of this file.
1 // Copyright (c) 2017 The Bitcoin Core developers
2 // Distributed under the MIT software license, see the accompanying
3 // file COPYING or http://www.opensource.org/licenses/mit-license.php.
4 
5 #ifndef BITCOIN_WALLET_COINSELECTION_H
6 #define BITCOIN_WALLET_COINSELECTION_H
7 
8 #include <consensus/amount.h>
10 #include <random.h>
11 
13 static constexpr Amount MIN_CHANGE{COIN / 100};
15 static const Amount MIN_FINAL_CHANGE = MIN_CHANGE / 2;
16 
17 class CInputCoin {
18 public:
19  CInputCoin(const CTransactionRef &tx, unsigned int i) {
20  if (!tx) {
21  throw std::invalid_argument("tx should not be null");
22  }
23  if (i >= tx->vout.size()) {
24  throw std::out_of_range("The output index is out of range");
25  }
26 
27  outpoint = COutPoint(tx->GetId(), i);
28  txout = tx->vout[i];
30  }
31 
32  CInputCoin(const CTransactionRef &tx, unsigned int i, int input_bytes)
33  : CInputCoin(tx, i) {
34  m_input_bytes = input_bytes;
35  }
36 
42 
47  int m_input_bytes{-1};
48 
49  bool operator<(const CInputCoin &rhs) const {
50  return outpoint < rhs.outpoint;
51  }
52 
53  bool operator!=(const CInputCoin &rhs) const {
54  return outpoint != rhs.outpoint;
55  }
56 
57  bool operator==(const CInputCoin &rhs) const {
58  return outpoint == rhs.outpoint;
59  }
60 };
61 
63  const int conf_mine;
68  const int conf_theirs;
71  const bool m_include_partial_groups{false};
72 
73  CoinEligibilityFilter(int conf_mine_, int conf_theirs_)
74  : conf_mine(conf_mine_), conf_theirs(conf_theirs_) {}
75  CoinEligibilityFilter(int conf_mine_, int conf_theirs_,
76  bool include_partial_groups)
77  : conf_mine(conf_mine_), conf_theirs(conf_theirs_),
78  m_include_partial_groups(include_partial_groups) {}
79 };
80 
81 struct OutputGroup {
82  std::vector<CInputCoin> m_outputs;
83  bool m_from_me{true};
85  int m_depth{999};
91 
93  OutputGroup(const CFeeRate &effective_feerate,
94  const CFeeRate &long_term_feerate)
95  : m_effective_feerate(effective_feerate),
96  m_long_term_feerate(long_term_feerate) {}
97 
98  void Insert(const CInputCoin &output, int depth, bool from_me,
99  bool positive_only);
100  bool
101  EligibleForSpending(const CoinEligibilityFilter &eligibility_filter) const;
102 };
103 
104 bool SelectCoinsBnB(std::vector<OutputGroup> &utxo_pool,
105  const Amount &target_value, const Amount &cost_of_change,
106  std::set<CInputCoin> &out_set, Amount &value_ret,
107  const Amount not_input_fees);
108 
109 // Original coin selection algorithm as a fallback
110 bool KnapsackSolver(const Amount nTargetValue, std::vector<OutputGroup> &groups,
111  std::set<CInputCoin> &setCoinsRet, Amount &nValueRet);
112 
113 #endif // BITCOIN_WALLET_COINSELECTION_H
static constexpr Amount COIN
Definition: amount.h:144
Fee rate in satoshis per kilobyte: Amount / kB.
Definition: feerate.h:21
int m_input_bytes
Pre-computed estimated size of this output as a fully-signed input in a transaction.
Definition: coinselection.h:47
bool operator==(const CInputCoin &rhs) const
Definition: coinselection.h:57
Amount m_fee
Definition: coinselection.h:40
CInputCoin(const CTransactionRef &tx, unsigned int i)
Definition: coinselection.h:19
Amount m_long_term_fee
Definition: coinselection.h:41
CInputCoin(const CTransactionRef &tx, unsigned int i, int input_bytes)
Definition: coinselection.h:32
CTxOut txout
Definition: coinselection.h:38
Amount effective_value
Definition: coinselection.h:39
bool operator!=(const CInputCoin &rhs) const
Definition: coinselection.h:53
bool operator<(const CInputCoin &rhs) const
Definition: coinselection.h:49
COutPoint outpoint
Definition: coinselection.h:37
An outpoint - a combination of a transaction hash and an index n into its vout.
Definition: transaction.h:20
An output of a transaction.
Definition: transaction.h:128
Amount nValue
Definition: transaction.h:130
static constexpr Amount MIN_CHANGE
target minimum change amount
Definition: coinselection.h:13
static const Amount MIN_FINAL_CHANGE
final minimum change amount after paying for fees
Definition: coinselection.h:15
bool KnapsackSolver(const Amount nTargetValue, std::vector< OutputGroup > &groups, std::set< CInputCoin > &setCoinsRet, Amount &nValueRet)
bool SelectCoinsBnB(std::vector< OutputGroup > &utxo_pool, const Amount &target_value, const Amount &cost_of_change, std::set< CInputCoin > &out_set, Amount &value_ret, const Amount not_input_fees)
This is the Branch and Bound Coin Selection algorithm designed by Murch.
std::shared_ptr< const CTransaction > CTransactionRef
Definition: transaction.h:315
Definition: amount.h:19
static constexpr Amount zero() noexcept
Definition: amount.h:32
CoinEligibilityFilter(int conf_mine_, int conf_theirs_, bool include_partial_groups)
Definition: coinselection.h:75
const int conf_theirs
Minimum number of confirmations for outputs received from a different wallet.
Definition: coinselection.h:68
CoinEligibilityFilter(int conf_mine_, int conf_theirs_)
Definition: coinselection.h:73
const bool m_include_partial_groups
Include partial destination groups when avoid_reuse and there are full groups.
Definition: coinselection.h:71
std::vector< CInputCoin > m_outputs
Definition: coinselection.h:82
Amount m_value
Definition: coinselection.h:84
CFeeRate m_long_term_feerate
Definition: coinselection.h:90
Amount long_term_fee
Definition: coinselection.h:89
CFeeRate m_effective_feerate
Definition: coinselection.h:88
void Insert(const CInputCoin &output, int depth, bool from_me, bool positive_only)
OutputGroup(const CFeeRate &effective_feerate, const CFeeRate &long_term_feerate)
Definition: coinselection.h:93
Amount effective_value
Definition: coinselection.h:86
bool EligibleForSpending(const CoinEligibilityFilter &eligibility_filter) const