Skip to content
This repository has been archived by the owner on Nov 26, 2024. It is now read-only.

Commit

Permalink
Import bitcoind crate
Browse files Browse the repository at this point in the history
The `bitcoind` crate is provided for integration testing, it is tightly
coupled to the `client` and `bitcoin` crates. It might as well just live
here.

Import `bitcoind` at tag `v.036.0` as well as the changes in:

  rust-bitcoin/bitcoind#164
  • Loading branch information
tcharding committed Jun 3, 2024
1 parent 75d9143 commit f4c3396
Show file tree
Hide file tree
Showing 23 changed files with 1,689 additions and 19 deletions.
5 changes: 2 additions & 3 deletions Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
[workspace]
members = ["client", "json"]
members = ["client", "json", "bitcoind"]
exclude = ["integration_test"]
resolver = "2"

Expand All @@ -10,5 +10,4 @@ path = "client"
path = "json"

[patch.crates-io.bitcoind]
git = "https://github.com/tcharding/bitcoind"
branch = "bitcoind-json-rpc"
path = "bitcoind"
62 changes: 62 additions & 0 deletions bitcoind/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
# Changelog

## 0.36.0

- Remove range dependencies for `bitcoincore-rpc` and depend on the
latest version `v0.19.0` [#163](https://github.com/rust-bitcoin/bitcoind/pull/163).

## 0.35.2

- Use range dependencies for `bitcoincore-rpc` and `bitcoin_hashes`

## Release 0.35.1

- Bump MSRV to 1.56.1
- Add `BITCOIND_SKIP_DOWNLOAD` build feature

## Release 0.34.2

- Support Bitcoin Core 26.0

## Release 0.34.1

- Optionally enable ZMQ

## Release 0.34.0

- upgrade bitcoincore dep to 0.18.0 and with it bitcoin to 0.31.0

## Release 0.28.0

### Changed

- bump `ureq`'s version to `2.5.0`
- bump `flate2`'s version to `1.0.24`
- bump `filetime`'s version to `0.2.18`

## Release 0.27.1

### Changed

- use bitcoin_hashes 0.11 also for build dep

## Release 0.27.0

### Added

- Introduced CHANGELOG
- Supports windows OS
- Provide errors if `rpcuser` and `rpcpassword` are provided

### Changed

- use bitcoin dep to 0.29.1

### Fixed

- fix bitcoin 0.23 on MacOS X
- fix test flakiness

### Removed

- removed `datadir` from `ConnectionParams`, use equivalent `workdir()`
60 changes: 60 additions & 0 deletions bitcoind/Cargo.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
[package]
name = "bitcoind"
version = "0.37.0"
authors = ["Riccardo Casatta <[email protected]>"]
description = "Utility to run a regtest bitcoind process, useful in integration testing environment"
license = "MIT"
repository = "https://github.com/RCasatta/bitcoind"
documentation = "https://docs.rs/bitcoind/"
rust-version = "1.56.1"
edition = "2018"
categories = ["cryptography::cryptocurrencies", "development-tools::testing"]

[dependencies]
bitcoind-json-rpc-client = { version = "0.1", features = ["client-sync"] }
log = "0.4"
which = "4.2.5"
anyhow = "1.0.66"
tempfile = "3"
serde_json = { version = "1.0.117" }

[dev-dependencies]
env_logger = "0.9.0"

[build-dependencies]
bitcoin_hashes = { version = ">= 0.13, <= 0.14", optional = true }
flate2 = { version = "1.0", optional = true }
tar = { version = "0.4", optional = true }
minreq = { version = "2.9.1", default-features = false, features = [
"https",
], optional = true }
zip = { version = "0.6", optional = true }
anyhow = "1.0.66"

[features]
"default" = ["0_17_1"] # FIXME: Default to latest after we get 26_0 worknig (or better still 26_1).

# download is not supposed to be used directly only through selecting one of the version feature
"download" = ["bitcoin_hashes", "flate2", "tar", "minreq", "zip"]

"26_0" = ["download", "25_2"]
"25_2" = ["download", "25_1"]
"25_1" = ["download", "25_0"]
"25_0" = ["download", "24_2"]
"24_2" = ["download", "24_0_1"]
"24_0_1" = ["download", "23_2"]
"23_2" = ["download", "23_1"]
"23_1" = ["download", "22_1"]
"22_1" = ["download", "0_21_2"]
"0_21_2" = ["download", "0_20_2"]
"0_20_2" = ["download", "0_19_1"]
"0_19_1" = ["download", "0_18_1"]
"0_18_1" = ["download", "0_17_1"]
"0_17_1" = ["download"]

"doc" = [] # used only for documentation building


[package.metadata.docs.rs]
features = ["download", "doc"]
rustdoc-args = ["--cfg", "docsrs"]
21 changes: 21 additions & 0 deletions bitcoind/LICENSE
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
MIT License

Copyright (c) 2020 Riccardo Casatta

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
119 changes: 119 additions & 0 deletions bitcoind/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,119 @@
[![MIT license](https://img.shields.io/github/license/RCasatta/bitcoind)](https://github.com/RCasatta/bitcoind/blob/master/LICENSE)
[![Crates](https://img.shields.io/crates/v/bitcoind.svg)](https://crates.io/crates/bitcoind)
[![Docs](https://img.shields.io/badge/docs.rs-bitcoind-green)](https://docs.rs/bitcoind)

# Bitcoind

Utility to run a regtest bitcoind process, useful in integration testing environment.

When the auto-download feature is selected by activating one of the version feature, such as `25_1`
for bitcoin core 25.1, starting a regtest node is as simple as that:

```rust
// the download feature is enabled whenever a specific version is enabled, for example `25_1` or `24_0_1`
#[cfg(feature = "download")]
{
use bitcoincore_rpc::RpcApi;
let bitcoind = bitcoind::BitcoinD::from_downloaded().unwrap();
assert_eq!(0, bitcoind.client.get_blockchain_info().unwrap().blocks);
}
```

The build script will automatically download the bitcoin core version 25.1 from [bitcoin core](https://bitcoincore.org),
verify the hashes and place it in the build directory for this crate. If you wish to download from an
alternate location, for example locally for CI, use the `BITCOIND_DOWNLOAD_ENDPOINT` env var.

When you don't use the auto-download feature you have the following options:

* have `bitcoind` executable in the `PATH`
* provide the `bitcoind` executable via the `BITCOIND_EXE` env var

```rust
use bitcoincore_rpc::RpcApi;
if let Ok(exe_path) = bitcoind::exe_path() {
let bitcoind = bitcoind::BitcoinD::new(exe_path).unwrap();
assert_eq!(0, bitcoind.client.get_blockchain_info().unwrap().blocks);
}
```

Startup options could be configured via the [`Conf`] struct using [`BitcoinD::with_conf`] or
[`BitcoinD::from_downloaded_with_conf`]

## Issues with traditional approach

I used integration testing based on external bash script launching needed external processes, there
are many issues with this approach like:

* External script may interfere with local development environment [1](https://github.com/rust-bitcoin/rust-bitcoincore-rpc/blob/200fc8247c1896709a673b82a89ca0da5e7aa2ce/integration_test/run.sh#L9)
* Use of a single huge test to test everything [2](https://github.com/rust-bitcoin/rust-bitcoincore-rpc/blob/200fc8247c1896709a673b82a89ca0da5e7aa2ce/integration_test/src/main.rs#L122-L203)
* If test are separated, a failing test may fail to leave a clean situation, causing other test to
fail (because of the initial situation, not a real failure)
* bash script are hard, especially support different OS and versions

## Features

* It waits until bitcoind daemon become ready to accept RPC commands
* `bitcoind` use a temporary directory as datadir. You can specify the root of your temp directories
so that you have node's datadir in a RAM disk (eg `/dev/shm`)
* Free ports are asked to the OS. Since you can't reserve the given port, a low probability race
condition is still possible, for this reason the process is tried to be spawn 3 times with different
ports.
* The process is killed when the struct goes out of scope no matter how the test finishes
* Allows easy spawning of dependent processes like:
- [electrs](https://github.com/RCasatta/electrsd)
- [cln](https://github.com/RCasatta/lightningd)
- [elements](https://github.com/RCasatta/elementsd)

Thanks to these features every `#[test]` could easily run isolated with its own environment.

## Doc

To build docs:

```sh
RUSTDOCFLAGS="--cfg docsrs" cargo +nightly doc --features download,doc --open
```

## MSRV

The MSRV is 1.56.1 for version 0.35.*

Note: to respect 1.56.1 MSRV you need to use and older version of some dependencies, in CI the below
dependency versions are pinned:

```sh
cargo update
cargo update -p tempfile --precise 3.3.0
cargo update -p log --precise 0.4.18
```

Pinning in `Cargo.toml` is avoided because it could cause
compilation issues downstream.

## Nix

For reproducibility reasons, Nix build scripts cannot hit the internet, but the
auto-download feature does exactly that. To successfully build under Nix the
user must provide the tarball locally and specify its location via the
`BITCOIND_TARBALL_FILE` env var.

Another option is to specify the `BITCOIND_SKIP_DOWNLOAD` env var and provide the
executable via the `PATH`.

Alternatively, use the dep without auto-download feature.

## Used by

* [firma](https://github.com/RCasatta/firma/)
* [payjoin](https://github.com/Kixunil/payjoin)
* [rust-miniscript](https://github.com/rust-bitcoin/rust-miniscript/tree/4a3ba11c2fd5063be960741d557f3f7a28041e1f/bitcoind-tests)

### Via bdk dependency

* [gun](https://github.com/LLFourn/gun)

### Via electrsd dependency:

* [bdk](https://github.com/bitcoindevkit/bdk)
* [BEWallet](https://github.com/LeoComandini/BEWallet)
* [gdk rust](https://github.com/Blockstream/gdk/blob/master/subprojects/gdk_rust/)
Loading

0 comments on commit f4c3396

Please sign in to comment.