Custom fork of rust-bitcoin with unsafe modifications for higher speed. Unsuitable for production.
Go to file
merge-script 4ca6cd6065
Merge rust-bitcoin/rust-bitcoin#4458: locktimes: replace `MtpAndHeight` type with pair of `BlockMtp` and `BlockHeight`
47c77afaac units: delete MtpAndHeight type (Andrew Poelstra)
d82b8c0bcb primitives: stop using MtpAndHeight (Andrew Poelstra)
72d5fbad73 units: stop using MtpAndHeight in locktime::relative is_satisfied_by methods (Andrew Poelstra)
d933c754f5 units: change type of MtpHeight::to_mtp to BlockMtp (Andrew Poelstra)
dcbdb7ca8a units: add checked arithmetic to Block{Height,Mtp}{Interval,} (Andrew Poelstra)
4300271f0c units: add constructor for absolute::Mtp from timestamps (Andrew Poelstra)
4e4601b3d5 units: rename BlockInterval to BlockHeightInterval (Andrew Poelstra)
cb882c5ce1 units: add global `BlockMtpInterval` type (Andrew Poelstra)
4e3af5162f units: add global `BlockMtp` type (Andrew Poelstra)
a3228d4636 units: pull u32 conversions for BlockHeight/BlockInterval into macro (Andrew Poelstra)

Pull request description:

  This is a more involved PR than I'd expected but hopefully the individual commits make sense and are well-motivated. Essentially, my goal was to replace `MtpAndHeight` as used by relative locktimes with a pair of `Mtp` and `Height`.

  However, relative locktimes, when given a MTP/Height for the UTXO creation and the chain tip, are roughly modeled as "take a diff of MTPs to get a `relative::MtpInterval`, a diff of heights to get a `relative::HeightInterval`, and compare to the locktimes". *However*, we have no standalone MTP type to "take a diff of", and also there are failure modes when creating the diffs (e.g. if the diff would exceed the range of `MtpInterval` or `HeightInterval`).

  So I backed up and decided to use the existing `BlockHeight`/`BlockInterval` as the type to "take a diff of". I needed to introduce a `BlockMtp`/`BlockMtpInterval` to work with MTPs. These types have full-u32 range, unlike the similarly-named types in `units::locktimes::absolute`. I then needed to add some conversion methods. Along the way, I cleaned up the APIs and documentation, added checked arithmetic, etc., as needed.

  See the individual commit messages for more detail.

  I believe the resulting API is much more consistent and discoverable, even though it has more surface than the old API.

  I considered splitting this into 2 PRs but I think the first half of the changes aren't well-motivated with out the second half. Let me know.

ACKs for top commit:
  tcharding:
    ACK 47c77afaac

