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

Change bitcoin library to tapyrus #1

Merged
merged 2 commits into from
Jun 24, 2024
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
39 changes: 12 additions & 27 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -14,44 +14,29 @@ jobs:
test:
runs-on: ${{ matrix.os }}
env:
RUST_LOG: bitcoind=debug
RUST_LOG: tapyrusd=debug
NETWORK_ID: 1905960821
PRIVATE_KEY: cUJN5RVzYWFoeY8rUztd47jzXCu1p57Ay8V7pqCzsBD3PEXN7Dd4
GENESIS_BLOCK: 0100000000000000000000000000000000000000000000000000000000000000000000002b5331139c6bc8646bb4e5737c51378133f70b9712b75548cb3c05f9188670e7440d295e7300c5640730c4634402a3e66fb5d921f76b48d8972a484cc0361e66ef74f45e012103af80b90d25145da28c583359beb47b21796b2fe1a23c1511e443e7a64dfdb27d40e05f064662d6b9acf65ae416379d82e11a9b78cdeb3a316d1057cd2780e3727f70a61f901d10acbe349cd11e04aa6b4351e782c44670aefbe138e99a5ce75ace01010000000100000000000000000000000000000000000000000000000000000000000000000000000000ffffffff0100f2052a010000001976a91445d405b9ed450fec89044f9b7a99a4ef6fe2cd3f88ac00000000
strategy:
fail-fast: false
matrix:
os: [ubuntu-20.04]
feature:
[
"25_1",
"25_0",
"24_0_1",
"23_1",
"22_1",
"0_21_2",
"0_20_2",
"0_19_1",
"0_18_1",
"0_17_1",
"0_5_2",
"0_5_1",
]
include:
- os: "macos-11"
feature: "25_1"
- os: "windows-2019"
feature: "25_1"

steps:
- run: df -h
- uses: actions/checkout@v3
- uses: Swatinem/rust-cache@v2
with:
key: ${{ matrix.feature }}${{ matrix.os }}
if: ${{ matrix.os != 'macos-11' }} # issue with hard-links on mac
- uses: dtolnay/rust-toolchain@stable
- run: cargo test --features ${{ matrix.feature }}
- run: echo "BITCOIND_EXE=$(find ./target/debug -name bitcoind)" >> $GITHUB_ENV
if: ${{ matrix.os != 'windows-2019' }}
- run: echo "TAPYRUSD_EXE=$(find ./target/debug -name tapyrusd)" >> $GITHUB_ENV
- run: cargo test
if: ${{ matrix.feature != '0_18_1' && matrix.feature != '0_17_1' && matrix.os != 'windows-2019' }} # would fail `test_multi_wallet`


cosmetics:
runs-on: ubuntu-20.04
Expand Down Expand Up @@ -89,12 +74,12 @@ jobs:
build-nix:
runs-on: ubuntu-20.04
env:
FNAME: bitcoin-23.1-x86_64-linux-gnu.tar.gz
FNAME: tapyrus-core-0.5.2-x86_64-linux-gnu.tar.gz
steps:
- uses: actions/checkout@v3
- uses: Swatinem/rust-cache@v2
- uses: dtolnay/rust-toolchain@stable
- run: echo "BITCOIND_TARBALL_FILE=./${FNAME}" >> $GITHUB_ENV
- run: cargo build --features 23_1 && exit 1 || exit 0
- run: wget -q https://bitcoincore.org/bin/bitcoin-core-23.1/${FNAME}
- run: cargo build --features 23_1
- run: echo "TAPYRUSD_TARBALL_FILE=./${FNAME}" >> $GITHUB_ENV
- run: cargo build --features 0_5_2 && exit 1 || exit 0
- run: wget https://github.com/chaintope/tapyrus-core/releases/download/v0.5.2/${FNAME}
- run: cargo build --features 0_5_2
26 changes: 9 additions & 17 deletions Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,17 +1,17 @@
[package]
name = "bitcoind"
version = "0.36.0"
name = "tapyrusd"
version = "0.1.0"
authors = ["Riccardo Casatta <[email protected]>"]
description = "Utility to run a regtest bitcoind process, useful in integration testing environment"
description = "Utility to run a regtest tapyrusd process, useful in integration testing environment"
license = "MIT"
repository = "https://github.com/RCasatta/bitcoind"
documentation = "https://docs.rs/bitcoind/"
repository = "https://github.com/chaintope/tapyrusd"
documentation = "https://docs.rs/tapyrusd/"
rust-version = "1.56.1"
edition = "2018"
categories = ["cryptography::cryptocurrencies", "development-tools::testing"]

