Crate bdk

source ·
Expand description

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 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 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.

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

Persistence

To persist the Wallet on disk, Wallet needs to be constructed with a Persist implementation.

Implementations

Example

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

cargo test

License

Licensed under either of

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.

Re-exports

pub extern crate bitcoin;
pub extern crate miniscript;
pub use descriptor::template;
pub use descriptor::HdKeyPaths;
pub use wallet::signer;
pub use wallet::signer::SignOptions;
pub use wallet::tx_builder::TxBuilder;
pub use wallet::Wallet;
pub use bdk_chain as chain;

Modules

Descriptors
Key formats
Additional functions on the rust-bitcoin PartiallySignedTransaction structure.
Wallet

Macros

Macro to write full descriptors with code
Macro to write descriptor fragments with code

Structs

Fee rate
An unspent output owned by a Wallet.
A Utxo with its satisfaction_weight.

Enums

Types of keychains
An unspent transaction output (UTXO).

Traits

Trait implemented by types that can be used to measure weight units.

Functions

Get the version of BDK at runtime