Crates.io | bitcoin-coin-selection |
lib.rs | bitcoin-coin-selection |
version | 0.4.0 |
source | src |
created_at | 2024-06-30 04:07:47.275948 |
updated_at | 2024-07-12 13:36:16.202553 |
description | Libary providing utility functions to efficiently select a set of UTXOs. |
homepage | https://github.com/rust-bitcoin/rust-bitcoin-coin-selection/ |
repository | https://github.com/rust-bitcoin/rust-bitcoin-coin-selection/ |
max_upload_size | |
id | 1287768 |
size | 52,694 |
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 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).
fee_rate
- The current fee_rate.
long_term_fee_rate
- The long_term_fee_rate which helps determine if fee_rate is expensive or cheap.
utxo_pool
- The set of possible weighted UTXOs to choose from.
As discussed in the literature above, we want to find a "changeless" solution. A changeless solution is one that exceeds the target
however is less than target
+ cost_of_change
. If no changeless solution can be found, then creating a change output by splitting a UTXO is the next best outcome. To that end, select_coins()
initially attempts a Branch and Bound selection algorithm to find a changeless solution. If no changeless solution is found, then select_coins()
falls back to a Single Random Draw selection strategy.
To run the benchmarks use: cargo bench
.
Note: criterion requires rustc version 1.65 to run the benchmarks.
A basic performance comparison between this Rust BnB implementation and Bitcoin Core 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.