Skip to content

Commit 726a340

Browse files
committed
initial naive probing implementation
Signed-off-by: dzdidi <dzdidi@protonmail.com>
1 parent 8900058 commit 726a340

2 files changed

Lines changed: 69 additions & 2 deletions

File tree

Cargo.lock

Lines changed: 2 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/main.rs

Lines changed: 67 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ use bitcoin::blockdata::transaction::Transaction;
1212
use bitcoin::consensus::encode;
1313
use bitcoin::io;
1414
use bitcoin::network::Network;
15+
use bitcoin::secp256k1::PublicKey;
1516
use bitcoin::BlockHash;
1617
use bitcoin_bech32::WitnessProgram;
1718
use disk::{INBOUND_PAYMENTS_FNAME, OUTBOUND_PAYMENTS_FNAME};
@@ -33,7 +34,10 @@ use lightning::onion_message::messenger::{
3334
};
3435
use lightning::routing::gossip;
3536
use 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;
3741
use lightning::routing::scoring::ProbabilisticScoringFeeParameters;
3842
use lightning::sign::{EntropySource, InMemorySigner, KeysManager, NodeSigner};
3943
use 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.
210214
struct 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+
212265
fn 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

Comments
 (0)