2 个不稳定版本

0.2.0 2023年5月15日
0.1.0 2023年4月20日

#6 in #walletd


用于 walletd

MIT/Apache

295KB
4.5K SLoC

WalletD Bitcoin

此crate是WalletD项目的一部分。


lib.rs:

WalletD Bitcoin

提供对Bitcoin钱包的实现,包括创建新钱包或导入现有钱包、检查余额和处理交易的功能。它支持分层确定性(HD)钱包结构,并提供搜索与钱包关联的以前使用的地址以及创建新地址的能力。此外,它还便于获取区块链信息。

快速入门指南

[BitcoinWallet] 结构是访问Bitcoin钱包D功能的主要入口点。

从种子导入

以下是您如何根据主[种子]访问比特币钱包的方法。可以使用 Mnemonic::to_seed 方法从[助记词]派生出[种子]。

use walletd_bitcoin::prelude::*;
use walletd_hd_key::prelude::*;
let master_seed = Seed::from_str("a2fd9c0522d84d52ee4c8533dc02d4b69b4df9b6255e1af20c9f1d4d691689f2a38637eb1ec778972bf845c32d5ae83c7536999b5666397ac32021b21e0accee")?;
let network_type = HDNetworkType::TestNet;
let master_hd_key = HDKey::new_master(master_seed, network_type)?;
let mut btc_wallet = BitcoinWallet::builder().master_hd_key(master_hd_key).build()?;

默认派生路径

派生[BitcoinWallet]很简单,并且在内部使用一些默认设置。当使用[BitcoinWalletBuilder]时,默认设置将[地址类型]设置为 'P2wpkh`,并且为派生路径设置相应的默认[HDPurpose]为 HDPurpose::BIP49

 # use walletd_bitcoin::prelude::*;
 # use walletd_hd_key::prelude::*;
 use walletd_bitcoin::bitcoin;
 # fn import_btc_hd_wallet() -> Result<(), walletd_bitcoin::Error> {
 # let master_seed = Seed::from_str("a2fd9c0522d84d52ee4c8533dc02d4b69b4df9b6255e1af20c9f1d4d691689f2a38637eb1ec778972bf845c32d5ae83c7536999b5666397ac32021b21e0accee")?;
 # let network_type = HDNetworkType::TestNet;
 # let master_hd_key = HDKey::new_master(master_seed, network_type)?;
 # let mut btc_wallet = BitcoinWallet::builder().master_hd_key(master_hd_key).build()?;
   assert_eq!(btc_wallet.address_format(), bitcoin::AddressType::P2wpkh);
   assert_eq!(btc_wallet.hd_path_builder()?.purpose, Some(HDPurpose::BIP84.to_shortform_num()));

 # Ok(())
 # }

使用Blockstream作为区块链连接器

可以使用[BitcoinWallet]结构通过[BlockchainConnector]如[Blockstream]访问区块链数据。[Blockstream]实例可以单独使用来访问区块链数据,例如费用估计。它可以与[BitcoinWallet]相关联,以便[BitcoinWallet]能够访问区块链数据并发送交易。

let btc_client = Blockstream::new("https://blockstream.info/testnet/api")?;
let fee_estimates = btc_client.fee_estimates().await?;
println!("fee estimates: {:?}", fee_estimates);
btc_wallet.set_blockchain_client(btc_client);

同步BitcoinWallet,加载BitcoinAddresses

可以使用[BitcoinWallet]结构来同步钱包与区块链并加载相关的[BitcoinAddress]。

let btc_client = Blockstream::new("https://blockstream.info/testnet/api")?;
let fee_estimates = btc_client.fee_estimates().await?;
println!("fee estimates: {:?}", fee_estimates);
btc_wallet.set_blockchain_client(btc_client);
for addr in btc_wallet.associated_info() {
    println!("address: {}, derivation path {}",
    addr.address.public_address(), addr.hd_key().derivation_path().to_string());
}
println!("next receive address: {}", btc_wallet.receive_address()?);
println!("next change address: {}", btc_wallet.next_change_address()?.public_address());



let balance = btc_wallet.balance().await?;
println!(
    "bitcoin wallet balance: {} BTC, ({} satoshi",
    balance.btc(),
    balance.satoshi()
);

依赖项

~16–33MB
~462K SLoC