BDK

A modern, lightweight, descriptor-based wallet library written in Rust!

Crate Info MIT or Apache-2.0 Licensed CI Status API Docs Rustc Version 1.63.0+ Chat on Discord

Project Homepage | Documentation

## `bdk` The `bdk` crate provides the [`Wallet`](`crate::Wallet`) type which is a simple, high-level interface built from the low-level components of [`bdk_chain`]. `Wallet` is a good starting point for many simple applications as well as a good demonstration of how to use the other mechanisms to construct a wallet. It has two keychains (external and internal) which are defined by [miniscript descriptors][`rust-miniscript`] and uses them to generate addresses. When you give it chain data it also uses the descriptors to find transaction outputs owned by them. From there, you can create and sign transactions. For more information, see the [`Wallet`'s documentation](https://docs.rs/bdk/latest/bdk/wallet/struct.Wallet.html). ### Blockchain data In order to get blockchain data for `Wallet` to consume, you have to put it into particular form. Right now this is [`KeychainScan`] which is defined in [`bdk_chain`]. This can be created manually or from blockchain-scanning crates. **Blockchain Data Sources** * [`bdk_esplora`]: Grabs blockchain data from Esplora for updating BDK structures. * [`bdk_electrum`]: Grabs blockchain data from Electrum for updating BDK structures. **Examples** * [`example-crates/wallet_esplora`](https://github.com/bitcoindevkit/bdk/tree/master/example-crates/wallet_esplora) * [`example-crates/wallet_electrum`](https://github.com/bitcoindevkit/bdk/tree/master/example-crates/wallet_electrum) ### Persistence To persist the `Wallet` on disk, `Wallet` needs to be constructed with a [`Persist`](https://docs.rs/bdk_chain/latest/bdk_chain/keychain/struct.KeychainPersist.html) implementation. **Implementations** * [`bdk_file_store`]: a simple flat-file implementation of `Persist`. **Example** ```rust use bdk::{bitcoin::Network, wallet::{AddressIndex, Wallet}}; fn main() { // a type that implements `Persist` let db = (); let descriptor = "wpkh(tprv8ZgxMBicQKsPdy6LMhUtFHAgpocR8GC6QmwMSFpZs7h6Eziw3SpThFfczTDh5rW2krkqffa11UpX3XkeTTB2FvzZKWXqPY54Y6Rq4AQ5R8L/84'/0'/0'/0/*)"; let mut wallet = Wallet::new(descriptor, None, db, Network::Testnet).expect("should create"); // get a new address (this increments revealed derivation index) println!("revealed address: {}", wallet.get_address(AddressIndex::New)); println!("staged changes: {:?}", wallet.staged()); // persist changes wallet.commit().expect("must save"); } ``` ## Testing ### Unit testing ```bash cargo test ``` ## License Licensed under either of * Apache License, Version 2.0, ([LICENSE-APACHE](../../LICENSE-APACHE) or ) * MIT license ([LICENSE-MIT](../../LICENSE-MIT) or ) at your option. ### Contribution Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions. [`bdk_chain`]: https://docs.rs/bdk_chain/latest [`bdk_file_store`]: https://docs.rs/bdk_file_store/latest [`bdk_electrum`]: https://docs.rs/bdk_electrum/latest [`bdk_esplora`]: https://docs.rs/bdk_esplora/latest [`KeychainScan`]: https://docs.rs/bdk_chain/latest/bdk_chain/keychain/struct.KeychainScan.html [`rust-miniscript`]: https://docs.rs/miniscript/latest/miniscript/index.html