[dependencies]
bitcoincore-rpc = { version = "0.19", features = ["rand"] }
tapyruscore-rpc = { git="https://github.com/chaintope/rust-tapyruscore-rpc", subdir = "client", features = ["rand"] }
log = "0.4"
which = "4.2.5"
anyhow = "1.0.66"
Expand All @@ -35,17 +35,9 @@ anyhow = "1.0.66"
# 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_1"]
"25_1" = ["download", "25_0"]
"25_0" = ["download", "24_0_1"]
"24_0_1" = ["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"]
"0_5_2" = ["download", "0_5_1"]
"0_5_1" = ["download"]


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

Expand Down
26 changes: 13 additions & 13 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@
[![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
# Tapyrusd

Utility to run a regtest bitcoind process, useful in integration testing environment.
Utility to run a regtest tapyrusd 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:
Expand All @@ -13,31 +13,31 @@ for bitcoin core 25.1, starting a regtest node is as simple as that:
// 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);
use tapyruscore_rpc::RpcApi;
let tapyrusd = tapyrusd::TapyrusD::from_downloaded().unwrap();
assert_eq!(0, tapyrusd.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.
alternate location, for example locally for CI, use the `TAPYRUSD_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
* have `tapyrusd` executable in the `PATH`
* provide the `tapyrusd` executable via the `TAPYRUSD_EXE` env var

```rust
use bitcoincore_rpc::RpcApi;
if let Ok(exe_path) = bitcoind::exe_path() {
let bitcoind = bitcoind::BitcoinD::new(exe_path).unwrap();
use tapyruscore_rpc::RpcApi;
if let Ok(exe_path) = tapyrusd::exe_path() {
let bitcoind = tapyrusd::TapyrusD::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`]
Startup options could be configured via the [`Conf`] struct using [`TapyrusD::with_conf`] or
[`TapyrusD::from_downloaded_with_conf`]

## Issues with traditional approach

Expand Down
85 changes: 31 additions & 54 deletions build.rs
Original file line number Diff line number Diff line change
Expand Up @@ -23,36 +23,18 @@ mod download {

include!("src/versions.rs");

#[cfg(all(
target_os = "macos",
any(target_arch = "x86_64", target_arch = "aarch64"),
))]
fn download_filename() -> String {
if cfg!(not(feature = "23_1")) {
format!("bitcoin-{}-osx64.tar.gz", &VERSION)
} else {
format!("bitcoin-{}-x86_64-apple-darwin.tar.gz", &VERSION)
}
}

#[cfg(all(target_os = "linux", target_arch = "x86_64"))]
fn download_filename() -> String {
format!("bitcoin-{}-x86_64-linux-gnu.tar.gz", &VERSION)
format!("tapyrus-core-{}-x86_64-linux-gnu.tar.gz", &VERSION)
}

#[cfg(all(target_os = "linux", target_arch = "aarch64"))]
fn download_filename() -> String {
format!("bitcoin-{}-aarch64-linux-gnu.tar.gz", &VERSION)
}

#[cfg(all(target_os = "windows", target_arch = "x86_64"))]
fn download_filename() -> String {
format!("bitcoin-{}-win64.zip", &VERSION)
format!("tapyrus-core-{}-aarch64-linux-gnu.tar.gz", &VERSION)
}

fn get_expected_sha256(filename: &str) -> anyhow::Result<sha256::Hash> {
let sha256sums_filename = format!("sha256/bitcoin-core-{}-SHA256SUMS", &VERSION);
#[cfg(not(feature = "22_1"))]
let sha256sums_filename = format!("sha256/tapyrus-core-{}-SHA256SUMS", &VERSION);
let sha256sums_filename = format!("{}.asc", sha256sums_filename);
let file = File::open(&sha256sums_filename)
.with_context(|| format!("cannot find {:?}", sha256sums_filename))?;
Expand All @@ -71,38 +53,33 @@ mod download {
}

pub(crate) fn start() -> anyhow::Result<()> {
if std::env::var_os("BITCOIND_SKIP_DOWNLOAD").is_some() {
if std::env::var_os("TAPYRUSD_SKIP_DOWNLOAD").is_some() {
return Ok(());
}
let download_filename = download_filename();
let expected_hash = get_expected_sha256(&download_filename)?;
// let expected_hash = get_expected_sha256(&download_filename)?;
let out_dir = std::env::var_os("OUT_DIR").unwrap();

let mut bitcoin_exe_home = Path::new(&out_dir).join("bitcoin");
if !bitcoin_exe_home.exists() {
std::fs::create_dir(&bitcoin_exe_home)
.with_context(|| format!("cannot create dir {:?}", bitcoin_exe_home))?;
let mut tapyrus_exe_home = Path::new(&out_dir).join("tapyrus");
if !tapyrus_exe_home.exists() {
std::fs::create_dir(&tapyrus_exe_home)
.with_context(|| format!("cannot create dir {:?}", tapyrus_exe_home))?;
}
let existing_filename = bitcoin_exe_home
.join(format!("bitcoin-{}", VERSION))
let existing_filename = tapyrus_exe_home
.join(format!("tapyrus-{}", VERSION))
.join("bin")
.join("bitcoind");
.join("tapyrusd");

if !existing_filename.exists() {
println!(
"filename:{} version:{} hash:{}",
download_filename, VERSION, expected_hash
);
println!("filename:{} version:{}", download_filename, VERSION);

let (file_or_url, tarball_bytes) = match std::env::var("BITCOIND_TARBALL_FILE") {
let (file_or_url, tarball_bytes) = match std::env::var("TAPYRUSD_TARBALL_FILE") {
Err(_) => {
let download_endpoint = std::env::var("BITCOIND_DOWNLOAD_ENDPOINT")
.unwrap_or("https://bitcoincore.org/bin".to_owned());

let url = format!(
"{}/bitcoin-core-{}/{}",
download_endpoint, VERSION, download_filename
let download_endpoint = std::env::var("TAPYRUSD_DOWNLOAD_ENDPOINT").unwrap_or(
"https://github.com/chaintope/tapyrus-core/releases/download".to_owned(),
);

let url = format!("{}/v{}/{}", download_endpoint, VERSION, download_filename);
let resp = minreq::get(&url)
.send()
.with_context(|| format!("cannot reach url {}", url))?;
Expand All @@ -113,7 +90,7 @@ mod download {
Ok(path) => {
let f = File::open(&path).with_context(|| {
format!(
"Cannot find {:?} specified with env var BITCOIND_TARBALL_FILE",
"Cannot find {:?} specified with env var TAPYRUSD_TARBALL_FILE",
&path
)
})?;
Expand All @@ -125,20 +102,20 @@ mod download {
};

let tarball_hash = sha256::Hash::hash(&tarball_bytes);
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

リリースされているtarballのsha256値を検証する箇所はスキップしてます。

assert_eq!(
expected_hash, tarball_hash,
"expected hash of {} is not matching",
file_or_url
);
// assert_eq!(
// expected_hash, tarball_hash,
// "expected hash of {} is not matching",
// file_or_url
// );

if download_filename.ends_with(".tar.gz") {
let d = GzDecoder::new(&tarball_bytes[..]);

let mut archive = Archive::new(d);
for mut entry in archive.entries().unwrap().flatten() {
if let Ok(file) = entry.path() {
if file.ends_with("bitcoind") {
entry.unpack_in(&bitcoin_exe_home).unwrap();
if file.ends_with("tapyrusd") {
entry.unpack_in(&tapyrus_exe_home).unwrap();
}
}
}
Expand All @@ -152,16 +129,16 @@ mod download {
None => continue,
};

if outpath.file_name().map(|s| s.to_str()) == Some(Some("bitcoind.exe")) {
if outpath.file_name().map(|s| s.to_str()) == Some(Some("tapyrusd.exe")) {
for d in outpath.iter() {
bitcoin_exe_home.push(d);
tapyrus_exe_home.push(d);
}
let parent = bitcoin_exe_home.parent().unwrap();
let parent = tapyrus_exe_home.parent().unwrap();
std::fs::create_dir_all(&parent)
.with_context(|| format!("cannot create dir {:?}", parent))?;
let mut outfile =
std::fs::File::create(&bitcoin_exe_home).with_context(|| {
format!("cannot create file {:?}", bitcoin_exe_home)
std::fs::File::create(&tapyrus_exe_home).with_context(|| {
format!("cannot create file {:?}", tapyrus_exe_home)
})?;
io::copy(&mut file, &mut outfile).unwrap();
break;
Expand Down
Loading
Loading