Rust比特币开发工具包BDK_Electrum的使用,BDK_Electrum实现Electrum协议支持比特币钱包与区块链交互

BDK Electrum

BDK Electrum 扩展了 electrum-client 以从 Electrum 服务器更新 bdk_chain 结构。

最低支持的 Rust 版本 (MSRV)

此 crate 的 MSRV 为 1.75.0。

若要使用 MSRV 构建,您需要按如下方式固定依赖项:

cargo update -p home --precise "0.5.9"

完整示例

以下是一个使用 BDK Electrum 实现 Electrum 协议支持比特币钱包与区块链交互的完整示例:

use bdk::{Wallet, SyncOptions};
use bdk::database::MemoryDatabase;
use bdk::blockchain::ElectrumBlockchain;
use bdk_electrum::electrum_client::Client;
use bdk::bitcoin::Network;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    // 创建 Electrum 客户端
    let electrum_client = Client::new("tcp://electrum.blockstream.info:50001")?;
    
    // 创建 Electrum 区块链
    let blockchain = ElectrumBlockchain::from(electrum_client);
    
    // 创建钱包
    let descriptor = "wpkh(tprv8ZgxMBicQKsPdpkqS7Eair4YxjcuuvDPNYmKX3sCniCf16tHEVrjjiSXEkFRnUH77yXc6ZcwHHcLNfjdi5qUvw3VDfgYiH5mNsj5izuiu2N/1/*)";
    let wallet = Wallet::new(
        descriptor,
        None,
        Network::Testnet,
        MemoryDatabase::default(),
    )?;
    
    // 同步钱包
    wallet.sync(&blockchain, SyncOptions::default())?;
    
    // 获取余额
    let balance = wallet.get_balance()?;
    println!("钱包余额: {}", balance);
    
    Ok(())
}

示例说明:

  1. 首先创建 Electrum 客户端连接到 Electrum 服务器
  2. 使用该客户端创建 ElectrumBlockchain 实例
  3. 创建一个测试网钱包,使用内存数据库
  4. 同步钱包数据
  5. 获取并打印钱包余额

要运行此示例,需要在 Cargo.toml 中添加以下依赖项:

[dependencies]
bdk = { version = "0.23.0", features = ["electrum"] }
bdk_electrum = "0.23.0"
electrum-client = "0.1.0"
bitcoin = "0.29.2"

这个示例展示了如何使用 BDK Electrum 实现基本的钱包功能,包括同步区块链数据和查询余额。您可以根据需要扩展此示例,添加交易创建、签名和广播等功能。


1 回复

Rust比特币开发工具包BDK_Electrum的使用指南

完整示例代码

下面是一个整合了基本功能和高级用法的完整示例,展示了如何使用BDK_Electrum进行比特币开发:

use bdk::{Wallet, SyncOptions};
use bdk::database::MemoryDatabase;
use bdk::wallet::AddressIndex;
use bdk::blockchain::electrum::ElectrumBlockchain;
use bdk::blockchain::ConfigurableBlockchain;
use bitcoin::Network;
use std::str::FromStr;
use bdk::electrum_client::{Client, ElectrumApi};

fn main() -> Result<(), Box<dyn std::error::Error>> {
    // 1. 创建Electrum客户端
    let electrum_url = "ssl://electrum.blockstream.info:60002";
    let config = bdk::electrum_client::Config::builder()
        .retry(3)
        .timeout(Some(30))
        .build();
    
    let blockchain = ElectrumBlockchain::from_config(electrum_url, config)?;
    
    // 2. 获取区块链高度
    let height = blockchain.get_height()?;
    println!("当前区块链高度: {}", height);
    
    // 3. 创建并同步钱包
    let wallet = Wallet::new(
        "wpkh([c258d2e4/84h/1h/0h]tpubDD8itYXaDtaTuuouxqdvxfYthFvs8T8q7ZbAgcgFktwYB8UumKigYw1t2Y3UnqQdb6G9Lvq7QaK2Xa6QH7isBLRrYgoMc1WgYFzGRJ2PqQZ/0/*)", // 测试网描述符
        None,
        Network::Testnet,
        MemoryDatabase::default(),
    )?;
    
    wallet.sync(&blockchain, SyncOptions::default())?;
    
    // 4. 获取新地址
    let new_address = wallet.get_address(AddressIndex::New)?;
    println!("新生成的测试网地址: {}", new_address);
    
    // 5. 监听地址活动
    let client = Client::new(electrum_url)?;
    let script = new_address.script_pubkey();
    
    println!("订阅地址活动: {}", new_address);
    let _ = client.script_subscribe(&script)?;
    
    // 6. 模拟交易广播(实际使用时需要真实签名交易)
    /*
    let tx: Transaction = ...; // 已签名交易
    let txid = blockchain.broadcast(&tx)?;
    println!("交易已广播,txid: {}", txid);
    */
    
    // 7. 监听循环
    println!("开始监听地址活动(每10秒检查一次)...");
    loop {
        if let Ok(Some(update)) = client.script_pop(&script) {
            println!("检测到地址活动: {:?}", update);
            
            // 获取交易详情
            if let Ok(tx) = blockchain.get_tx(&update.txid) {
                println!("交易详情: {:?}", tx);
            }
            break;
        }
        std::thread::sleep(std::time::Duration::from_secs(10));
    }
    
    Ok(())
}

代码说明

  1. 初始化Electrum客户端:配置连接到公共Electrum服务器,设置重试和超时参数
  2. 获取区块链高度:验证与服务器的连接并获取最新区块高度
  3. 钱包创建与同步
    • 使用内存数据库创建测试网钱包
    • 使用描述符派生地址
    • 同步钱包状态
  4. 地址监听
    • 订阅脚本哈希变更通知
    • 定期检查地址活动
    • 检测到活动时获取交易详情

实际应用建议

  1. 替换示例中的描述符为你自己的钱包描述符
  2. 生产环境使用自己的Electrum服务器
  3. 添加适当的错误处理和日志记录
  4. 考虑使用异步IO提高性能

这个完整示例展示了BDK_Electrum的核心功能,包括钱包管理、区块链交互和地址监控,可以作为比特币应用开发的起点。

回到顶部