# Bitcoind
Utility to run a regtest bitcoind process, useful in integration testing environment.
When the auto-download feature is enabled, starting a regtest node is as simple as that:
```rust
// the download feature must be enabled with a specific version, for example `25_1` or `24_0_1`
#[cfg(feature = "download")]
{
let node = corepc_node::Node::from_downloaded().unwrap();
assert_eq!(0, node.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 binary hash and place it in the build directory for this crate.
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
if let Ok(exe_path) = corepc_node::exe_path() {
let node = corepc_node::Node::new(exe_path).unwrap();
assert_eq!(0, node.client.get_blockchain_info().unwrap().blocks);
}
```
Startup options could be configured via the [`Conf`] struct using [`Node::with_conf`] or
`Node::from_downloaded_with_conf`
## Features
* Waits until bitcoind daemon becomes ready to accept RPC commands
* `node` uses a temporary directory as datadir. You can specify the root of your temp
directories so that you have the node's datadir in a RAM disk (eg `/dev/shm`)
* Free ports are requested from the OS. Since you can't reserve the given port, a low probability
race condition is still possible, for this reason the process attempts spawning 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
```
## Minimum Supported Rust Version (MSRV)
This library should always compile with any combination of features on **Rust 1.63.0**.
## 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 the auto-download feature.