mirror of
https://github.com/bitcoin/bitcoin.git
synced 2026-06-06 19:23:41 +02:00
Merge bitcoin/bitcoin#29523: Wallet: Add max_tx_weight to transaction funding options (take 2)
734076c6de[wallet, rpc]: add `max_tx_weight` to tx funding options (ismaelsadeeq)b6fc5043c1[wallet]: update the data type of `change_output_size`, `change_spend_size` and `tx_noinputs_size` to `int` (ismaelsadeeq)baab0d2d43[doc]: update reason for deducting change output weight (ismaelsadeeq)7f61d31a5c[refactor]: update coin selection algorithms input parameter `max_weight` name (ismaelsadeeq) Pull request description: This PR taken over from #29264 The PR added an option `max_tx_weight` to transaction funding RPC's that ensures the resulting transaction weight does not exceed the specified `max_tx_weight` limit. If `max_tx_weight` is not given `MAX_STANDARD_TX_WEIGHT` is used as the max threshold. This PR addressed outstanding review comments in #29264 For more context and rationale behind this PR see https://delvingbitcoin.org/t/lightning-transactions-with-v3-and-ephemeral-anchors/418/11?u=instagibbs ACKs for top commit: achow101: ACK734076c6defurszy: utACK734076c6derkrux: reACK [734076c](734076c6de) Tree-SHA512: 013501aa443d239ee2ac01bccfc5296490c27b4edebe5cfca6b96c842375e895e5cfeb5424e82e359be581460f8be92095855763a62779a18ccd5bdfdd7ddce7
This commit is contained in:
@@ -139,9 +139,9 @@ struct CoinSelectionParams {
|
||||
/** Randomness to use in the context of coin selection. */
|
||||
FastRandomContext& rng_fast;
|
||||
/** Size of a change output in bytes, determined by the output type. */
|
||||
size_t change_output_size = 0;
|
||||
int change_output_size = 0;
|
||||
/** Size of the input to spend a change output in virtual bytes. */
|
||||
size_t change_spend_size = 0;
|
||||
int change_spend_size = 0;
|
||||
/** Mininmum change to target in Knapsack solver and CoinGrinder:
|
||||
* select coins to cover the payment and at least this value of change. */
|
||||
CAmount m_min_change_target{0};
|
||||
@@ -162,7 +162,7 @@ struct CoinSelectionParams {
|
||||
CFeeRate m_discard_feerate;
|
||||
/** Size of the transaction before coin selection, consisting of the header and recipient
|
||||
* output(s), excluding the inputs and change output(s). */
|
||||
size_t tx_noinputs_size = 0;
|
||||
int tx_noinputs_size = 0;
|
||||
/** Indicate that we are subtracting the fee from outputs */
|
||||
bool m_subtract_fee_outputs = false;
|
||||
/** When true, always spend all (up to OUTPUT_GROUP_MAX_ENTRIES) or none of the outputs
|
||||
@@ -174,10 +174,13 @@ struct CoinSelectionParams {
|
||||
* 1) Received from other wallets, 2) replacing other txs, 3) that have been replaced.
|
||||
*/
|
||||
bool m_include_unsafe_inputs = false;
|
||||
/** The maximum weight for this transaction. */
|
||||
std::optional<int> m_max_tx_weight{std::nullopt};
|
||||
|
||||
CoinSelectionParams(FastRandomContext& rng_fast, size_t change_output_size, size_t change_spend_size,
|
||||
CoinSelectionParams(FastRandomContext& rng_fast, int change_output_size, int change_spend_size,
|
||||
CAmount min_change_target, CFeeRate effective_feerate,
|
||||
CFeeRate long_term_feerate, CFeeRate discard_feerate, size_t tx_noinputs_size, bool avoid_partial)
|
||||
CFeeRate long_term_feerate, CFeeRate discard_feerate, int tx_noinputs_size, bool avoid_partial,
|
||||
std::optional<int> max_tx_weight = std::nullopt)
|
||||
: rng_fast{rng_fast},
|
||||
change_output_size(change_output_size),
|
||||
change_spend_size(change_spend_size),
|
||||
@@ -186,7 +189,8 @@ struct CoinSelectionParams {
|
||||
m_long_term_feerate(long_term_feerate),
|
||||
m_discard_feerate(discard_feerate),
|
||||
tx_noinputs_size(tx_noinputs_size),
|
||||
m_avoid_partial_spends(avoid_partial)
|
||||
m_avoid_partial_spends(avoid_partial),
|
||||
m_max_tx_weight(max_tx_weight)
|
||||
{
|
||||
}
|
||||
CoinSelectionParams(FastRandomContext& rng_fast)
|
||||
@@ -440,9 +444,9 @@ public:
|
||||
};
|
||||
|
||||
util::Result<SelectionResult> SelectCoinsBnB(std::vector<OutputGroup>& utxo_pool, const CAmount& selection_target, const CAmount& cost_of_change,
|
||||
int max_weight);
|
||||
int max_selection_weight);
|
||||
|
||||
util::Result<SelectionResult> CoinGrinder(std::vector<OutputGroup>& utxo_pool, const CAmount& selection_target, CAmount change_target, int max_weight);
|
||||
util::Result<SelectionResult> CoinGrinder(std::vector<OutputGroup>& utxo_pool, const CAmount& selection_target, CAmount change_target, int max_selection_weight);
|
||||
|
||||
/** Select coins by Single Random Draw. OutputGroups are selected randomly from the eligible
|
||||
* outputs until the target is satisfied
|
||||
@@ -450,15 +454,15 @@ util::Result<SelectionResult> CoinGrinder(std::vector<OutputGroup>& utxo_pool, c
|
||||
* @param[in] utxo_pool The positive effective value OutputGroups eligible for selection
|
||||
* @param[in] target_value The target value to select for
|
||||
* @param[in] rng The randomness source to shuffle coins
|
||||
* @param[in] max_weight The maximum allowed weight for a selection result to be valid
|
||||
* @param[in] max_selection_weight The maximum allowed weight for a selection result to be valid
|
||||
* @returns If successful, a valid SelectionResult, otherwise, util::Error
|
||||
*/
|
||||
util::Result<SelectionResult> SelectCoinsSRD(const std::vector<OutputGroup>& utxo_pool, CAmount target_value, CAmount change_fee, FastRandomContext& rng,
|
||||
int max_weight);
|
||||
int max_selection_weight);
|
||||
|
||||
// Original coin selection algorithm as a fallback
|
||||
util::Result<SelectionResult> KnapsackSolver(std::vector<OutputGroup>& groups, const CAmount& nTargetValue,
|
||||
CAmount change_target, FastRandomContext& rng, int max_weight);
|
||||
CAmount change_target, FastRandomContext& rng, int max_selection_weight);
|
||||
} // namespace wallet
|
||||
|
||||
#endif // BITCOIN_WALLET_COINSELECTION_H
|
||||
|
||||
Reference in New Issue
Block a user