Skip to content

Commit

Permalink
Add honggfuzz
Browse files Browse the repository at this point in the history
  • Loading branch information
yancyribbens committed Jul 27, 2024
1 parent 4f46170 commit 12d4d33
Show file tree
Hide file tree
Showing 12 changed files with 195 additions and 27 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/rust.yml
Original file line number Diff line number Diff line change
Expand Up @@ -39,4 +39,4 @@ jobs:
override: true
- name: Running test script
env: ${{ matrix.env }}
run: ./contrib/test.sh
run: cd bitcoin-coin-selection && ../contrib/test.sh
30 changes: 4 additions & 26 deletions Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,27 +1,5 @@
[package]
authors = [
"Yancy Ribbens <[email protected]>",
[workspace]
members = [
"bitcoin-coin-selection", "fuzz",
]
edition = "2018"
homepage = "https://github.com/rust-bitcoin/rust-bitcoin-coin-selection/"
license = "CC0-1.0"
name = "bitcoin-coin-selection"
repository = "https://github.com/rust-bitcoin/rust-bitcoin-coin-selection/"
version = "0.5.0"
# documentation = "https://docs.rs/bitcoin-coin-selection/"
description = "Libary providing utility functions to efficiently select a set of UTXOs."
keywords = ["bitcoin", "coin-selection", "coin", "coinselection", "utxo"]
readme = "README.md"

[dependencies]
bitcoin = "0.32.2"
rand = {version = "0.8.5", default-features = false, optional = true}

[dev-dependencies]
criterion = "0.3"
bitcoin-coin-selection = {path = ".", features = ["rand"]}
rand = "0.8.5"

[[bench]]
name = "coin_selection"
harness = false
resolver = "1"
8 changes: 8 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,14 @@ To run the benchmarks use: `cargo bench`.

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

## Fuzz

To run fuzzer:

Single Random Draw: `cargo hfuzz run single_random_draw_select_coins`
Branch and Bound: `cargo hfuzz run branch_and_bound_select_coins`
Select Coins (both SRD and BNB): `cargo hfuzz run select_coins`

### performance comparison

A basic performance comparison between this Rust BnB implementation and [Bitcoin Core](https://github.com/bitcoin/bitcoin/blob/4b1196a9855dcd188a24f393aa2fa21e2d61f061/src/wallet/coinselection.cpp#L76) using commodity hardware (My rather old laptop).
Expand Down
27 changes: 27 additions & 0 deletions bitcoin-coin-selection/Cargo.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
[package]
authors = [
"Yancy Ribbens <[email protected]>",
]
edition = "2018"
homepage = "https://github.com/rust-bitcoin/rust-bitcoin-coin-selection/"
license = "CC0-1.0"
name = "bitcoin-coin-selection"
repository = "https://github.com/rust-bitcoin/rust-bitcoin-coin-selection/"
version = "0.5.0"
# documentation = "https://docs.rs/bitcoin-coin-selection/"
description = "Libary providing utility functions to efficiently select a set of UTXOs."
keywords = ["bitcoin", "coin-selection", "coin", "coinselection", "utxo"]
readme = "README.md"

[dependencies]
bitcoin = { git = "https://github.com/yancyribbens/rust-bitcoin.git", rev = "edcd2fb5d78be71a60709d18fb367fd56171ff26" }
rand = {version = "0.8.5", default-features = false, optional = true}

[dev-dependencies]
criterion = "0.3"
bitcoin-coin-selection = {path = ".", features = ["rand"]}
rand = "0.8.5"

[[bench]]
name = "coin_selection"
harness = false
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
23 changes: 23 additions & 0 deletions fuzz/Cargo.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
[package]
name = "fuzz-coin-selection"
version = "0.1.0"
edition = "2021"

[dependencies]
honggfuzz = "0.5.56"
bitcoin-coin-selection = { path= "../bitcoin-coin-selection", features=["rand"] }
rand = "0.8.5"
bitcoin = { git = "https://github.com/yancyribbens/rust-bitcoin.git", rev = "edcd2fb5d78be71a60709d18fb367fd56171ff26" }
arbitrary = { version = "1", features = ["derive"] }

[[bin]]
name = "single_random_draw_select_coins"
path = "fuzz_targets/single_random_draw_select_coins.rs"

[[bin]]
name = "branch_and_bound_select_coins"
path = "fuzz_targets/branch_and_bound_select_coins.rs"

[[bin]]
name = "select_coins"
path = "fuzz_targets/select_coins.rs"
44 changes: 44 additions & 0 deletions fuzz/fuzz_targets/branch_and_bound_select_coins.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
use bitcoin_coin_selection::WeightedUtxo;

use bitcoin_coin_selection::select_coins_bnb;
use honggfuzz::fuzz;
use arbitrary::Arbitrary;

use bitcoin::TxOut;
use bitcoin::Amount;
use bitcoin::FeeRate;
use bitcoin::Weight;

#[derive(Arbitrary, Debug)]
pub struct Utxo {
output: TxOut,
satisfaction_weight: Weight
}

impl WeightedUtxo for Utxo {
fn satisfaction_weight(&self) -> Weight {
self.satisfaction_weight
}

fn value(&self) -> Amount {
self.output.value
}
}

#[derive(Arbitrary, Debug)]
pub struct Params {
target: Amount,
cost_of_change: Amount,
fee_rate: FeeRate,
long_term_fee_rate: FeeRate,
weighted_utxos: Vec<Utxo>,
}

fn main() {
loop {
fuzz!(|params: Params| {
let Params { target: t, cost_of_change: c, fee_rate: f, long_term_fee_rate: ltf, weighted_utxos: wu } = params;
select_coins_bnb(t, c, f, ltf, &wu);
});
}
}
44 changes: 44 additions & 0 deletions fuzz/fuzz_targets/select_coins.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
use bitcoin_coin_selection::WeightedUtxo;

use bitcoin_coin_selection::select_coins;
use honggfuzz::fuzz;
use arbitrary::Arbitrary;

use bitcoin::TxOut;
use bitcoin::Amount;
use bitcoin::FeeRate;
use bitcoin::Weight;

#[derive(Arbitrary, Debug)]
pub struct Utxo {
output: TxOut,
satisfaction_weight: Weight
}

impl WeightedUtxo for Utxo {
fn satisfaction_weight(&self) -> Weight {
self.satisfaction_weight
}

fn value(&self) -> Amount {
self.output.value
}
}

#[derive(Arbitrary, Debug)]
pub struct Params {
target: Amount,
cost_of_change: Amount,
fee_rate: FeeRate,
long_term_fee_rate: FeeRate,
weighted_utxos: Vec<Utxo>,
}

fn main() {
loop {
fuzz!(|params: Params| {
let Params { target: t, cost_of_change: c, fee_rate: f, long_term_fee_rate: ltf, weighted_utxos: wu } = params;
select_coins(t, c, f, ltf, &wu);
});
}
}
44 changes: 44 additions & 0 deletions fuzz/fuzz_targets/single_random_draw_select_coins.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
use bitcoin_coin_selection::WeightedUtxo;

use bitcoin_coin_selection::select_coins_srd;
use honggfuzz::fuzz;
use arbitrary::Arbitrary;

use rand::thread_rng;

use bitcoin::TxOut;
use bitcoin::FeeRate;
use bitcoin::Amount;
use bitcoin::Weight;

#[derive(Arbitrary, Debug)]
pub struct Utxo {
output: TxOut,
satisfaction_weight: Weight
}

impl WeightedUtxo for Utxo {
fn satisfaction_weight(&self) -> Weight {
self.satisfaction_weight
}

fn value(&self) -> Amount {
self.output.value
}
}

#[derive(Arbitrary, Debug)]
pub struct Params {
target: Amount,
fee_rate: FeeRate,
weighted_utxos: Vec<Utxo>,
}

fn main() {
loop {
fuzz!(|params: Params| {
let Params { target: t, fee_rate: f, weighted_utxos: wu } = params;
select_coins_srd(t, f, &wu, &mut thread_rng());
});
}
}

0 comments on commit 12d4d33

Please sign in to comment.