Skip to content

Commit 6c1165a

Browse files
committed
f BDK: Account for new syncing interface
1 parent dcac201 commit 6c1165a

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;
@@ -586,7 +586,7 @@ fn build_with_store_internal(
586586
})?,
587587
};
588588

589-
let (blockchain, tx_sync, tx_broadcaster, fee_estimator) = match chain_data_source_config {
589+
let (esplora_client, tx_sync, tx_broadcaster, fee_estimator) = match chain_data_source_config {
590590
Some(ChainDataSourceConfig::Esplora(server_url)) => {
591591
let mut client_builder = esplora_client::Builder::new(&server_url.clone());
592592
client_builder = client_builder.timeout(DEFAULT_ESPLORA_CLIENT_TIMEOUT_SECS);
@@ -595,8 +595,6 @@ fn build_with_store_internal(
595595
esplora_client.clone(),
596596
Arc::clone(&logger),
597597
));
598-
let blockchain = EsploraBlockchain::from_client(esplora_client, BDK_CLIENT_STOP_GAP)
599-
.with_concurrency(BDK_CLIENT_CONCURRENCY);
600598
let tx_broadcaster = Arc::new(TransactionBroadcaster::new(
601599
tx_sync.client().clone(),
602600
Arc::clone(&logger),
@@ -606,15 +604,18 @@ fn build_with_store_internal(
606604
Arc::clone(&config),
607605
Arc::clone(&logger),
608606
));
609-
(blockchain, tx_sync, tx_broadcaster, fee_estimator)
607+
(esplora_client, tx_sync, tx_broadcaster, fee_estimator)
610608
},
611609
None => {
612610
// Default to Esplora client.
613611
let server_url = DEFAULT_ESPLORA_SERVER_URL.to_string();
614-
let tx_sync = Arc::new(EsploraSyncClient::new(server_url, Arc::clone(&logger)));
615-
let blockchain =
616-
EsploraBlockchain::from_client(tx_sync.client().clone(), BDK_CLIENT_STOP_GAP)
617-
.with_concurrency(BDK_CLIENT_CONCURRENCY);
612+
let mut client_builder = esplora_client::Builder::new(&server_url.clone());
613+
client_builder = client_builder.timeout(DEFAULT_ESPLORA_CLIENT_TIMEOUT_SECS);
614+
let esplora_client = client_builder.build_async().unwrap();
615+
let tx_sync = Arc::new(EsploraSyncClient::from_client(
616+
esplora_client.clone(),
617+
Arc::clone(&logger),
618+
));
618619
let tx_broadcaster = Arc::new(TransactionBroadcaster::new(
619620
tx_sync.client().clone(),
620621
Arc::clone(&logger),
@@ -624,14 +625,14 @@ fn build_with_store_internal(
624625
Arc::clone(&config),
625626
Arc::clone(&logger),
626627
));
627-
(blockchain, tx_sync, tx_broadcaster, fee_estimator)
628+
(esplora_client, tx_sync, tx_broadcaster, fee_estimator)
628629
},
629630
};
630631

631632
let runtime = Arc::new(RwLock::new(None));
632633
let wallet = Arc::new(Wallet::new(
633-
blockchain,
634634
bdk_wallet,
635+
esplora_client,
635636
Arc::clone(&tx_broadcaster),
636637
Arc::clone(&fee_estimator),
637638
Arc::clone(&logger),

src/config.rs

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

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

3737
// The default Esplora server we're using.
3838
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

@@ -206,6 +207,12 @@ impl From<BdkExtractTxError> for Error {
206207
}
207208
}
208209

210+
impl From<BdkChainConnectionError> for Error {
211+
fn from(_: BdkChainConnectionError) -> Self {
212+
Self::WalletOperationFailed
213+
}
214+
}
215+
209216
impl From<lightning_transaction_sync::TxSyncError> for Error {
210217
fn from(_e: lightning_transaction_sync::TxSyncError) -> Self {
211218
Self::TxSyncFailed

src/lib.rs

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

329324
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)