Skip to content

Commit dcac201

Browse files
committed
f BDK: Account for persistence changes 3: switch to new Wallet API
1 parent efbcfd5 commit dcac201

File tree

2 files changed

+47
-46
lines changed

2 files changed

+47
-46
lines changed

src/builder.rs

Lines changed: 41 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ use crate::fee_estimator::OnchainFeeEstimator;
1515
use crate::gossip::GossipSource;
1616
use crate::io;
1717
use crate::io::sqlite_store::SqliteStore;
18+
#[cfg(any(vss, vss_test))]
19+
use crate::io::vss_store::VssStore;
1820
use crate::liquidity::LiquiditySource;
1921
use crate::logger::{log_error, log_info, FilesystemLogger, Logger};
2022
use crate::message_handler::NodeCustomMessageHandler;
@@ -25,6 +27,7 @@ use crate::types::{
2527
ChainMonitor, ChannelManager, DynStore, GossipSync, Graph, KeysManager, MessageRouter,
2628
OnionMessenger, PeerManager,
2729
};
30+
use crate::wallet::persist::KVStoreWalletPersister;
2831
use crate::wallet::Wallet;
2932
use crate::{LogLevel, Node};
3033

@@ -54,12 +57,9 @@ use lightning_transaction_sync::EsploraSyncClient;
5457
use lightning_liquidity::lsps2::client::LSPS2ClientConfig;
5558
use lightning_liquidity::{LiquidityClientConfig, LiquidityManager};
5659

57-
#[cfg(any(vss, vss_test))]
58-
use crate::io::vss_store::VssStore;
59-
use bdk::bitcoin::secp256k1::Secp256k1;
60-
use bdk::blockchain::esplora::EsploraBlockchain;
61-
use bdk::database::SqliteDatabase;
62-
use bdk::template::Bip84;
60+
use bdk_wallet::template::Bip84;
61+
use bdk_wallet::KeychainKind;
62+
use bdk_wallet::Wallet as BdkWallet;
6363

6464
use bip39::Mnemonic;
6565

