|
26 | 26 |
|
27 | 27 | ## `bdk` |
28 | 28 |
|
29 | | -The `bdk` crate provides the [`Wallet`](`crate::Wallet`) type which is a simple, high-level |
| 29 | +The `bdk` crate provides the [`Wallet`] type which is a simple, high-level |
30 | 30 | interface built from the low-level components of [`bdk_chain`]. `Wallet` is a good starting point |
31 | 31 | for many simple applications as well as a good demonstration of how to use the other mechanisms to |
32 | 32 | construct a wallet. It has two keychains (external and internal) which are defined by |
33 | 33 | [miniscript descriptors][`rust-miniscript`] and uses them to generate addresses. When you give it |
34 | 34 | chain data it also uses the descriptors to find transaction outputs owned by them. From there, you |
35 | 35 | can create and sign transactions. |
36 | 36 |
|
37 | | -For more information, see the [`Wallet`'s documentation](https://docs.rs/bdk/latest/bdk/wallet/struct.Wallet.html). |
| 37 | +For details about the API of `Wallet` see the [module-level documentation][`Wallet`]. |
38 | 38 |
|
39 | 39 | ### Blockchain data |
40 | 40 |
|
41 | | -In order to get blockchain data for `Wallet` to consume, you have to put it into particular form. |
42 | | -Right now this is [`KeychainScan`] which is defined in [`bdk_chain`]. |
43 | | - |
44 | | -This can be created manually or from blockchain-scanning crates. |
| 41 | +In order to get blockchain data for `Wallet` to consume, you should configure a client from |
| 42 | +an available chain source. Typically you make a request to the chain source and get a response |
| 43 | +that the `Wallet` can use to update its view of the chain. |
45 | 44 |
|
46 | 45 | **Blockchain Data Sources** |
47 | 46 |
|
48 | 47 | * [`bdk_esplora`]: Grabs blockchain data from Esplora for updating BDK structures. |
49 | 48 | * [`bdk_electrum`]: Grabs blockchain data from Electrum for updating BDK structures. |
| 49 | +* [`bdk_bitcoind_rpc`]: Grabs blockchain data from Bitcoin Core for updating BDK structures. |
50 | 50 |
|
51 | 51 | **Examples** |
52 | 52 |
|
53 | | -* [`example-crates/wallet_esplora`](https://github.com/bitcoindevkit/bdk/tree/master/example-crates/wallet_esplora) |
| 53 | +* [`example-crates/wallet_esplora_async`](https://github.com/bitcoindevkit/bdk/tree/master/example-crates/wallet_esplora_async) |
| 54 | +* [`example-crates/wallet_esplora_blocking`](https://github.com/bitcoindevkit/bdk/tree/master/example-crates/wallet_esplora_blocking) |
54 | 55 | * [`example-crates/wallet_electrum`](https://github.com/bitcoindevkit/bdk/tree/master/example-crates/wallet_electrum) |
| 56 | +* [`example-crates/wallet_rpc`](https://github.com/bitcoindevkit/bdk/tree/master/example-crates/wallet_rpc) |
55 | 57 |
|
56 | 58 | ### Persistence |
57 | 59 |
|
58 | | -To persist the `Wallet` on disk, `Wallet` needs to be constructed with a |
59 | | -[`Persist`](https://docs.rs/bdk_chain/latest/bdk_chain/keychain/struct.KeychainPersist.html) implementation. |
| 60 | +To persist the `Wallet` on disk, it must be constructed with a [`PersistBackend`] implementation. |
60 | 61 |
|
61 | 62 | **Implementations** |
62 | 63 |
|
63 | | -* [`bdk_file_store`]: a simple flat-file implementation of `Persist`. |
| 64 | +* [`bdk_file_store`]: A simple flat-file implementation of [`PersistBackend`]. |
64 | 65 |
|
65 | 66 | **Example** |
66 | 67 |
|
67 | | -```rust |
68 | | -use bdk::{bitcoin::Network, wallet::{AddressIndex, Wallet}}; |
| 68 | +<!-- compile_fail because outpoint and txout are fake variables --> |
| 69 | +```rust,compile_fail |
| 70 | +use bdk::{bitcoin::Network, wallet::{ChangeSet, Wallet}}; |
69 | 71 |
|
70 | 72 | fn main() { |
71 | | - // a type that implements `Persist` |
72 | | - let db = (); |
| 73 | + // Create a new file `Store`. |
| 74 | + let db = bdk_file_store::Store::<ChangeSet>::open_or_create_new(b"magic_bytes", "path/to/my_wallet.db").expect("create store"); |
73 | 75 |
|
74 | | - let descriptor = "wpkh(tprv8ZgxMBicQKsPdy6LMhUtFHAgpocR8GC6QmwMSFpZs7h6Eziw3SpThFfczTDh5rW2krkqffa11UpX3XkeTTB2FvzZKWXqPY54Y6Rq4AQ5R8L/84'/0'/0'/0/*)"; |
75 | | - let mut wallet = Wallet::new(descriptor, None, db, Network::Testnet).expect("should create"); |
| 76 | + let descriptor = "wpkh(tprv8ZgxMBicQKsPdcAqYBpzAFwU5yxBUo88ggoBqu1qPcHUfSbKK1sKMLmC7EAk438btHQrSdu3jGGQa6PA71nvH5nkDexhLteJqkM4dQmWF9g/84'/1'/0'/0/*)"; |
| 77 | + let mut wallet = Wallet::new_or_load(descriptor, None, db, Network::Testnet).expect("create or load wallet"); |
76 | 78 |
|
77 | | - // get a new address (this increments revealed derivation index) |
78 | | - println!("revealed address: {}", wallet.get_address(AddressIndex::New)); |
79 | | - println!("staged changes: {:?}", wallet.staged()); |
80 | | - // persist changes |
81 | | - wallet.commit().expect("must save"); |
| 79 | + // Insert a single `TxOut` at `OutPoint` into the wallet. |
| 80 | + let _ = wallet.insert_txout(outpoint, txout); |
| 81 | + wallet.commit().expect("must write to database"); |
82 | 82 | } |
83 | 83 | ``` |
84 | 84 |
|
@@ -218,9 +218,11 @@ submitted for inclusion in the work by you, as defined in the Apache-2.0 |
218 | 218 | license, shall be dual licensed as above, without any additional terms or |
219 | 219 | conditions. |
220 | 220 |
|
| 221 | +[`Wallet`]: https://docs.rs/bdk/1.0.0-alpha.7/bdk/wallet/struct.Wallet.html |
| 222 | +[`PersistBackend`]: https://docs.rs/bdk_chain/latest/bdk_chain/trait.PersistBackend.html |
221 | 223 | [`bdk_chain`]: https://docs.rs/bdk_chain/latest |
222 | 224 | [`bdk_file_store`]: https://docs.rs/bdk_file_store/latest |
223 | 225 | [`bdk_electrum`]: https://docs.rs/bdk_electrum/latest |
224 | 226 | [`bdk_esplora`]: https://docs.rs/bdk_esplora/latest |
225 | | -[`KeychainScan`]: https://docs.rs/bdk_chain/latest/bdk_chain/keychain/struct.KeychainScan.html |
| 227 | +[`bdk_bitcoind_rpc`]: https://docs.rs/bdk_bitcoind_rpc/latest |
226 | 228 | [`rust-miniscript`]: https://docs.rs/miniscript/latest/miniscript/index.html |
0 commit comments