Skip to content

Commit 490f401

Browse files
committed
Implement Score's FeeParams as a passed-in parameter on RouteFinding functions
This PR aims to create a "stateless" scorer. Instead of passing in fee params at construction-time, we want to parametrize the scorer with an associated "parameter" type, which is then passed to the router function itself, and allows passing different parameters per route-finding call.
1 parent 0ecb4b0 commit 490f401

File tree

12 files changed

+652
-579
lines changed

12 files changed

+652
-579
lines changed

fuzz/src/full_stack.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ use lightning::util::config::UserConfig;
4848
use lightning::util::errors::APIError;
4949
use lightning::util::enforcing_trait_impls::{EnforcingSigner, EnforcementState};
5050
use lightning::util::logger::Logger;
51-
use lightning::util::ser::{Readable, ReadableArgs, Writeable};
51+
use lightning::util::ser::{ReadableArgs, Writeable};
5252

5353
use crate::utils::test_logger;
5454
use crate::utils::test_persister::TestPersister;

fuzz/src/router.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ use lightning::ln::msgs;
1717
use lightning::routing::gossip::{NetworkGraph, RoutingFees};
1818
use lightning::routing::utxo::{UtxoFuture, UtxoLookup, UtxoLookupError, UtxoResult};
1919
use lightning::routing::router::{find_route, PaymentParameters, RouteHint, RouteHintHop, RouteParameters};
20-
use lightning::routing::scoring::ProbabilisticScorer;
20+
use lightning::routing::scoring::{ProbabilisticScorer, ProbabilisticScoringFeeParameters, ProbabilisticScoringDecayParameters};
2121
use lightning::util::config::UserConfig;
2222
use lightning::util::ser::Readable;
2323

@@ -293,7 +293,7 @@ pub fn do_test<Out: test_logger::Output>(data: &[u8], out: Out) {
293293
}]));
294294
}
295295
}
296-
let scorer = ProbabilisticScorer::new(Default::default(), &net_graph, &logger);
296+
let scorer = ProbabilisticScorer::new(ProbabilisticScoringDecayParameters::default(), &net_graph, &logger);
297297
let random_seed_bytes: [u8; 32] = [get_slice!(1)[0]; 32];
298298
for target in node_pks.iter() {
299299
let final_value_msat = slice_to_be64(get_slice!(8));
@@ -305,7 +305,7 @@ pub fn do_test<Out: test_logger::Output>(data: &[u8], out: Out) {
305305
};
306306
let _ = find_route(&our_pubkey, &route_params, &net_graph,
307307
first_hops.map(|c| c.iter().collect::<Vec<_>>()).as_ref().map(|a| a.as_slice()),
308-
&logger, &scorer, &random_seed_bytes);
308+
&logger, &scorer, &ProbabilisticScoringFeeParameters::default(), &random_seed_bytes);
309309
}
310310
},
311311
}

lightning-background-processor/src/lib.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -866,7 +866,7 @@ mod tests {
866866
fn disconnect_socket(&mut self) {}
867867
}
868868

869-
type ChannelManager = channelmanager::ChannelManager<Arc<ChainMonitor>, Arc<test_utils::TestBroadcaster>, Arc<KeysManager>, Arc<KeysManager>, Arc<KeysManager>, Arc<test_utils::TestFeeEstimator>, Arc<DefaultRouter< Arc<NetworkGraph<Arc<test_utils::TestLogger>>>, Arc<test_utils::TestLogger>, Arc<Mutex<TestScorer>>>>, Arc<test_utils::TestLogger>>;
869+
type ChannelManager = channelmanager::ChannelManager<Arc<ChainMonitor>, Arc<test_utils::TestBroadcaster>, Arc<KeysManager>, Arc<KeysManager>, Arc<KeysManager>, Arc<test_utils::TestFeeEstimator>, Arc<DefaultRouter<Arc<NetworkGraph<Arc<test_utils::TestLogger>>>, Arc<test_utils::TestLogger>, Arc<Mutex<TestScorer>>, (), TestScorer>>, Arc<test_utils::TestLogger>>;
870870

871871
type ChainMonitor = chainmonitor::ChainMonitor<InMemorySigner, Arc<test_utils::TestChainSource>, Arc<test_utils::TestBroadcaster>, Arc<test_utils::TestFeeEstimator>, Arc<test_utils::TestLogger>, Arc<FilesystemPersister>>;
872872