@@ -357,6 +357,8 @@ impl NodeBuilder {
357357
/// previously configured.
358358
#[cfg(any(vss, vss_test))]
359359
pub fn build_with_vss_store(&self, url: String, store_id: String) -> Result<Node, BuildError> {
360+
use bitcoin::key::Secp256k1;
361+
360362
let logger = setup_logger(&self.config)?;
361363

362364
let seed_bytes = seed_bytes_from_config(
@@ -366,14 +368,13 @@ impl NodeBuilder {
366368
)?;
367369
let config = Arc::new(self.config.clone());
368370

369-
let xprv = bitcoin::bip32::ExtendedPrivKey::new_master(config.network.into(), &seed_bytes)
370-
.map_err(|e| {
371-
log_error!(logger, "Failed to derive master secret: {}", e);
372-
BuildError::InvalidSeedBytes
373-
})?;
371+
let xprv = bitcoin::bip32::Xpriv::new_master(config.network, &seed_bytes).map_err(|e| {
372+
log_error!(logger, "Failed to derive master secret: {}", e);
373+
BuildError::InvalidSeedBytes
374+
})?;
374375

375376
let vss_xprv = xprv
376-
.ckd_priv(&Secp256k1::new(), ChildNumber::Hardened { index: 877 })
377+
.derive_priv(&Secp256k1::new(), &[ChildNumber::Hardened { index: 877 }])
377378
.map_err(|e| {
378379
log_error!(logger, "Failed to derive VSS secret: {}", e);
379380
BuildError::KVStoreSetupFailed
@@ -555,36 +556,35 @@ fn build_with_store_internal(
555556
logger: Arc<FilesystemLogger>, kv_store: Arc<DynStore>,
556557
) -> Result<Node, BuildError> {
557558
// Initialize the on-chain wallet and chain access
558-
let xprv = bitcoin::bip32::ExtendedPrivKey::new_master(config.network.into(), &seed_bytes)
559-
.map_err(|e| {
560-
log_error!(logger, "Failed to derive master secret: {}", e);
561-
BuildError::InvalidSeedBytes
562-
})?;
563-
564-
let wallet_name = bdk::wallet::wallet_name_from_descriptor(
565-
Bip84(xprv, bdk::KeychainKind::External),
566-
Some(Bip84(xprv, bdk::KeychainKind::Internal)),
567-
config.network.into(),
568-
&Secp256k1::new(),
569-
)
570-
.map_err(|e| {
571-
log_error!(logger, "Failed to derive wallet name: {}", e);
572-
BuildError::WalletSetupFailed
559+
let xprv = bitcoin::bip32::Xpriv::new_master(config.network, &seed_bytes).map_err(|e| {
560+
log_error!(logger, "Failed to derive master secret: {}", e);
561+
BuildError::InvalidSeedBytes
573562
})?;
574563

575-
let database_path = format!("{}/bdk_wallet_{}.sqlite", config.storage_dir_path, wallet_name);
576-
let database = SqliteDatabase::new(database_path);
577-
578-
let bdk_wallet = bdk::Wallet::new(
579-
Bip84(xprv, bdk::KeychainKind::External),
580-
Some(Bip84(xprv, bdk::KeychainKind::Internal)),
581-
config.network.into(),
582-
database,
583-
)
584-
.map_err(|e| {
585-
log_error!(logger, "Failed to set up wallet: {}", e);
586-
BuildError::WalletSetupFailed
587-
})?;
564+
let descriptor = Bip84(xprv, KeychainKind::External);
565+
let change_descriptor = Bip84(xprv, KeychainKind::Internal);
566+
let mut wallet_persister =
567+
KVStoreWalletPersister::new(Arc::clone(&kv_store), Arc::clone(&logger));
568+
let wallet_opt = BdkWallet::load()
569+
.descriptor(KeychainKind::External, Some(descriptor.clone()))
570+
.descriptor(KeychainKind::Internal, Some(change_descriptor.clone()))
571+
.extract_keys()
572+
.check_network(config.network)
573+
.load_wallet(&mut wallet_persister)
574+
.map_err(|e| {
575+
log_error!(logger, "Failed to set up wallet: {}", e);
576+
BuildError::WalletSetupFailed
577+
})?;
578+
let bdk_wallet = match wallet_opt {
579+
Some(wallet) => wallet,
580+
None => BdkWallet::create(descriptor, change_descriptor)
581+
.network(config.network)
582+
.create_wallet(&mut wallet_persister)
583+
.map_err(|e| {
584+
log_error!(logger, "Failed to set up wallet: {}", e);
585+
BuildError::WalletSetupFailed
586+
})?,
587+
};
588588

589589
let (blockchain, tx_sync, tx_broadcaster, fee_estimator) = match chain_data_source_config {
590590
Some(ChainDataSourceConfig::Esplora(server_url)) => {
@@ -764,7 +764,7 @@ fn build_with_store_internal(
764764
} else {
765765
// We're starting a fresh node.
766766
let genesis_block_hash =
767-
bitcoin::blockdata::constants::genesis_block(config.network.into()).block_hash();
767+
bitcoin::blockdata::constants::genesis_block(config.network).block_hash();
768768

769769
let chain_params = ChainParameters {
770770
network: config.network.into(),

src/wallet/mod.rs

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
// http://opensource.org/licenses/MIT>, at your option. You may not use this file except in
66
// accordance with one or both of these licenses.
77

8+
use persist::KVStoreWalletPersister;
9+
810
use crate::logger::{log_error, log_info, log_trace, Logger};
911

1012
use crate::config::BDK_WALLET_SYNC_TIMEOUT_SECS;
@@ -26,8 +28,7 @@ use lightning_invoice::RawBolt11Invoice;
2628

2729
use bdk::blockchain::EsploraBlockchain;
2830
use bdk_chain::ChainPosition;
29-
use bdk_wallet::{KeychainKind, SignOptions};
30-
use bdk_wallet::Wallet as BdkWallet;
31+
use bdk_wallet::{KeychainKind, PersistedWallet, SignOptions};
3132

3233
use bitcoin::blockdata::constants::WITNESS_SCALE_FACTOR;
3334
use bitcoin::blockdata::locktime::absolute::LockTime;
@@ -62,7 +63,7 @@ where
6263
// A BDK blockchain used for wallet sync.
6364
blockchain: EsploraBlockchain,
6465
// A BDK on-chain wallet.
65-
inner: Mutex<BdkWallet>,
66+
inner: Mutex<PersistedWallet<KVStoreWalletPersister>>,
6667
// A cache storing the most recently retrieved fee rate estimations.
6768
broadcaster: B,
6869
fee_estimator: E,
@@ -78,8 +79,8 @@ where
7879
L::Target: Logger,
7980
{
8081
pub(crate) fn new(
81-
blockchain: EsploraBlockchain, wallet: BdkWallet, broadcaster: B, fee_estimator: E,
82-
logger: L,
82+
blockchain: EsploraBlockchain, wallet: bdk_wallet::PersistedWallet<KVStoreWalletPersister>,
83+
broadcaster: B, fee_estimator: E, logger: L,
8384
) -> Self {
8485
let inner = Mutex::new(wallet);
8586
let sync_status = Mutex::new(WalletSyncStatus::Completed);

0 commit comments

Comments
 (0)