#钱包 #比特币钱包 #描述符 #psbt

no-std bdk_wallet

现代、轻量级、基于描述符的钱包库

6 个版本

1.0.0-beta.2 2024年8月25日
1.0.0-beta.12024年7月22日
1.0.0-alpha.132024年6月15日
1.0.0-alpha.122024年5月23日
1.0.0-alpha.52024年2月6日

#3 in #psbt

Download history 144/week @ 2024-05-12 188/week @ 2024-05-19 98/week @ 2024-05-26 696/week @ 2024-06-02 1362/week @ 2024-06-09 1017/week @ 2024-06-16 912/week @ 2024-06-23 545/week @ 2024-06-30 653/week @ 2024-07-07 820/week @ 2024-07-14 862/week @ 2024-07-21 517/week @ 2024-07-28 430/week @ 2024-08-04 291/week @ 2024-08-11 443/week @ 2024-08-18

1,690 个月下载量
用于bdk_hwi

MIT/Apache

800KB
14K SLoC

BDK

用Rust编写的现代、轻量级、基于描述符的钱包库!

Crate Info MIT or Apache-2.0 Licensed CI Status API Docs Rustc Version 1.63.0+ Chat on Discord

项目主页 | 文档

BDK 钱包

bdk_wallet 包提供 Wallet 类型,这是一个由 bdk_chain 的底层组件构建的简单、高级接口。 Wallet 是许多简单应用的起点,也是如何使用其他机制构建钱包的绝佳示例。它有两个密钥库(外部和内部),由 miniscript 描述符 定义,并使用它们生成地址。当你给它链数据时,它也使用描述符来找到它们拥有的交易输出。从这里,你可以创建和签名交易。

有关 Wallet 的API详细信息,请参阅 模块级文档

区块链数据

为了获取用于消费的区块链数据 Wallet,您应该配置一个从可用的链源客户端。通常,您向链源发送请求并获取一个响应,Wallet 可以使用该响应来更新其对链的观点。

区块链数据源

  • bdk_esplora:从 Esplora 获取区块链数据以更新 BDK 结构。
  • bdk_electrum:从 Electrum 获取区块链数据以更新 BDK 结构。
  • bdk_bitcoind_rpc:从 Bitcoin Core 获取区块链数据以更新 BDK 结构。

示例

持久化

要持久化 Wallet 状态数据,请使用读取和写入 ChangeSet 的数据存储 crate。

实现

  • bdk_file_store:将钱包更改存储在简单的平面文件中。

示例

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);

测试

单元测试

cargo test

许可

根据您的选择,许可协议为以下之一:

任选其一。

贡献

除非您明确声明,否则您有意提交的任何贡献,根据 Apache-2.0 许可证定义,应按照上述方式双重许可,不附加任何额外条款或条件。

依赖项

~13–18MB
~255K SLoC