Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add back lib fuzzer #61

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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: cd bitcoin-coin-selection && ../contrib/test.sh
run: ./contrib/test.sh
39 changes: 35 additions & 4 deletions Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,5 +1,36 @@
[workspace]
members = [
"bitcoin-coin-selection", "fuzz",
[package]
authors = [
"Yancy Ribbens <[email protected]>",
]
resolver = "1"
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/rust-bitcoin/rust-bitcoin.git", rev = "cfb53c78667dafe8aea488f104f65a2a29a2f94d"}
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

[patch.crates-io]
bitcoin_hashes = { git = "https://github.com/rust-bitcoin/rust-bitcoin.git", rev = "cfb53c78667dafe8aea488f104f65a2a29a2f94d" }
base58ck = { git = "https://github.com/rust-bitcoin/rust-bitcoin.git", rev = "cfb53c78667dafe8aea488f104f65a2a29a2f94d" }
bitcoin-internals = { git = "https://github.com/rust-bitcoin/rust-bitcoin.git", rev = "cfb53c78667dafe8aea488f104f65a2a29a2f94d" }
bitcoin-io = { git = "https://github.com/rust-bitcoin/rust-bitcoin.git", rev = "cfb53c78667dafe8aea488f104f65a2a29a2f94d" }
bitcoin-primitives = { git = "https://github.com/rust-bitcoin/rust-bitcoin.git", rev = "cfb53c78667dafe8aea488f104f65a2a29a2f94d" }
bitcoin-addresses = { git = "https://github.com/rust-bitcoin/rust-bitcoin.git", rev = "cfb53c78667dafe8aea488f104f65a2a29a2f94d" }
bitcoin-units = { git = "https://github.com/rust-bitcoin/rust-bitcoin.git", rev = "cfb53c78667dafe8aea488f104f65a2a29a2f94d" }
6 changes: 1 addition & 5 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,11 +23,7 @@ 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`
Fuzz with `cargo fuzz run select_coins_srd`, `cargo fuzz run select_coins_bnb` or `cargo fuzz run select_coins`.

### performance comparison

Expand Down
File renamed without changes.
27 changes: 0 additions & 27 deletions bitcoin-coin-selection/Cargo.toml

This file was deleted.

45 changes: 35 additions & 10 deletions fuzz/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,23 +1,48 @@
[package]
name = "fuzz-coin-selection"
version = "0.1.0"
edition = "2021"
name = "bitcoin-coin-selection-fuzz"
version = "0.0.0"
publish = false
edition = "2018"

[package.metadata]
cargo-fuzz = true

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

[dependencies.bitcoin-coin-selection]
path = ".."
features = ["rand"]

[[bin]]
name = "single_random_draw_select_coins"
path = "fuzz_targets/single_random_draw_select_coins.rs"
name = "select_coins_srd"
path = "fuzz_targets/select_coins_srd.rs"
test = false
doc = false
bench = false

[[bin]]
name = "branch_and_bound_select_coins"
path = "fuzz_targets/branch_and_bound_select_coins.rs"
name = "select_coins_bnb"
path = "fuzz_targets/select_coins_bnb.rs"
test = false
doc = false
bench = false

[[bin]]
name = "select_coins"
path = "fuzz_targets/select_coins.rs"
test = false
doc = false
bench = false

[patch.crates-io]
bitcoin_hashes = { git = "https://github.com/rust-bitcoin/rust-bitcoin.git", rev = "cfb53c78667dafe8aea488f104f65a2a29a2f94d" }
base58ck = { git = "https://github.com/rust-bitcoin/rust-bitcoin.git", rev = "cfb53c78667dafe8aea488f104f65a2a29a2f94d" }
bitcoin-internals = { git = "https://github.com/rust-bitcoin/rust-bitcoin.git", rev = "cfb53c78667dafe8aea488f104f65a2a29a2f94d" }
bitcoin-io = { git = "https://github.com/rust-bitcoin/rust-bitcoin.git", rev = "cfb53c78667dafe8aea488f104f65a2a29a2f94d" }
bitcoin-primitives = { git = "https://github.com/rust-bitcoin/rust-bitcoin.git", rev = "cfb53c78667dafe8aea488f104f65a2a29a2f94d" }
bitcoin-addresses = { git = "https://github.com/rust-bitcoin/rust-bitcoin.git", rev = "cfb53c78667dafe8aea488f104f65a2a29a2f94d" }
bitcoin-units = { git = "https://github.com/rust-bitcoin/rust-bitcoin.git", rev = "cfb53c78667dafe8aea488f104f65a2a29a2f94d" }
14 changes: 10 additions & 4 deletions fuzz/fuzz_targets/branch_and_bound_select_coins.rs
Original file line number Diff line number Diff line change
@@ -1,18 +1,18 @@
use bitcoin_coin_selection::WeightedUtxo;

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

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

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

impl WeightedUtxo for Utxo {
Expand All @@ -37,7 +37,13 @@ pub struct Params {
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;
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);
});
}
Expand Down
42 changes: 16 additions & 26 deletions fuzz/fuzz_targets/select_coins.rs
Original file line number Diff line number Diff line change
@@ -1,18 +1,14 @@
use bitcoin_coin_selection::WeightedUtxo;
#![no_main]

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

use bitcoin::TxOut;
use bitcoin::Amount;
use bitcoin::FeeRate;
use bitcoin::Weight;
use arbitrary::{Arbitrary, Unstructured};
use bitcoin::{TxOut, FeeRate, Amount, Weight};
use bitcoin_coin_selection::{select_coins, WeightedUtxo};
use libfuzzer_sys::fuzz_target;

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

impl WeightedUtxo for Utxo {
Expand All @@ -25,20 +21,14 @@ impl WeightedUtxo for Utxo {
}
}

#[derive(Arbitrary, Debug)]
pub struct Params {
target: Amount,
cost_of_change: Amount,
fee_rate: FeeRate,
long_term_fee_rate: FeeRate,
weighted_utxos: Vec<Utxo>,
}
fuzz_target!(|data: &[u8]| {
let mut u = Unstructured::new(&data);

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);
});
}
}
let target = Amount::arbitrary(&mut u).unwrap();
let cost_of_change = Amount::arbitrary(&mut u).unwrap();
let fee_rate = FeeRate::arbitrary(&mut u).unwrap();
let lt_fee_rate = FeeRate::arbitrary(&mut u).unwrap();
let wu = Vec::<Utxo>::arbitrary(&mut u).unwrap();

select_coins(target, cost_of_change, fee_rate, lt_fee_rate, &wu);
});
34 changes: 34 additions & 0 deletions fuzz/fuzz_targets/select_coins_bnb.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
#![no_main]

use arbitrary::{Arbitrary, Unstructured};
use bitcoin::{TxOut, FeeRate, Amount, Weight};
use bitcoin_coin_selection::{select_coins_bnb, WeightedUtxo};
use libfuzzer_sys::fuzz_target;

#[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
}
}

fuzz_target!(|data: &[u8]| {
let mut u = Unstructured::new(&data);

let target = Amount::arbitrary(&mut u).unwrap();
let cost_of_change = Amount::arbitrary(&mut u).unwrap();
let fee_rate = FeeRate::arbitrary(&mut u).unwrap();
let lt_fee_rate = FeeRate::arbitrary(&mut u).unwrap();
let wu = Vec::<Utxo>::arbitrary(&mut u).unwrap();

select_coins_bnb(target, cost_of_change, fee_rate, lt_fee_rate, &wu);
});
33 changes: 33 additions & 0 deletions fuzz/fuzz_targets/select_coins_srd.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
#![no_main]

use arbitrary::{Arbitrary, Unstructured};
use bitcoin::{TxOut, FeeRate, Amount, Weight};
use bitcoin_coin_selection::{select_coins_srd, WeightedUtxo};
use libfuzzer_sys::fuzz_target;
use rand::thread_rng;

#[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
}
}

fuzz_target!(|data: &[u8]| {
let mut u = Unstructured::new(&data);

let target = Amount::arbitrary(&mut u).unwrap();
let fee_rate = FeeRate::arbitrary(&mut u).unwrap();
let wu = Vec::<Utxo>::arbitrary(&mut u).unwrap();

select_coins_srd(target, fee_rate, &wu, &mut thread_rng());
});
8 changes: 4 additions & 4 deletions fuzz/fuzz_targets/single_random_draw_select_coins.rs
Original file line number Diff line number Diff line change
@@ -1,20 +1,20 @@
use bitcoin_coin_selection::WeightedUtxo;

use arbitrary::Arbitrary;
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::FeeRate;
use bitcoin::TxOut;
use bitcoin::Weight;

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

impl WeightedUtxo for Utxo {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -370,52 +370,43 @@ mod tests {
}

#[test]
fn select_coins_bnb_one() { assert_coin_select("1 cBTC", &["0.01000000 BTC"]); }
fn select_coins_bnb_one() { assert_coin_select("1 cBTC", &["0.01 BTC"]); }

#[test]
fn select_coins_bnb_two() { assert_coin_select("2 cBTC", &["0.02000000 BTC"]); }
fn select_coins_bnb_two() { assert_coin_select("2 cBTC", &["0.02 BTC"]); }

#[test]
fn select_coins_bnb_three() {
assert_coin_select("3 cBTC", &["0.02000000 BTC", "0.01000000 BTC"]);
}
fn select_coins_bnb_three() { assert_coin_select("3 cBTC", &["0.02 BTC", "0.01 BTC"]); }

#[test]
fn select_coins_bnb_four() {
assert_coin_select("4 cBTC", &["0.03000000 BTC", "0.01000000 BTC"]);
}
fn select_coins_bnb_four() { assert_coin_select("4 cBTC", &["0.03 BTC", "0.01 BTC"]); }

#[test]
fn select_coins_bnb_five() {
assert_coin_select("5 cBTC", &["0.03000000 BTC", "0.02000000 BTC"]);
}
fn select_coins_bnb_five() { assert_coin_select("5 cBTC", &["0.03 BTC", "0.02 BTC"]); }

#[test]
fn select_coins_bnb_six() {
assert_coin_select("6 cBTC", &["0.03000000 BTC", "0.02000000 BTC", "0.01000000 BTC"]);
assert_coin_select("6 cBTC", &["0.03 BTC", "0.02 BTC", "0.01 BTC"]);
}

#[test]
fn select_coins_bnb_seven() {
assert_coin_select("7 cBTC", &["0.04000000 BTC", "0.02000000 BTC", "0.01000000 BTC"]);
assert_coin_select("7 cBTC", &["0.04 BTC", "0.02 BTC", "0.01 BTC"]);
}

#[test]
fn select_coins_bnb_eight() {
assert_coin_select("8 cBTC", &["0.04000000 BTC", "0.03000000 BTC", "0.01000000 BTC"]);
assert_coin_select("8 cBTC", &["0.04 BTC", "0.03 BTC", "0.01 BTC"]);
}

#[test]
fn select_coins_bnb_nine() {
assert_coin_select("9 cBTC", &["0.04000000 BTC", "0.03000000 BTC", "0.02000000 BTC"]);
assert_coin_select("9 cBTC", &["0.04 BTC", "0.03 BTC", "0.02 BTC"]);
}

#[test]
fn select_coins_bnb_ten() {
assert_coin_select(
"10 cBTC",
&["0.04000000 BTC", "0.03000000 BTC", "0.02000000 BTC", "0.01000000 BTC"],
);
assert_coin_select("10 cBTC", &["0.04 BTC", "0.03 BTC", "0.02 BTC", "0.01 BTC"]);
}

#[test]
Expand Down
Loading
Loading