This library provides efficient algorithms to compose a set of unspent transaction outputs (UTXOs). When a Bitcoin wallet creates a transaction, there is a diverse set of trade-offs to decide which UTXOs to choose. The trade-offs for deciding which set of UTXOs to use are described in depth here: An Evaluation of Coin Selection Stratagies as well as here: What is the Waste Metric?.
The goal of coin selection is to minimize the amount of waste in a selection. The waste for a given selection is calculated as input_weight × (feerate - longterm_feerate) + cost_of_change + excess
.
The current interface is provided via select_coins()
function. The required parameters are:
target
- The desired transaction amount.
cost_of_change
- How expensive it is to create a new output (UTXO).
utxo_pool
- The set of possible UTXOs to choose from.
As discussed in the literature above, ideally we want to choose a selection from the existing UTXO set available to the wallet. However, if there is no combination that efficiently matches the target spend amount, then creating a change output by splitting a UTXO is the next best option. Therefore, the algorithm takes into account the current cost of creating a new output (cost_of_change).
To run the benchmarks use: cargo bench
.
Note: criterion requires rustc version 1.65 to run the benchmarks.
A basic performance comparison between this current Rust BnB implementation and the Bitcoin Core version using commodity hardware (My rather old laptop).
implementation | pool size | ns/iter |
---|---|---|
Rust BnB | 1,000 | 897,810 |
C++ Core BnB | 1,000 | 816,374 |
Note: The measurements where recorded using rustc 1.75. Expect worse performance with MSRV.
This library should always compile with any combination of features on Rust 1.56.1.