Tree-SHA512: ebe19a5b1684db8c2d913274347c994026aaa0dcdd79349c237920a82fe55560777278efdbbc7f1b1424c9391d9bbd891ae844db885deea75288000437a8a287
2025-05-07 22:32:16 +00:00
.cargo Remove impl Display from mutants exclusion list 2025-04-30 17:26:40 +01:00
.github Automated update to Github CI to cargo-semver-checks version-0.41.0 2025-04-26 01:10:57 +00:00
addresses Allow uninlined format args 2025-05-06 09:49:02 +01:00
base58 Allow uninlined format args 2025-05-06 09:49:02 +01:00
bitcoin Merge rust-bitcoin/rust-bitcoin#4458: locktimes: replace `MtpAndHeight` type with pair of `BlockMtp` and `BlockHeight` 2025-05-07 22:32:16 +00:00
chacha20_poly1305 Merge rust-bitcoin/rust-bitcoin#4460: fix duplicate poly1305.rs 2025-05-07 21:51:10 +00:00
contrib Fix the release script that checks for TBD 2025-03-03 17:25:34 +00:00
fuzz 2025-03-16 automated rustfmt nightly 2025-03-16 01:25:25 +00:00
githooks Fix typo in githooks warning message 2025-05-02 13:09:17 +02:00
hashes Merge rust-bitcoin/rust-bitcoin#4409: Manual update to rustc (to nightly-2025-05-02) 2025-05-07 14:13:07 +00:00
internals Fix rustdoc compile_fail example 2025-05-06 09:55:30 +01:00
io Allow uninlined format args 2025-05-06 09:49:02 +01:00
logo chore: format and standardize all markdowns files 2024-04-27 06:29:23 -03:00
primitives Merge rust-bitcoin/rust-bitcoin#4458: locktimes: replace `MtpAndHeight` type with pair of `BlockMtp` and `BlockHeight` 2025-05-07 22:32:16 +00:00
units Merge rust-bitcoin/rust-bitcoin#4458: locktimes: replace `MtpAndHeight` type with pair of `BlockMtp` and `BlockHeight` 2025-05-07 22:32:16 +00:00
.actrc feat: Support running CI locally with `act` 2022-02-17 21:11:30 +01:00
.gitattributes Set `diff=rust` for `*.rs` in `.gitattributes` 2024-07-27 08:53:19 +02:00
.gitignore Add weekly cargo-mutants workflow 2025-01-21 17:01:27 -06:00
CHANGELOG.md Make changelogs more discoverable 2024-10-15 14:07:41 +11:00
CONTRIBUTING.md removed API documentation section 2025-04-26 17:00:06 +02:00
Cargo-minimal.lock Implement Display for block::Header 2025-04-16 17:24:41 +10:00
Cargo-recent.lock Implement Display for block::Header 2025-04-16 17:24:41 +10:00
Cargo.toml refactor: use path dependencies for workspace members in bitcoin/Cargo.toml 2025-03-27 12:55:16 +08:00
LICENSE Add LICENSE file with CC0 in it 2014-07-18 17:37:13 -07:00
README.md changed wording and punctuation 2025-04-29 09:29:40 +02:00
SECURITY.md fix: small typo in SECURITY.md 2024-03-16 06:10:47 -03:00
clippy.toml primitives: Enable pedantic lints 2025-03-06 10:58:17 +11:00
justfile just: Add update-lock-files alias 2025-05-06 09:30:03 +10:00
nightly-version Update Github CI to rustc nightly-2025-05-02 2025-05-06 09:55:37 +01:00
rustfmt.toml Add rustfmt config option style_edition 2024-10-10 10:41:16 +11:00

README.md

Rust Bitcoin

Rust Bitcoin logo by Hunter Trujillo, see license and source files under /logo

Library with support for de/serialization, parsing and executing on data-structures and network messages related to Bitcoin.

Crate Info CC0 1.0 Universal Licensed CI Status API Docs Rustc Version 1.63.0+ Chat on IRC kani

Documentation

Supports (or should support)

  • De/serialization of Bitcoin protocol network messages
  • De/serialization of blocks and transactions
  • Script de/serialization
  • Private keys and address creation, de/serialization and validation (including full BIP32 support)
  • PSBT v0 de/serialization and all but the Input Finalizer role. Use rust-miniscript to finalize.

For JSONRPC interaction with Bitcoin Core, it is recommended to use rust-bitcoincore-rpc.

It is recommended to always use cargo-crev to verify the trustworthiness of each of your dependencies, including this one.

Known limitations

Consensus

This library must not be used for consensus code (i.e. fully validating blockchain data). It technically supports doing this, but doing so is very ill-advised because there are many deviations, known and unknown, between this library and the Bitcoin Core reference implementation. In a consensus based cryptocurrency, such as Bitcoin, it is critical that all parties are using the same rules to validate data, and this library is simply unable to implement the same rules as Core.

Given the complexity of both C++ and Rust, it is unlikely that this will ever be fixed, and there are no plans to do so. Of course, patches to fix specific consensus incompatibilities are welcome.

Support for 16-bit pointer sizes

16-bit pointer sizes are not supported, and we can't promise they will be. If you care about them please let us know, so we can know how large the interest is and possibly decide to support them.

Semver compliance

We try hard to maintain strict semver compliance with our releases. This codebase includes some public functions marked unstable (e.g., pub fn foo__unstable()). These functions do not adhere to semver rules; use them at your own discretion.

Documentation

Currently can be found on docs.rs/bitcoin. Patches to add usage examples and to expand on existing docs would be extremely appreciated.

Contributing

