|
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