@@ -12,6 +12,7 @@ use bitcoin::blockdata::transaction::Transaction;
1212use bitcoin:: consensus:: encode;
1313use bitcoin:: io;
1414use bitcoin:: network:: Network ;
15+ use bitcoin:: secp256k1:: PublicKey ;
1516use bitcoin:: BlockHash ;
1617use bitcoin_bech32:: WitnessProgram ;
1718use disk:: { INBOUND_PAYMENTS_FNAME , OUTBOUND_PAYMENTS_FNAME } ;
@@ -33,7 +34,10 @@ use lightning::onion_message::messenger::{
3334} ;
3435use lightning:: routing:: gossip;
3536use lightning:: routing:: gossip:: { NodeId , P2PGossipSync } ;
36- use lightning:: routing:: router:: DefaultRouter ;
37+ use lightning:: routing:: router:: {
38+ DefaultRouter , PaymentParameters , RouteParameters , ScorerAccountingForInFlightHtlcs ,
39+ } ;
40+ use lightning:: routing:: scoring:: ProbabilisticScorer ;
3741use lightning:: routing:: scoring:: ProbabilisticScoringFeeParameters ;
3842use lightning:: sign:: { EntropySource , InMemorySigner , KeysManager , NodeSigner } ;
3943use lightning:: types:: payment:: { PaymentHash , PaymentPreimage , PaymentSecret } ;
@@ -209,6 +213,55 @@ pub(crate) type OutputSweeper = ldk_sweep::OutputSweeper<
209213// Needed due to rust-lang/rust#63033.
210214struct OutputSweeperWrapper ( Arc < OutputSweeper > ) ;
211215
216+ fn send_rand_probe (
217+ channel_manager : & ChannelManager , graph : & NetworkGraph , logger : & disk:: FilesystemLogger ,
218+ scorer : & RwLock < ProbabilisticScorer < Arc < NetworkGraph > , Arc < disk:: FilesystemLogger > > > ,
219+ ) {
220+ let rcpt = {
221+ let lck = graph. read_only ( ) ;
222+ if lck. nodes ( ) . is_empty ( ) {
223+ return ;
224+ }
225+ let mut it =
226+ lck. nodes ( ) . unordered_iter ( ) . skip ( :: rand:: random :: < usize > ( ) % lck. nodes ( ) . len ( ) ) ;
227+ it. next ( ) . unwrap ( ) . 0 . clone ( )
228+ } ;
229+ let amt = :: rand:: random :: < u64 > ( ) % 500_000_000 ;
230+ if let Ok ( pk) = bitcoin:: secp256k1:: PublicKey :: from_slice ( rcpt. as_slice ( ) ) {
231+ send_probe ( channel_manager, pk, graph, logger, amt, scorer) ;
232+ }
233+ }
234+
235+ fn send_probe (
236+ channel_manager : & ChannelManager , recipient : PublicKey , graph : & NetworkGraph ,
237+ logger : & disk:: FilesystemLogger , amt_msat : u64 ,
238+ scorer : & RwLock < ProbabilisticScorer < Arc < NetworkGraph > , Arc < disk:: FilesystemLogger > > > ,
239+ ) {
240+ let chans = channel_manager. list_usable_channels ( ) ;
241+ let chan_refs = chans. iter ( ) . map ( |a| a) . collect :: < Vec < _ > > ( ) ;
242+ let mut payment_params = PaymentParameters :: from_node_id ( recipient, 144 ) ;
243+ payment_params. max_path_count = 1 ;
244+ let in_flight_htlcs = channel_manager. compute_inflight_htlcs ( ) ;
245+ let scorer = scorer. read ( ) . unwrap ( ) ;
246+ let inflight_scorer = ScorerAccountingForInFlightHtlcs :: new ( & scorer, & in_flight_htlcs) ;
247+ let score_params: ProbabilisticScoringFeeParameters = Default :: default ( ) ;
248+ let route_res = lightning:: routing:: router:: find_route (
249+ & channel_manager. get_our_node_id ( ) ,
250+ & RouteParameters :: from_payment_params_and_value ( payment_params, amt_msat) ,
251+ & graph,
252+ Some ( & chan_refs) ,
253+ logger,
254+ & inflight_scorer,
255+ & score_params,
256+ & [ 32 ; 32 ] ,
257+ ) ;
258+ if let Ok ( route) = route_res {
259+ for path in route. paths {
260+ let _ = channel_manager. send_probe ( path) ;
261+ }
262+ }
263+ }
264+
212265fn handle_ldk_events < ' a > (
213266 channel_manager : Arc < ChannelManager > , bitcoind_client : & ' a BitcoindClient ,
214267 network_graph : & ' a NetworkGraph , keys_manager : & ' a KeysManager ,
@@ -1158,6 +1211,19 @@ async fn start_ldk() {
11581211 Arc :: clone ( & output_sweeper) ,
11591212 ) ) ;
11601213
1214+ // Regularly probe
1215+ let probing_cm = Arc :: clone ( & channel_manager) ;
1216+ let probing_graph = Arc :: clone ( & network_graph) ;
1217+ let probing_logger = Arc :: clone ( & logger) ;
1218+ let probing_scorer = Arc :: clone ( & scorer) ;
1219+ tokio:: spawn ( async move {
1220+ let mut interval = tokio:: time:: interval ( Duration :: from_secs ( 1 ) ) ;
1221+ loop {
1222+ interval. tick ( ) . await ;
1223+ send_rand_probe ( & * probing_cm, & * probing_graph, & * probing_logger, & * probing_scorer) ;
1224+ }
1225+ } ) ;
1226+
11611227 // Start the CLI.
11621228 let cli_channel_manager = Arc :: clone ( & channel_manager) ;
11631229 let cli_chain_monitor = Arc :: clone ( & chain_monitor) ;
0 commit comments