Skip to content

yancyribbens/rust-bitcoin-coin-selection

 
 

Repository files navigation

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.

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Rust 97.9%
  • Shell 2.1%