This repository has been archived by the owner on Nov 26, 2024. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 5
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
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
Showing
23 changed files
with
1,689 additions
and
19 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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()` |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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"] |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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/) |
Oops, something went wrong.