bitcoin-coin-selection 0.3.1

Libary providing utility functions to efficiently select a set of UTXOs.
docs.rs failed to build bitcoin-coin-selection-0.3.1
Please check the build logs for more information.
See Builds for ideas on how to fix a failed build, or Metadata for how to configure docs.rs builds.
If you believe this is docs.rs' fault, open an issue.
Visit the last successful build: bitcoin-coin-selection-0.8.5

Coin Selection

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?.

TLDR

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.

Usage

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).

Benchmarks

To run the benchmarks use: cargo bench.

Note: criterion requires rustc version 1.65 to run the benchmarks.

performance comparison

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.

Minimum Supported Rust Version (MSRV)

This library should always compile with any combination of features on Rust 1.56.1.