Skip to content

Commit a7b1754

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

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

@@ -53,12 +56,9 @@ use lightning_transaction_sync::EsploraSyncClient;
5356
use lightning_liquidity::lsps2::client::LSPS2ClientConfig;
5457
use lightning_liquidity::{LiquidityClientConfig, LiquidityManager};
5558

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

6363
use bip39::Mnemonic;
6464

@@ -342,6 +342,8 @@ impl NodeBuilder {
342342
/// previously configured.
343343
#[cfg(any(vss, vss_test))]
344344
pub fn build_with_vss_store(&self, url: String, store_id: String) -> Result<Node, BuildError> {
345+
use bitcoin::key::Secp256k1;
346+
345347
let logger = setup_logger(&self.config)?;
346348

347349
let seed_bytes = seed_bytes_from_config(
@@ -351,14 +353,13 @@ impl NodeBuilder {
351353
)?;
352354
let config = Arc::new(self.config.clone());
353355

354-
let xprv = bitcoin::bip32::ExtendedPrivKey::new_master(config.network.into(), &seed_bytes)
355-
.map_err(|e| {
356-
log_error!(logger, "Failed to derive master secret: {}", e);
357-
BuildError::InvalidSeedBytes
358-
})?;
356+
let xprv = bitcoin::bip32::Xpriv::new_master(config.network, &seed_bytes).map_err(|e| {
357+
log_error!(logger, "Failed to derive master secret: {}", e);
358+
BuildError::InvalidSeedBytes
359+
})?;
359360

360361
let vss_xprv = xprv
361-
.ckd_priv(&Secp256k1::new(), ChildNumber::Hardened { index: 877 })
362+
.derive_priv(&Secp256k1::new(), &[ChildNumber::Hardened { index: 877 }])
362363
.map_err(|e| {
363364
log_error!(logger, "Failed to derive VSS secret: {}", e);
364365
BuildError::KVStoreSetupFailed
@@ -532,36 +533,35 @@ fn build_with_store_internal(
532533
logger: Arc<FilesystemLogger>, kv_store: Arc<DynStore>,
533534
) -> Result<Node, BuildError> {
534535
// Initialize the on-chain wallet and chain access
535-
let xprv = bitcoin::bip32::ExtendedPrivKey::new_master(config.network.into(), &seed_bytes)
536-
.map_err(|e| {
537-
log_error!(logger, "Failed to derive master secret: {}", e);
538-
BuildError::InvalidSeedBytes
539-
})?;
540-
541-
let wallet_name = bdk::wallet::wallet_name_from_descriptor(
542-
Bip84(xprv, bdk::KeychainKind::External),
543-
Some(Bip84(xprv, bdk::KeychainKind::Internal)),
544-
config.network.into(),
545-
&Secp256k1::new(),
546-
)
547-
.map_err(|e| {
548-
log_error!(logger, "Failed to derive wallet name: {}", e);
549-
BuildError::WalletSetupFailed
536+
let xprv = bitcoin::bip32::Xpriv::new_master(config.network, &seed_bytes).map_err(|e| {
537+
log_error!(logger, "Failed to derive master secret: {}", e);
538+
BuildError::InvalidSeedBytes
550539
})?;
551540

552-
let database_path = format!("{}/bdk_wallet_{}.sqlite", config.storage_dir_path, wallet_name);
553-
let database = SqliteDatabase::new(database_path);
554-
555-
let bdk_wallet = bdk::Wallet::new(
556-
Bip84(xprv, bdk::KeychainKind::External),
557-
Some(Bip84(xprv, bdk::KeychainKind::Internal)),
558-
config.network.into(),
559-
database,
560-
)
561-
.map_err(|e| {
562-
log_error!(logger, "Failed to set up wallet: {}", e);
563-
BuildError::WalletSetupFailed
564-
})?;
541+
let descriptor = Bip84(xprv, KeychainKind::External);
542+
let change_descriptor = Bip84(xprv, KeychainKind::Internal);
543+
let mut wallet_persister =
544+
KVStoreWalletPersister::new(Arc::clone(&kv_store), Arc::clone(&logger));
545+
let wallet_opt = BdkWallet::load()
546+
.descriptor(KeychainKind::External, Some(descriptor.clone()))
547+
.descriptor(KeychainKind::Internal, Some(change_descriptor.clone()))
548+
.extract_keys()
549+
.check_network(config.network)
550+
.load_wallet(&mut wallet_persister)
551+
.map_err(|e| {
552+
log_error!(logger, "Failed to set up wallet: {}", e);
553+
BuildError::WalletSetupFailed
554+
})?;
555+
let bdk_wallet = match wallet_opt {
556+
Some(wallet) => wallet,
557+
None => BdkWallet::create(descriptor, change_descriptor)
558+
.network(config.network)
559+
.create_wallet(&mut wallet_persister)
560+
.map_err(|e| {
561+
log_error!(logger, "Failed to set up wallet: {}", e);
562+
BuildError::WalletSetupFailed
563+
})?,
564+
};
565565

566566
let (blockchain, tx_sync, tx_broadcaster, fee_estimator) = match chain_data_source_config {
567567
Some(ChainDataSourceConfig::Esplora(server_url)) => {
@@ -741,7 +741,7 @@ fn build_with_store_internal(
741741
} else {
742742
// We're starting a fresh node.
743743
let genesis_block_hash =
744-
bitcoin::blockdata::constants::genesis_block(config.network.into()).block_hash();
744+
bitcoin::blockdata::constants::genesis_block(config.network).block_hash();
745745

746746
let chain_params = ChainParameters {
747747
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)