@@ -1000,8 +1000,9 @@ mod tests {
10001000
}
10011001

10021002
impl Score for TestScorer {
1003+
type ScoreParams = ();
10031004
fn channel_penalty_msat(
1004-
&self, _short_channel_id: u64, _source: &NodeId, _target: &NodeId, _usage: ChannelUsage
1005+
&self, _short_channel_id: u64, _source: &NodeId, _target: &NodeId, _usage: ChannelUsage, _score_params: &Self::ScoreParams
10051006
) -> u64 { unimplemented!(); }
10061007

10071008
fn payment_path_failed(&mut self, actual_path: &Path, actual_short_channel_id: u64) {
@@ -1114,7 +1115,7 @@ mod tests {
11141115
let network_graph = Arc::new(NetworkGraph::new(network, logger.clone()));
11151116
let scorer = Arc::new(Mutex::new(TestScorer::new()));
11161117
let seed = [i as u8; 32];
1117-
let router = Arc::new(DefaultRouter::new(network_graph.clone(), logger.clone(), seed, scorer.clone()));
1118+
let router = Arc::new(DefaultRouter::new(network_graph.clone(), logger.clone(), seed, scorer.clone(), ()));
11181119
let chain_source = Arc::new(test_utils::TestChainSource::new(Network::Testnet));
11191120
let persister = Arc::new(FilesystemPersister::new(format!("{}_persister_{}", &persist_dir, i)));
11201121
let now = Duration::from_secs(genesis_block.header.time as u64);

lightning/src/ln/channelmanager.rs

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ use crate::ln::features::{ChannelFeatures, ChannelTypeFeatures, InitFeatures, No
4646
use crate::ln::features::InvoiceFeatures;
4747
use crate::routing::gossip::NetworkGraph;
4848
use crate::routing::router::{BlindedTail, DefaultRouter, InFlightHtlcs, Path, Payee, PaymentParameters, Route, RouteHop, RouteParameters, Router};
49-
use crate::routing::scoring::ProbabilisticScorer;
49+
use crate::routing::scoring::{ProbabilisticScorer, ProbabilisticScoringFeeParameters};
5050
use crate::ln::msgs;
5151
use crate::ln::onion_utils;
5252
use crate::ln::onion_utils::HTLCFailReason;
@@ -623,7 +623,9 @@ pub type SimpleArcChannelManager<M, T, F, L> = ChannelManager<
623623
Arc<DefaultRouter<
624624
Arc<NetworkGraph<Arc<L>>>,
625625
Arc<L>,
626-
Arc<Mutex<ProbabilisticScorer<Arc<NetworkGraph<Arc<L>>>, Arc<L>>>>
626+
Arc<Mutex<ProbabilisticScorer<Arc<NetworkGraph<Arc<L>>>, Arc<L>>>>,
627+
ProbabilisticScoringFeeParameters,
628+
ProbabilisticScorer<Arc<NetworkGraph<Arc<L>>>, Arc<L>>,
627629
>>,
628630
Arc<L>
629631
>;
@@ -639,7 +641,7 @@ pub type SimpleArcChannelManager<M, T, F, L> = ChannelManager<
639641
/// of [`KeysManager`] and [`DefaultRouter`].
640642
///
641643
/// This is not exported to bindings users as Arcs don't make sense in bindings
642-
pub type SimpleRefChannelManager<'a, 'b, 'c, 'd, 'e, 'f, 'g, 'h, M, T, F, L> = ChannelManager<&'a M, &'b T, &'c KeysManager, &'c KeysManager, &'c KeysManager, &'d F, &'e DefaultRouter<&'f NetworkGraph<&'g L>, &'g L, &'h Mutex<ProbabilisticScorer<&'f NetworkGraph<&'g L>, &'g L>>>, &'g L>;
644+
pub type SimpleRefChannelManager<'a, 'b, 'c, 'd, 'e, 'f, 'g, 'h, M, T, F, L> = ChannelManager<&'a M, &'b T, &'c KeysManager, &'c KeysManager, &'c KeysManager, &'d F, &'e DefaultRouter<&'f NetworkGraph<&'g L>, &'g L, &'h Mutex<ProbabilisticScorer<&'f NetworkGraph<&'g L>, &'g L>>, ProbabilisticScoringFeeParameters, ProbabilisticScorer<&'f NetworkGraph<&'g L>, &'g L>>, &'g L>;
643645

644646
/// A trivial trait which describes any [`ChannelManager`] used in testing.
645647
#[cfg(any(test, feature = "_test_utils"))]
@@ -8588,7 +8590,7 @@ mod tests {
85888590
};
85898591
let route = find_route(
85908592
&nodes[0].node.get_our_node_id(), &route_params, &nodes[0].network_graph,
8591-
None, nodes[0].logger, &scorer, &random_seed_bytes
8593+
None, nodes[0].logger, &scorer, &(), &random_seed_bytes
85928594
).unwrap();
85938595
nodes[0].node.send_spontaneous_payment(&route, Some(payment_preimage),
85948596
RecipientOnionFields::spontaneous_empty(), PaymentId(payment_preimage.0)).unwrap();
@@ -8622,7 +8624,7 @@ mod tests {
86228624
let payment_preimage = PaymentPreimage([42; 32]);
86238625
let route = find_route(
86248626
&nodes[0].node.get_our_node_id(), &route_params, &nodes[0].network_graph,
8625-
None, nodes[0].logger, &scorer, &random_seed_bytes
8627+
None, nodes[0].logger, &scorer, &(), &random_seed_bytes
86268628
).unwrap();
86278629
let payment_hash = nodes[0].node.send_spontaneous_payment(&route, Some(payment_preimage),
86288630
RecipientOnionFields::spontaneous_empty(), PaymentId(payment_preimage.0)).unwrap();
@@ -8685,7 +8687,7 @@ mod tests {
86858687
let random_seed_bytes = chanmon_cfgs[1].keys_manager.get_secure_random_bytes();
86868688
let route = find_route(
86878689
&payer_pubkey, &route_params, &network_graph, Some(&first_hops.iter().collect::<Vec<_>>()),
8688-
nodes[0].logger, &scorer, &random_seed_bytes
8690+
nodes[0].logger, &scorer, &(), &random_seed_bytes
86898691
).unwrap();
86908692

86918693
let test_preimage = PaymentPreimage([42; 32]);
@@ -8729,7 +8731,7 @@ mod tests {
87298731
let random_seed_bytes = chanmon_cfgs[1].keys_manager.get_secure_random_bytes();
87308732
let route = find_route(
87318733
&payer_pubkey, &route_params, &network_graph, Some(&first_hops.iter().collect::<Vec<_>>()),
8732-
nodes[0].logger, &scorer, &random_seed_bytes
8734+
nodes[0].logger, &scorer, &(), &random_seed_bytes
87338735
).unwrap();
87348736

87358737
let test_preimage = PaymentPreimage([42; 32]);

lightning/src/ln/functional_test_utils.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1738,7 +1738,7 @@ pub fn get_route(send_node: &Node, payment_params: &PaymentParameters, recv_valu
17381738
router::get_route(
17391739
&send_node.node.get_our_node_id(), payment_params, &send_node.network_graph.read_only(),
17401740
Some(&send_node.node.list_usable_channels().iter().collect::<Vec<_>>()),
1741-
recv_value, send_node.logger, &scorer, &random_seed_bytes
1741+
recv_value, send_node.logger, &scorer, &(), &random_seed_bytes
17421742
)
17431743
}
17441744

@@ -2328,7 +2328,7 @@ pub fn route_over_limit<'a, 'b, 'c>(origin_node: &Node<'a, 'b, 'c>, expected_rou
23282328
let random_seed_bytes = keys_manager.get_secure_random_bytes();
23292329
let route = router::get_route(
23302330
&origin_node.node.get_our_node_id(), &payment_params, &network_graph,
2331-
None, recv_value, origin_node.logger, &scorer, &random_seed_bytes).unwrap();
2331+
None, recv_value, origin_node.logger, &scorer, &(), &random_seed_bytes).unwrap();
23322332
assert_eq!(route.paths.len(), 1);
23332333
assert_eq!(route.paths[0].hops.len(), expected_route.len());
23342334
for (node, hop) in expected_route.iter().zip(route.paths[0].hops.iter()) {

lightning/src/ln/functional_tests.rs

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7043,8 +7043,13 @@ fn test_check_htlc_underpaying() {
70437043

70447044
let scorer = test_utils::TestScorer::new();
70457045
let random_seed_bytes = chanmon_cfgs[1].keys_manager.get_secure_random_bytes();
7046+
<<<<<<< HEAD
70467047
let payment_params = PaymentParameters::from_node_id(nodes[1].node.get_our_node_id(), TEST_FINAL_CLTV).with_bolt11_features(nodes[1].node.invoice_features()).unwrap();
7047-
let route = get_route(&nodes[0].node.get_our_node_id(), &payment_params, &nodes[0].network_graph.read_only(), None, 10_000, nodes[0].logger, &scorer, &random_seed_bytes).unwrap();
7048+
let route = get_route(&nodes[0].node.get_our_node_id(), &payment_params, &nodes[0].network_graph.read_only(), None, 10_000, nodes[0].logger, &scorer, &(), &random_seed_bytes).unwrap();
7049+
=======
7050+
let payment_params = PaymentParameters::from_node_id(nodes[1].node.get_our_node_id(), TEST_FINAL_CLTV).with_features(nodes[1].node.invoice_features());
7051+
let route = get_route(&nodes[0].node.get_our_node_id(), &payment_params, &nodes[0].network_graph.read_only(), None, 10_000, nodes[0].logger, &scorer, &(), &random_seed_bytes).unwrap();
7052+
>>>>>>> c3e37649 (Implement Score's FeeParams as a passed-in parameter on RouteFinding functions)
70487053
let (_, our_payment_hash, _) = get_payment_preimage_hash!(nodes[0]);
70497054
let our_payment_secret = nodes[1].node.create_inbound_payment_for_hash(our_payment_hash, Some(100_000), 7200, None).unwrap();
70507055
nodes[0].node.send_payment_with_route(&route, our_payment_hash,
@@ -7298,11 +7303,11 @@ fn test_bump_penalty_txn_on_revoked_htlcs() {
72987303
let scorer = test_utils::TestScorer::new();
72997304
let random_seed_bytes = chanmon_cfgs[1].keys_manager.get_secure_random_bytes();
73007305
let route = get_route(&nodes[0].node.get_our_node_id(), &payment_params, &nodes[0].network_graph.read_only(), None,
7301-
3_000_000, nodes[0].logger, &scorer, &random_seed_bytes).unwrap();
7306+
3_000_000, nodes[0].logger, &scorer, &(), &random_seed_bytes).unwrap();
73027307
let payment_preimage = send_along_route(&nodes[0], route, &[&nodes[1]], 3_000_000).0;
73037308
let payment_params = PaymentParameters::from_node_id(nodes[0].node.get_our_node_id(), 50).with_bolt11_features(nodes[0].node.invoice_features()).unwrap();
73047309
let route = get_route(&nodes[1].node.get_our_node_id(), &payment_params, &nodes[1].network_graph.read_only(), None,
7305-
3_000_000, nodes[0].logger, &scorer, &random_seed_bytes).unwrap();
7310+
3_000_000, nodes[0].logger, &scorer, &(), &random_seed_bytes).unwrap();
73067311
send_along_route(&nodes[1], route, &[&nodes[0]], 3_000_000);
73077312

73087313
let revoked_local_txn = get_local_commitment_txn!(nodes[1], chan.2);
@@ -9520,7 +9525,7 @@ fn test_keysend_payments_to_public_node() {
95209525
};
95219526
let scorer = test_utils::TestScorer::new();
95229527
let random_seed_bytes = chanmon_cfgs[1].keys_manager.get_secure_random_bytes();
9523-
let route = find_route(&payer_pubkey, &route_params, &network_graph, None, nodes[0].logger, &scorer, &random_seed_bytes).unwrap();
9528+
let route = find_route(&payer_pubkey, &route_params, &network_graph, None, nodes[0].logger, &scorer, &(), &random_seed_bytes).unwrap();
95249529

95259530
let test_preimage = PaymentPreimage([42; 32]);
95269531
let payment_hash = nodes[0].node.send_spontaneous_payment(&route, Some(test_preimage),
@@ -9555,7 +9560,7 @@ fn test_keysend_payments_to_private_node() {
95559560
let random_seed_bytes = chanmon_cfgs[1].keys_manager.get_secure_random_bytes();
95569561
let route = find_route(
95579562
&payer_pubkey, &route_params, &network_graph, Some(&first_hops.iter().collect::<Vec<_>>()),
9558-
nodes[0].logger, &scorer, &random_seed_bytes
9563+
nodes[0].logger, &scorer, &(), &random_seed_bytes
95599564
).unwrap();
95609565

95619566
let test_preimage = PaymentPreimage([42; 32]);

lightning/src/ln/onion_route_tests.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -993,7 +993,7 @@ macro_rules! get_phantom_route {
993993
(get_route(
994994
&$nodes[0].node.get_our_node_id(), &payment_params, &network_graph,
995995
Some(&$nodes[0].node.list_usable_channels().iter().collect::<Vec<_>>()),
996-
$amt, $nodes[0].logger, &scorer, &[0u8; 32]
996+
$amt, $nodes[0].logger, &scorer, &(), &[0u8; 32]
997997
).unwrap(), phantom_route_hint.phantom_scid)
998998
}
999999
}}

lightning/src/ln/payment_tests.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -864,7 +864,7 @@ fn get_ldk_payment_preimage() {
864864
let route = get_route(
865865
&nodes[0].node.get_our_node_id(), &payment_params, &nodes[0].network_graph.read_only(),
866866
Some(&nodes[0].node.list_usable_channels().iter().collect::<Vec<_>>()),
867-
amt_msat, nodes[0].logger, &scorer, &random_seed_bytes).unwrap();
867+
amt_msat, nodes[0].logger, &scorer, &(), &random_seed_bytes).unwrap();
868868
nodes[0].node.send_payment_with_route(&route, payment_hash,
869869
RecipientOnionFields::secret_only(payment_secret), PaymentId(payment_hash.0)).unwrap();
870870
check_added_monitors!(nodes[0], 1);
@@ -1418,7 +1418,7 @@ fn do_test_intercepted_payment(test: InterceptTest) {
14181418
let route = get_route(
14191419
&nodes[0].node.get_our_node_id(), &route_params.payment_params,
14201420
&nodes[0].network_graph.read_only(), None, route_params.final_value_msat,
1421-
nodes[0].logger, &scorer, &random_seed_bytes,
1421+
nodes[0].logger, &scorer, &(), &random_seed_bytes,
14221422
).unwrap();
14231423

14241424
let (payment_hash, payment_secret) = nodes[2].node.create_inbound_payment(Some(amt_msat), 60 * 60, None).unwrap();

lightning/src/ln/shutdown_tests.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -95,9 +95,9 @@ fn updates_shutdown_wait() {
9595
let (_, payment_hash, payment_secret) = get_payment_preimage_hash!(nodes[0]);
9696

9797
let payment_params_1 = PaymentParameters::from_node_id(nodes[1].node.get_our_node_id(), TEST_FINAL_CLTV).with_bolt11_features(nodes[1].node.invoice_features()).unwrap();
98-
let route_1 = get_route(&nodes[0].node.get_our_node_id(), &payment_params_1, &nodes[0].network_graph.read_only(), None, 100000, &logger, &scorer, &random_seed_bytes).unwrap();
98+
let route_1 = get_route(&nodes[0].node.get_our_node_id(), &payment_params_1, &nodes[0].network_graph.read_only(), None, 100000, &logger, &scorer, &(), &random_seed_bytes).unwrap();
9999
let payment_params_2 = PaymentParameters::from_node_id(nodes[0].node.get_our_node_id(), TEST_FINAL_CLTV).with_bolt11_features(nodes[0].node.invoice_features()).unwrap();
100-
let route_2 = get_route(&nodes[1].node.get_our_node_id(), &payment_params_2, &nodes[1].network_graph.read_only(), None, 100000, &logger, &scorer, &random_seed_bytes).unwrap();
100+
let route_2 = get_route(&nodes[1].node.get_our_node_id(), &payment_params_2, &nodes[1].network_graph.read_only(), None, 100000, &logger, &scorer, &(), &random_seed_bytes).unwrap();
101101
unwrap_send_err!(nodes[0].node.send_payment_with_route(&route_1, payment_hash,
102102
RecipientOnionFields::secret_only(payment_secret), PaymentId(payment_hash.0)
103103
), true, APIError::ChannelUnavailable {..}, {});

0 commit comments

Comments
 (0)