Crate bdk_wallet
source ·Expand description
BDK
A modern, lightweight, descriptor-based wallet library written in Rust!
Project Homepage | Documentation
§BDK Wallet
The bdk_wallet
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 details about the API of Wallet
see the module-level documentation.
§Blockchain data
In order to get blockchain data for Wallet
to consume, you should configure a client from
an available chain source. Typically you make a request to the chain source and get a response
that the Wallet
can use to update its view of the chain.
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.bdk_bitcoind_rpc
: Grabs blockchain data from Bitcoin Core for updating BDK structures.
Examples
example-crates/example_wallet_esplora_async
example-crates/example_wallet_esplora_blocking
example-crates/example_wallet_electrum
example-crates/example_wallet_rpc
§Persistence
To persist Wallet
state data use a data store crate that reads and writes ChangeSet
.
Implementations
bdk_file_store
: Stores wallet changes in a simple flat file.
Example
use bdk_wallet::{bitcoin::Network, KeychainKind, ChangeSet, Wallet};
// Open or create a new file store for wallet data.
let mut db =
bdk_file_store::Store::<ChangeSet>::open_or_create_new(b"magic_bytes", "/tmp/my_wallet.db")
.expect("create store");
// Create a wallet with initial wallet data read from the file store.
let network = Network::Testnet;
let descriptor = "wpkh(tprv8ZgxMBicQKsPdcAqYBpzAFwU5yxBUo88ggoBqu1qPcHUfSbKK1sKMLmC7EAk438btHQrSdu3jGGQa6PA71nvH5nkDexhLteJqkM4dQmWF9g/84'/1'/0'/0/*)";
let change_descriptor = "wpkh(tprv8ZgxMBicQKsPdcAqYBpzAFwU5yxBUo88ggoBqu1qPcHUfSbKK1sKMLmC7EAk438btHQrSdu3jGGQa6PA71nvH5nkDexhLteJqkM4dQmWF9g/84'/1'/0'/1/*)";
let wallet_opt = Wallet::load()
.descriptor(KeychainKind::External, Some(descriptor))
.descriptor(KeychainKind::Internal, Some(change_descriptor))
.extract_keys()
.check_network(network)
.load_wallet(&mut db)
.expect("wallet");
let mut wallet = match wallet_opt {
Some(wallet) => wallet,
None => Wallet::create(descriptor, change_descriptor)
.network(network)
.create_wallet(&mut db)
.expect("wallet"),
};
// Get a new address to receive bitcoin.
let receive_address = wallet.reveal_next_address(KeychainKind::External);
// Persist staged wallet data changes to the file store.
wallet.persist(&mut db).expect("persist");
println!("Your new receive address is: {}", receive_address.address);
§Testing
§Unit testing
cargo test
§License
Licensed under either of
- Apache License, Version 2.0, (LICENSE-APACHE or https://www.apache.org/licenses/LICENSE-2.0)
- MIT license (LICENSE-MIT or https://opensource.org/licenses/MIT)
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 bdk_chain as chain;
pub extern crate bdk_file_store as file_store;
pub extern crate miniscript;
pub extern crate serde;
pub extern crate serde_json;
pub use descriptor::template;
pub use descriptor::HdKeyPaths;
pub use signer;
pub use bdk_chain::rusqlite;
Modules§
- Coin selection
- Descriptors
- Errors that can be thrown by the
Wallet
- Wallet export
- Key formats
- Additional functions on the
rust-bitcoin
Psbt
structure. - Support for persisting
bdk_chain
structures to SQLite using [rusqlite
]. - Generalized signers
- Transaction builder
Macros§
- Macro to write full descriptors with code
- Macro to write descriptor fragments with code
Structs§
- A derived address and the index it was found at. For convenience this automatically derefs to
Address
- Balance, differentiated into various categories.
- A changeset for
Wallet
. - Parameters for
Wallet::create
orPersistedWallet::create
. - Parameters for
Wallet::load
orPersistedWallet::load
. - An unspent output owned by a
Wallet
. - Represents a persisted wallet which persists into type
P
. - Options for a software signer
- A transaction builder
- An update to
Wallet
. - A Bitcoin wallet
- A
Utxo
with itssatisfaction_weight
.
Enums§
- Error returned from
TxBuilder::add_foreign_utxo
. - Error returned from
TxBuilder::add_utxo
andTxBuilder::add_utxos
- An error that may occur when applying a block to
Wallet
. - Policy regarding the use of change outputs when creating a transaction
- Error type for
PersistedWallet::create
. - Error for [
bdk_file_store
]’s implementation ofWalletPersister
. - Types of keychains
- Represents a mismatch with what is loaded and what is expected from
LoadParams
. - Error type for
PersistedWallet::load
. - Ordering of the transaction’s inputs and outputs
- An unspent transaction output (UTXO).
Traits§
- Async trait that persists
PersistedWallet
. - Trait to check if a value is below the dust limit. We are performing dust value calculation for a given script public key using rust-bitcoin to keep it compatible with network dust rate
- Trait that persists
PersistedWallet
.
Functions§
- Get the version of
bdk_wallet
at runtime. - Deterministically generate a unique name given the descriptors defining the wallet
Type Aliases§
- A
CanonicalTx
managed by aWallet
.