mirror of
https://github.com/bitcoin/bitcoin.git
synced 2026-06-06 11:13:02 +02:00
Fold GetSelectionWaste() into ComputeAndSetWaste()
Both `GetSelectionWaste()` and `ComputeAndSetWaste()` now are part of `SelectionResult`. Instead of `ComputeAndSetWaste()` being a wrapper for `GetSelectionWaste()`, we combine them to a new function `RecalculateWaste()`. As I was combining the logic of the two functions, I noticed that `GetSelectionWaste()` was making the odd assumption that the `change_cost` being set to zero means that no change is created. However, if we build transactions at a feerate of zero with the `discard_feerate` also set to zero, we'd organically have a `change_cost` of zero, even when we create change on a transaction. This commit cleans up this duplicate meaning of `change_cost` and relies on `GetChange()` to figure out whether there is change on basis of the `min_viable_change` and whatever is left after deducting fees. Since this broke a bunch of tests that relied on the double-meaning of `change_cost` a bunch of tests had to be fixed.
This commit is contained in:
@@ -350,22 +350,6 @@ private:
|
||||
}
|
||||
}
|
||||
|
||||
/** Compute the waste for this result given the cost of change
|
||||
* and the opportunity cost of spending these inputs now vs in the future.
|
||||
* If change exists, waste = change_cost + inputs * (effective_feerate - long_term_feerate)
|
||||
* If no change, waste = excess + inputs * (effective_feerate - long_term_feerate)
|
||||
* where excess = selected_effective_value - target
|
||||
* change_cost = effective_feerate * change_output_size + long_term_feerate * change_spend_size
|
||||
*
|
||||
* @param[in] change_cost The cost of creating change and spending it in the future.
|
||||
* Only used if there is change, in which case it must be positive.
|
||||
* Must be 0 if there is no change.
|
||||
* @param[in] target The amount targeted by the coin selection algorithm.
|
||||
* @param[in] use_effective_value Whether to use the input's effective value (when true) or the real value (when false).
|
||||
* @return The waste
|
||||
*/
|
||||
[[nodiscard]] CAmount GetSelectionWaste(CAmount change_cost, CAmount target, bool use_effective_value = true);
|
||||
|
||||
public:
|
||||
explicit SelectionResult(const CAmount target, SelectionAlgorithm algo)
|
||||
: m_target(target), m_algo(algo) {}
|
||||
@@ -387,8 +371,19 @@ public:
|
||||
/** How much individual inputs overestimated the bump fees for shared ancestries */
|
||||
void SetBumpFeeDiscount(const CAmount discount);
|
||||
|
||||
/** Calculates and stores the waste for this selection via GetSelectionWaste */
|
||||
void ComputeAndSetWaste(const CAmount min_viable_change, const CAmount change_cost, const CAmount change_fee);
|
||||
/** Calculates and stores the waste for this result given the cost of change
|
||||
* and the opportunity cost of spending these inputs now vs in the future.
|
||||
* If change exists, waste = change_cost + inputs * (effective_feerate - long_term_feerate) - bump_fee_group_discount
|
||||
* If no change, waste = excess + inputs * (effective_feerate - long_term_feerate) - bump_fee_group_discount
|
||||
* where excess = selected_effective_value - target
|
||||
* change_cost = effective_feerate * change_output_size + long_term_feerate * change_spend_size
|
||||
*
|
||||
* @param[in] min_viable_change The minimum amount necessary to make a change output economic
|
||||
* @param[in] change_cost The cost of creating a change output and spending it in the future. Only
|
||||
* used if there is change, in which case it must be non-negative.
|
||||
* @param[in] change_fee The fee for creating a change output
|
||||
*/
|
||||
void RecalculateWaste(const CAmount min_viable_change, const CAmount change_cost, const CAmount change_fee);
|
||||
[[nodiscard]] CAmount GetWaste() const;
|
||||
|
||||
/** Tracks that algorithm was able to exhaustively search the entire combination space before hitting limit of tries */
|
||||
|
||||
Reference in New Issue
Block a user