Contributions are generally welcome. If you intend to make larger changes please discuss them in an issue before PRing them to avoid duplicate work and architectural mismatches. If you have any questions or ideas you want to discuss, please join us in #bitcoin-rust on libera.chat.

For more information, please see CONTRIBUTING.md.

Minimum Supported Rust Version (MSRV)

This library should compile with any combination of features on Rust 1.63.0.

Use Cargo-minimal.lock to build the MSRV by copying to Cargo.lock and building.

External dependencies

We integrate with a few external libraries, most notably serde. These are available via feature flags. To ensure compatibility and MSRV stability, we provide two lock files as a means of inspecting compatible versions: Cargo-minimal.lock containing minimal versions of dependencies and Cargo-recent.lock containing recent versions of dependencies tested in our CI.

We do not provide any guarantees about the content of these lock files outside of "our CI didn't fail with these versions". Specifically, we do not guarantee that the committed hashes are free from malware. It is your responsibility to review them.

Installing Rust

Rust can be installed using your package manager of choice or rustup.rs. The former way is considered more secure since it typically doesn't involve trust in the CA system. But you should be aware that the version of Rust shipped by your distribution might be out of date. Generally this isn't a problem for rust-bitcoin since we support much older versions than the current stable one (see MSRV section).

Building

The library can be built and tested using cargo:

git clone git@github.com:rust-bitcoin/rust-bitcoin.git
cd rust-bitcoin
cargo build

You can run tests with:

cargo test

Please refer to the cargo documentation for more detailed instructions.

No-std support

The std cargo feature is enabled by default. To build this project without the Rust standard library, use the --no-default-features flag or set default-features = false in your dependency declaration when adding it to your project.

For embedded device examples, see bitcoin/embedded or hashes/embedded.

Just

We support just for running dev workflow commands. Run just from your shell to see a list of available sub-commands.

Building the docs

We build docs with the nightly toolchain, you may wish to use the following shell alias to check your documentation changes build correctly.

alias build-docs='RUSTDOCFLAGS="--cfg docsrs" cargo +nightly rustdoc --features="$FEATURES" -- -D rustdoc::broken-intra-doc-links'

Testing

Unit and integration tests are available for those interested, along with benchmarks. For project developers, especially new contributors looking for something to work on, we do:

There are always more tests to write and more bugs to find. PRs are extremely welcomed. Please consider testing code as a first-class citizen. We definitely do take PRs improving and cleaning up test code.

Unit/Integration tests

Run as for any other Rust project cargo test --all-features.

Benchmarks

We use a custom Rust compiler configuration conditional to guard the bench mark code. To run the bench marks use: RUSTFLAGS='--cfg=bench' cargo +nightly bench.

Mutation tests

We are doing mutation testing with cargo-mutants. To run these tests first install with cargo install --locked cargo-mutants then run with cargo mutants --in-place --no-shuffle. Note that running these mutation tests will take on the order of 10's of minutes.

Code verification

We have started using kani, install with cargo install --locked kani-verifier (no need to run cargo kani setup). Run the tests with cargo kani.

Pull Requests

Every PR needs at least two reviews to get merged. During the review phase, maintainers and contributors are likely to leave comments and request changes. Please try to address them, otherwise your PR might get closed without merging after a longer time of inactivity. If your PR isn't ready for review yet please mark it by prefixing the title with WIP: .

CI Pipeline

The CI pipeline requires approval before being run on each MR.

In order to speed up the review process the CI pipeline can be run locally using act. The fuzz and Cross jobs will be skipped when using act due to caching being unsupported at this time. We do not actively support act but will merge PRs fixing act issues.

Githooks

To assist devs in catching errors before running CI we provide some githooks. Copy the hooks in githooks/ to your githooks folder or run just githooks-install to copy them all.

Policy on Altcoins/Altchains

Since the altcoin landscape includes projects which frequently appear and disappear, and are poorly designed anyway we do not support any altcoins. Supporting Bitcoin properly is already difficult enough, and we do not want to increase the maintenance burden and decrease API stability by adding support for other coins.

Our code is public domain so by all means fork it and go wild :)

Release Notes

Release notes are done per crate, see:

Licensing

The code in this project is licensed under the Creative Commons CC0 1.0 Universal license. We use the SPDX license list and SPDX IDs.