Skip to content

Commit 35f8236

Browse files
committed
f BDK: Account for new syncing interface
1 parent a7b1754 commit 35f8236

File tree

5 files changed

+89
-78
lines changed

5 files changed

+89
-78
lines changed

src/builder.rs

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@
66
// accordance with one or both of these licenses.
77

88
use crate::config::{
9-
default_user_config, Config, BDK_CLIENT_CONCURRENCY, BDK_CLIENT_STOP_GAP,
10-
DEFAULT_ESPLORA_CLIENT_TIMEOUT_SECS, DEFAULT_ESPLORA_SERVER_URL, WALLET_KEYS_SEED_LEN,
9+
default_user_config, Config, DEFAULT_ESPLORA_CLIENT_TIMEOUT_SECS, DEFAULT_ESPLORA_SERVER_URL,
10+
WALLET_KEYS_SEED_LEN,
1111
};
1212
use crate::connection::ConnectionManager;
1313
use crate::event::EventQueue;
@@ -563,7 +563,7 @@ fn build_with_store_internal(
563563
})?,
564564
};
565565

566-
let (blockchain, tx_sync, tx_broadcaster, fee_estimator) = match chain_data_source_config {
566+
let (esplora_client, tx_sync, tx_broadcaster, fee_estimator) = match chain_data_source_config {
567567
Some(ChainDataSourceConfig::Esplora(server_url)) => {
568568
let mut client_builder = esplora_client::Builder::new(&server_url.clone());
569569
client_builder = client_builder.timeout(DEFAULT_ESPLORA_CLIENT_TIMEOUT_SECS);
@@ -572,8 +572,6 @@ fn build_with_store_internal(
572572
esplora_client.clone(),
573573
Arc::clone(&logger),
574574
));
575-
let blockchain = EsploraBlockchain::from_client(esplora_client, BDK_CLIENT_STOP_GAP)
576-
.with_concurrency(BDK_CLIENT_CONCURRENCY);
577575
let tx_broadcaster = Arc::new(TransactionBroadcaster::new(
578576
tx_sync.client().clone(),
579577
Arc::clone(&logger),
@@ -583,15 +581,18 @@ fn build_with_store_internal(
583581
Arc::clone(&config),
584582
Arc::clone(&logger),
585583
));
586-
(blockchain, tx_sync, tx_broadcaster, fee_estimator)
584+
(esplora_client, tx_sync, tx_broadcaster, fee_estimator)
587585
},
588586
None => {
589587
// Default to Esplora client.
590588
let server_url = DEFAULT_ESPLORA_SERVER_URL.to_string();
591-
let tx_sync = Arc::new(EsploraSyncClient::new(server_url, Arc::clone(&logger)));
592-
let blockchain =
593-
EsploraBlockchain::from_client(tx_sync.client().clone(), BDK_CLIENT_STOP_GAP)
594-
.with_concurrency(BDK_CLIENT_CONCURRENCY);
589+
let mut client_builder = esplora_client::Builder::new(&server_url.clone());
590+
client_builder = client_builder.timeout(DEFAULT_ESPLORA_CLIENT_TIMEOUT_SECS);
591+
let esplora_client = client_builder.build_async().unwrap();
592+
let tx_sync = Arc::new(EsploraSyncClient::from_client(
593+
esplora_client.clone(),
594+
Arc::clone(&logger),
595+
));
595596
let tx_broadcaster = Arc::new(TransactionBroadcaster::new(
596597
tx_sync.client().clone(),
597598
Arc::clone(&logger),
@@ -601,14 +602,14 @@ fn build_with_store_internal(
601602
Arc::clone(&config),
602603
Arc::clone(&logger),
603604
));
604-
(blockchain, tx_sync, tx_broadcaster, fee_estimator)
605+
(esplora_client, tx_sync, tx_broadcaster, fee_estimator)
605606
},
606607
};
607608

608609
let runtime = Arc::new(RwLock::new(None));
609610
let wallet = Arc::new(Wallet::new(
610-
blockchain,
611611
bdk_wallet,
612+
esplora_client,
612613
Arc::clone(&tx_broadcaster),
613614
Arc::clone(&fee_estimator),
614615
Arc::clone(&logger),

src/config.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ const DEFAULT_ANCHOR_PER_CHANNEL_RESERVE_SATS: u64 = 25_000;
3131
pub(crate) const BDK_CLIENT_STOP_GAP: usize = 20;
3232

3333
// The number of concurrent requests made against the API provider.
34-
pub(crate) const BDK_CLIENT_CONCURRENCY: u8 = 4;
34+
pub(crate) const BDK_CLIENT_CONCURRENCY: usize = 4;
3535

3636
// The default Esplora server we're using.
3737
pub(crate) const DEFAULT_ESPLORA_SERVER_URL: &str = "https://blockstream.info/api";

src/error.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
// accordance with one or both of these licenses.
77

88
use bdk_chain::bitcoin::psbt::ExtractTxError as BdkExtractTxError;
9+
use bdk_chain::local_chain::CannotConnectError as BdkChainConnectionError;
910
use bdk_wallet::error::CreateTxError as BdkCreateTxError;
1011
use bdk_wallet::signer::SignerError as BdkSignerError;
1112

@@ -203,6 +204,12 @@ impl From<BdkExtractTxError> for Error {
203204
}
204205
}
205206

207+
impl From<BdkChainConnectionError> for Error {
208+
fn from(_: BdkChainConnectionError) -> Self {
209+
Self::WalletOperationFailed
210+
}
211+
}
212+
206213
impl From<lightning_transaction_sync::TxSyncError> for Error {
207214
fn from(_e: lightning_transaction_sync::TxSyncError) -> Self {
208215
Self::TxSyncFailed

src/lib.rs

Lines changed: 33 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -280,49 +280,44 @@ impl Node {
280280
.config
281281
.onchain_wallet_sync_interval_secs
282282
.max(config::WALLET_SYNC_INTERVAL_MINIMUM_SECS);
283-
std::thread::spawn(move || {
284-
tokio::runtime::Builder::new_current_thread().enable_all().build().unwrap().block_on(
285-
async move {
286-
let mut onchain_wallet_sync_interval = tokio::time::interval(
287-
Duration::from_secs(onchain_wallet_sync_interval_secs),
288-
);
289-
onchain_wallet_sync_interval
290-
.set_missed_tick_behavior(tokio::time::MissedTickBehavior::Skip);
291-
loop {
292-
tokio::select! {
293-
_ = stop_sync.changed() => {
283+
runtime.spawn(async move {
284+
let mut onchain_wallet_sync_interval =
285+
tokio::time::interval(Duration::from_secs(onchain_wallet_sync_interval_secs));
286+
onchain_wallet_sync_interval
287+
.set_missed_tick_behavior(tokio::time::MissedTickBehavior::Skip);
288+
loop {
289+
tokio::select! {
290+
_ = stop_sync.changed() => {
291+
log_trace!(
292+
sync_logger,
293+
"Stopping background syncing on-chain wallet.",
294+
);
295+
return;
296+
}
297+
_ = onchain_wallet_sync_interval.tick() => {
298+
let now = Instant::now();
299+
match wallet.sync().await {
300+
Ok(()) => {
294301
log_trace!(
295-
sync_logger,
296-
"Stopping background syncing on-chain wallet.",
297-
);
298-
return;
302+
sync_logger,
303+
"Background sync of on-chain wallet finished in {}ms.",
304+
now.elapsed().as_millis()
305+
);
306+
let unix_time_secs_opt =
307+
SystemTime::now().duration_since(UNIX_EPOCH).ok().map(|d| d.as_secs());
308+
*sync_onchain_wallet_timestamp.write().unwrap() = unix_time_secs_opt;
299309
}
300-
_ = onchain_wallet_sync_interval.tick() => {
301-
let now = Instant::now();
302-
match wallet.sync().await {
303-
Ok(()) => {
304-
log_trace!(
305-
sync_logger,
306-
"Background sync of on-chain wallet finished in {}ms.",
307-
now.elapsed().as_millis()
308-
);
309-
let unix_time_secs_opt =
310-
SystemTime::now().duration_since(UNIX_EPOCH).ok().map(|d| d.as_secs());
311-
*sync_onchain_wallet_timestamp.write().unwrap() = unix_time_secs_opt;
312-
}
313-
Err(err) => {
314-
log_error!(
315-
sync_logger,
316-
"Background sync of on-chain wallet failed: {}",
317-
err
318-
)
319-
}
320-
}
310+
Err(err) => {
311+
log_error!(
312+
sync_logger,
313+
"Background sync of on-chain wallet failed: {}",
314+
err
315+
)
321316
}
322317
}
323318
}
324-
},
325-
);
319+
}
320+
}
326321
});
327322

328323
let mut stop_fee_updates = self.stop_sender.subscribe();

src/wallet/mod.rs

Lines changed: 35 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ use persist::KVStoreWalletPersister;
99

1010
use crate::logger::{log_error, log_info, log_trace, Logger};
1111

12-
use crate::config::BDK_WALLET_SYNC_TIMEOUT_SECS;
12+
use crate::config::{BDK_CLIENT_CONCURRENCY, BDK_CLIENT_STOP_GAP, BDK_WALLET_SYNC_TIMEOUT_SECS};
1313
use crate::fee_estimator::{ConfirmationTarget, FeeEstimator};
1414
use crate::Error;
1515

@@ -26,8 +26,8 @@ use lightning::sign::{
2626
use lightning::util::message_signing;
2727
use lightning_invoice::RawBolt11Invoice;
2828

29-
use bdk::blockchain::EsploraBlockchain;
3029
use bdk_chain::ChainPosition;
30+
use bdk_esplora::EsploraAsyncExt;
3131
use bdk_wallet::{KeychainKind, PersistedWallet, SignOptions};
3232

3333
use bitcoin::blockdata::constants::WITNESS_SCALE_FACTOR;
@@ -42,6 +42,8 @@ use bitcoin::{
4242
Amount, ScriptBuf, Transaction, TxOut, Txid, WPubkeyHash, WitnessProgram, WitnessVersion,
4343
};
4444

45+
use esplora_client::AsyncClient as EsploraAsyncClient;
46+
4547
use std::ops::{Deref, DerefMut};
4648
use std::sync::{Arc, Mutex};
4749
use std::time::Duration;
@@ -60,11 +62,9 @@ where
6062
E::Target: FeeEstimator,
6163
L::Target: Logger,
6264
{
63-
// A BDK blockchain used for wallet sync.
64-
blockchain: EsploraBlockchain,
6565
// A BDK on-chain wallet.
6666
inner: Mutex<PersistedWallet<KVStoreWalletPersister>>,
67-
// A cache storing the most recently retrieved fee rate estimations.
67+
esplora_client: EsploraAsyncClient,
6868
broadcaster: B,
6969
fee_estimator: E,
7070
// A Mutex holding the current sync status.
@@ -79,12 +79,12 @@ where
7979
L::Target: Logger,
8080
{
8181
pub(crate) fn new(
82-
blockchain: EsploraBlockchain, wallet: bdk_wallet::PersistedWallet<KVStoreWalletPersister>,
83-
broadcaster: B, fee_estimator: E, logger: L,
82+
wallet: bdk_wallet::PersistedWallet<KVStoreWalletPersister>,
83+
esplora_client: EsploraAsyncClient, broadcaster: B, fee_estimator: E, logger: L,
8484
) -> Self {
8585
let inner = Mutex::new(wallet);
8686
let sync_status = Mutex::new(WalletSyncStatus::Completed);
87-
Self { blockchain, inner, broadcaster, fee_estimator, sync_status, logger }
87+
Self { inner, esplora_client, broadcaster, fee_estimator, sync_status, logger }
8888
}
8989

9090
pub(crate) async fn sync(&self) -> Result<(), Error> {
@@ -98,34 +98,42 @@ where
9898
}
9999

100100
let res = {
101-
let wallet_lock = self.inner.lock().unwrap();
101+
let full_scan_request = self.inner.lock().unwrap().start_full_scan().build();
102102

103103
let wallet_sync_timeout_fut = tokio::time::timeout(
104104
Duration::from_secs(BDK_WALLET_SYNC_TIMEOUT_SECS),
105-
wallet_lock.sync(&self.blockchain, SyncOptions { progress: None }),
105+
self.esplora_client.full_scan(
106+
full_scan_request,
107+
BDK_CLIENT_STOP_GAP,
108+
BDK_CLIENT_CONCURRENCY,
109+
),
106110
);
107111

108112
match wallet_sync_timeout_fut.await {
109113
Ok(res) => match res {
110-
Ok(()) => Ok(()),
111-
Err(e) => match e {
112-
bdk::Error::Esplora(ref be) => match **be {
113-
bdk::blockchain::esplora::EsploraError::Reqwest(_) => {
114-
log_error!(
115-
self.logger,
116-
"Sync failed due to HTTP connection error: {}",
117-
e
118-
);
119-
Err(From::from(e))
120-
},
121-
_ => {
122-
log_error!(self.logger, "Sync failed due to Esplora error: {}", e);
123-
Err(From::from(e))
124-
},
114+
Ok(update) => match self.inner.lock().unwrap().apply_update(update) {
115+
Ok(()) => Ok(()),
116+
Err(e) => {
117+
log_error!(
118+
self.logger,
119+
"Sync failed due to chain connection error: {}",
120+
e
121+
);
122+
Err(Error::WalletOperationFailed)
123+
},
124+
},
125+
Err(e) => match *e {
126+
esplora_client::Error::Reqwest(he) => {
127+
log_error!(
128+
self.logger,
129+
"Sync failed due to HTTP connection error: {}",
130+
he
131+
);
132+
Err(Error::WalletOperationFailed)
125133
},
126134
_ => {
127-
log_error!(self.logger, "Wallet sync error: {}", e);
128-
Err(From::from(e))
135+
log_error!(self.logger, "Sync failed due to Esplora error: {}", e);
136+
Err(Error::WalletOperationFailed)
129137
},
130138
},
131139
},

0 commit comments

Comments
 (0)