@@ -40,8 +40,9 @@ use lightning::types::payment::{PaymentHash, PaymentPreimage, PaymentSecret};
40
40
use lightning:: util:: config:: UserConfig ;
41
41
use lightning:: util:: hash_tables:: hash_map:: Entry ;
42
42
use lightning:: util:: hash_tables:: HashMap ;
43
+ use lightning:: util:: native_async:: FutureSpawner ;
43
44
use lightning:: util:: persist:: {
44
- self , KVStore , MonitorUpdatingPersister , OUTPUT_SWEEPER_PERSISTENCE_KEY ,
45
+ self , KVStore , MonitorUpdatingPersisterAsync , OUTPUT_SWEEPER_PERSISTENCE_KEY ,
45
46
OUTPUT_SWEEPER_PERSISTENCE_PRIMARY_NAMESPACE , OUTPUT_SWEEPER_PERSISTENCE_SECONDARY_NAMESPACE ,
46
47
} ;
47
48
use lightning:: util:: ser:: { Readable , ReadableArgs , Writeable , Writer } ;
@@ -61,6 +62,7 @@ use std::convert::TryInto;
61
62
use std:: fmt;
62
63
use std:: fs;
63
64
use std:: fs:: File ;
65
+ use std:: future:: Future ;
64
66
use std:: io:: { BufReader , Write } ;
65
67
use std:: net:: ToSocketAddrs ;
66
68
use std:: path:: Path ;
@@ -141,15 +143,14 @@ type ChainMonitor = chainmonitor::ChainMonitor<
141
143
Arc < BitcoindClient > ,
142
144
Arc < BitcoindClient > ,
143
145
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 > ,
153
154
> ,
154
155
Arc < KeysManager > ,
155
156
> ;
@@ -212,6 +213,14 @@ pub(crate) type OutputSweeper = ldk_sweep::OutputSweeper<
212
213
// Needed due to rust-lang/rust#63033.
213
214
struct OutputSweeperWrapper ( Arc < OutputSweeper > ) ;
214
215
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
+
215
224
fn handle_ldk_events < ' a > (
216
225
channel_manager : Arc < ChannelManager > , bitcoind_client : & ' a BitcoindClient ,
217
226
network_graph : & ' a NetworkGraph , keys_manager : & ' a KeysManager ,
@@ -649,36 +658,37 @@ async fn start_ldk() {
649
658
650
659
// Step 5: Initialize Persistence
651
660
let fs_store = Arc :: new ( FilesystemStore :: new ( ldk_data_dir. clone ( ) . into ( ) ) ) ;
652
- let persister = Arc :: new ( MonitorUpdatingPersister :: new (
661
+ let persister = MonitorUpdatingPersisterAsync :: new (
653
662
Arc :: clone ( & fs_store) ,
663
+ TokioSpawner ,
654
664
Arc :: clone ( & logger) ,
655
665
1000 ,
656
666
Arc :: clone ( & keys_manager) ,
657
667
Arc :: clone ( & keys_manager) ,
658
668
Arc :: clone ( & bitcoind_client) ,
659
669
Arc :: clone ( & bitcoind_client) ,
660
- ) ) ;
670
+ ) ;
661
671
// Alternatively, you can use the `FilesystemStore` as a `Persist` directly, at the cost of
662
672
// larger `ChannelMonitor` update writes (but no deletion or cleanup):
663
673
//let persister = Arc::clone(&fs_store);
664
674
665
- // Step 6: Initialize the ChainMonitor
666
- let chain_monitor: Arc < ChainMonitor > = Arc :: new ( chainmonitor:: ChainMonitor :: new (
675
+ // Step 6: Read ChannelMonitor state from disk
676
+ let mut channelmonitors = persister. read_all_channel_monitors_with_updates ( ) . await . unwrap ( ) ;
677
+ // If you are using the `FilesystemStore` as a `Persist` directly, use
678
+ // `lightning::util::persist::read_channel_monitors` like this:
679
+ //read_channel_monitors(Arc::clone(&persister), Arc::clone(&keys_manager), Arc::clone(&keys_manager)).unwrap();
680
+
681
+ // Step 7: Initialize the ChainMonitor
682
+ let chain_monitor: Arc < ChainMonitor > = Arc :: new ( chainmonitor:: ChainMonitor :: new_async_beta (
667
683
None ,
668
684
Arc :: clone ( & broadcaster) ,
669
685
Arc :: clone ( & logger) ,
670
686
Arc :: clone ( & fee_estimator) ,
671
- Arc :: clone ( & persister) ,
687
+ persister,
672
688
Arc :: clone ( & keys_manager) ,
673
689
keys_manager. get_peer_storage_key ( ) ,
674
690
) ) ;
675
691
676
- // Step 7: Read ChannelMonitor state from disk
677
- let mut channelmonitors = persister. read_all_channel_monitors_with_updates ( ) . 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
692
// Step 8: Poll for the best chain tip, which may be used by the channel manager & spv client
683
693
let polled_chain_tip = init:: validate_best_block_header ( bitcoind_client. as_ref ( ) )
684
694
. await
@@ -837,6 +847,8 @@ async fn start_ldk() {
837
847
// Step 14: Give ChannelMonitors to ChainMonitor
838
848
for ( _, ( channel_monitor, _, _, _) , _) in chain_listener_channel_monitors {
839
849
let channel_id = channel_monitor. channel_id ( ) ;
850
+ // Note that this may not return `Completed` for ChannelMonitors which were last written by
851
+ // a version of LDK prior to 0.1.
840
852
assert_eq ! (
841
853
chain_monitor. load_existing_channel( channel_id, channel_monitor) ,
842
854
Ok ( ChannelMonitorUpdateStatus :: Completed )
0 commit comments