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.
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
To persist the Wallet
on disk, Wallet
needs to be constructed with a
Persist
implementation.
Implementations
bdk_file_store
: a simple flat-file implementation ofPersist
.
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");
}
cargo test
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.
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.