@@ -40,8 +40,9 @@ use lightning::types::payment::{PaymentHash, PaymentPreimage, PaymentSecret};
4040use lightning:: util:: config:: UserConfig ;
4141use lightning:: util:: hash_tables:: hash_map:: Entry ;
4242use lightning:: util:: hash_tables:: HashMap ;
43+ use lightning:: util:: native_async:: FutureSpawner ;
4344use lightning:: util:: persist:: {
44- self , KVStore , MonitorUpdatingPersister , OUTPUT_SWEEPER_PERSISTENCE_KEY ,
45+ self , KVStore , MonitorUpdatingPersisterAsync , OUTPUT_SWEEPER_PERSISTENCE_KEY ,
4546 OUTPUT_SWEEPER_PERSISTENCE_PRIMARY_NAMESPACE , OUTPUT_SWEEPER_PERSISTENCE_SECONDARY_NAMESPACE ,
4647} ;
4748use lightning:: util:: ser:: { Readable , ReadableArgs , Writeable , Writer } ;
@@ -61,6 +62,7 @@ use std::convert::TryInto;
6162use std:: fmt;
6263use std:: fs;
6364use std:: fs:: File ;
65+ use std:: future:: Future ;
6466use std:: io:: { BufReader , Write } ;
6567use std:: net:: ToSocketAddrs ;
6668use std:: path:: Path ;
@@ -141,15 +143,14 @@ type ChainMonitor = chainmonitor::ChainMonitor<
141143 Arc < BitcoindClient > ,
142144 Arc < BitcoindClient > ,
143145 Arc < FilesystemLogger > ,
144- Arc <
145- MonitorUpdatingPersister <
146- Arc < FilesystemStore > ,
147- Arc < FilesystemLogger > ,
148- Arc < KeysManager > ,
149- Arc < KeysManager > ,
150- Arc < BitcoindClient > ,
151- Arc < BitcoindClient > ,
152- > ,
146+ chainmonitor:: AsyncPersister <
147+ Arc < FilesystemStore > ,
148+ TokioSpawner ,
149+ Arc < FilesystemLogger > ,
150+ Arc < KeysManager > ,
151+ Arc < KeysManager > ,
152+ Arc < BitcoindClient > ,
153+ Arc < BitcoindClient > ,
153154 > ,
154155 Arc < KeysManager > ,
155156> ;
@@ -212,6 +213,14 @@ pub(crate) type OutputSweeper = ldk_sweep::OutputSweeper<
212213// Needed due to rust-lang/rust#63033.
213214struct OutputSweeperWrapper ( Arc < OutputSweeper > ) ;
214215
216+ // Trivially bridge the LDK FutureSpawner trait to tokio
217+ struct TokioSpawner ;
218+ impl FutureSpawner for TokioSpawner {
219+ fn spawn < T : Future < Output = ( ) > + Send + ' static > ( & self , future : T ) {
220+ tokio:: spawn ( future) ;
221+ }
222+ }
223+
215224fn handle_ldk_events < ' a > (
216225 channel_manager : Arc < ChannelManager > , bitcoind_client : & ' a BitcoindClient ,
217226 network_graph : & ' a NetworkGraph , keys_manager : & ' a KeysManager ,
@@ -650,36 +659,37 @@ async fn start_ldk() {
650659
651660 // Step 5: Initialize Persistence
652661 let fs_store = Arc :: new ( FilesystemStore :: new ( ldk_data_dir. clone ( ) . into ( ) ) ) ;
653- let persister = Arc :: new ( MonitorUpdatingPersister :: new (
662+ let persister = MonitorUpdatingPersisterAsync :: new (
654663 Arc :: clone ( & fs_store) ,
664+ TokioSpawner ,
655665 Arc :: clone ( & logger) ,
656666 1000 ,
657667 Arc :: clone ( & keys_manager) ,
658668 Arc :: clone ( & keys_manager) ,
659669 Arc :: clone ( & bitcoind_client) ,
660670 Arc :: clone ( & bitcoind_client) ,
661- ) ) ;
671+ ) ;
662672 // Alternatively, you can use the `FilesystemStore` as a `Persist` directly, at the cost of
663673 // larger `ChannelMonitor` update writes (but no deletion or cleanup):
664674 //let persister = Arc::clone(&fs_store);
665675
666- // Step 6: Initialize the ChainMonitor
667- let chain_monitor: Arc < ChainMonitor > = Arc :: new ( chainmonitor:: ChainMonitor :: new (
676+ // Step 6: Read ChannelMonitor state from disk
677+ let mut channelmonitors = persister. read_all_channel_monitors_with_updates ( ) . await . unwrap ( ) ;
678+ // If you are using the `FilesystemStore` as a `Persist` directly, use
679+ // `lightning::util::persist::read_channel_monitors` like this:
680+ //read_channel_monitors(Arc::clone(&persister), Arc::clone(&keys_manager), Arc::clone(&keys_manager)).unwrap();
681+
682+ // Step 7: Initialize the ChainMonitor
683+ let chain_monitor: Arc < ChainMonitor > = Arc :: new ( chainmonitor:: ChainMonitor :: new_async_beta (
668684 None ,
669685 Arc :: clone ( & broadcaster) ,
670686 Arc :: clone ( & logger) ,
671687 Arc :: clone ( & fee_estimator) ,
672- Arc :: clone ( & persister) ,
688+ persister,
673689 Arc :: clone ( & keys_manager) ,
674690 keys_manager. get_peer_storage_key ( ) ,
675691 ) ) ;
676692
677- // Step 7: Read ChannelMonitor state from disk
678- let mut channelmonitors = persister. read_all_channel_monitors_with_updates ( ) . unwrap ( ) ;
679- // If you are using the `FilesystemStore` as a `Persist` directly, use
680- // `lightning::util::persist::read_channel_monitors` like this:
681- //read_channel_monitors(Arc::clone(&persister), Arc::clone(&keys_manager), Arc::clone(&keys_manager)).unwrap();
682-
683693 // Step 8: Poll for the best chain tip, which may be used by the channel manager & spv client
684694 let polled_chain_tip = init:: validate_best_block_header ( bitcoind_client. as_ref ( ) )
685695 . await
@@ -838,6 +848,8 @@ async fn start_ldk() {
838848 // Step 14: Give ChannelMonitors to ChainMonitor
839849 for ( _, ( channel_monitor, _, _, _) , _) in chain_listener_channel_monitors {
840850 let channel_id = channel_monitor. channel_id ( ) ;
851+ // Note that this may not return `Completed` for ChannelMonitors which were last written by
852+ // a version of LDK prior to 0.1.
841853 assert_eq ! (
842854 chain_monitor. load_existing_monitor( channel_id, channel_monitor) ,
843855 Ok ( ChannelMonitorUpdateStatus :: Completed )
0 commit comments