Commit graph

408 commits

Author SHA1 Message Date
Elias Rohrer
2010670ac1 Allow building of a route from given hops
Implements `build_route_from_hops`, which provides a simple way to build
a route from us (payer) to the target node (payee) via the given hops
(which should exclude the payer, but include the payee). This may be
useful, e.g., for probing the chosen path.
2022-05-26 17:29:33 -07:00
Arik Sosman
a58ae4c97b
Introduce graph sync crate for fast-forwarding through gossip data downloaded from a server. 2022-05-25 01:21:33 -07:00
Arik Sosman
46e58ae025
Merge pull request #1492 from tnull/2022-05-fix-bolts-url
Docs: Update to 'new' spec repository URL.
2022-05-20 11:20:55 -07:00
Elias Rohrer
ba7935d1f3 Use new spec repository URL. 2022-05-20 17:17:29 +02:00
Jeffrey Czyz
4715d90a06
Score without uncertainty for exact liquidity
For direct channels, the channel liquidity is known with certainty. Use
this knowledge in ProbabilisticScorer by either penalizing with the
per-hop penalty or u64::max_value depending on the amount.
2022-05-19 14:25:23 -05:00
Jeffrey Czyz
197cbc4d28
Pass effective capacity to scorer
Scorers could benefit from having the channel's EffectiveCapacity rather
than a u64 msat value. For instance, ProbabilisticScorer can give a more
accurate penalty when given the ExactLiquidity variant. Pass a struct
wrapping the effective capacity, the proposed amount, and any in-flight
HTLC value.
2022-05-19 14:25:22 -05:00
Jeffrey Czyz
435a325d02
Use correct penalty and CLTV delta in route hints
For route hints, the aggregate next hops path penalty and CLTV delta
should be computed after considering each hop rather than before.
Otherwise, these aggregate values will include values from the current
hop, too.
2022-05-19 14:25:22 -05:00
Jeffrey Czyz
a190aed88a
Use the correct amount when scoring route hints
When scoring route hints, the amount passed to the scorer should include
any fees needed for subsequent hops. This worked correctly for single-
hop hints since there are no further hops, but not for multi-hint hops
(except the final one).
2022-05-19 14:25:22 -05:00
Jeffrey Czyz
22ce7d89d7
Distinguish maximum HTLC from effective capacity
Using EffectiveCapacity in scoring gives more accurate success
probabilities when the maximum HTLC value is less than the channel
capacity. Change EffectiveCapacity to prefer the channel's capacity
over its maximum HTLC limit, but still use the latter for route finding.
2022-05-19 14:25:22 -05:00
Jeffrey Czyz
0a318f4cf8
PathBuildingHop::value_contribution_msat in Debug 2022-05-19 12:47:45 -05:00
Matt Corallo
36817e0539
Merge pull request #1476 from tnull/2022-05-maximum-path-length
Consider maximum path length during path finding.
2022-05-18 19:22:42 +00:00
Elias Rohrer
87c9684c53 Consider maximum path length during path finding. 2022-05-18 19:20:00 +02:00
KaFai Choi
10f9795149
move Time trait from scoring mod to util::time and set it visibile within crate 2022-05-14 09:52:59 +07:00
Jeffrey Czyz
65920818db
Merge pull request #1389 from lightning-signer/2022-03-bitcoin
Update bitcoin crate to 0.28.1
2022-05-05 14:08:16 -05:00
Devrandom
28d33ff9e0 bitcoin crate 0.28.1 2022-05-05 18:04:42 +02:00
Jeffrey Czyz
23240125b9
Merge pull request #1416 from jurvis/jurvis/persist-scorer
Add utils to persist scorer in BackgroundProcessor
2022-05-04 08:28:06 -05:00
Jurvis Tan
5eeb254b82
Add utils to persist scorer in BackgroundProcessor
move last_prune_call back
2022-05-03 15:28:10 -07:00
Matt Corallo
75c3df018c Provide a utility to log the ProbabilisticScorer's contents
I wrote this when debugging a user's scorer and figured it may be
useful upstream.
2022-05-02 20:00:44 +00:00
Matt Corallo
62edee5689
Merge pull request #1435 from TheBlueMatt/2022-04-1126-first-step 2022-04-28 02:43:04 +00:00
valentinewallace
df1c4ee150
Merge pull request #1405 from TheBlueMatt/2022-04-log-scoring
Log as channel liquidities are/not updated in ProbabilisticScorer
2022-04-27 12:34:08 -04:00
Matt Corallo
6e298ff30d Explicitly log a warning when a payment failed on the first hop 2022-04-27 00:42:08 +00:00
Matt Corallo
1af705579b Separate ChannelDetails' outbound capacity from the next HTLC max
`ChannelDetails::outbound_capacity_msat` describes the total amount
available for sending across several HTLCs, basically just our
balance minus the reserve value maintained by our counterparty.
However, when routing we use it to guess the maximum amount we can
send in a single additional HTLC, which it is not.

There are numerous reasons why our balance may not match the amount
we can send in a single HTLC, whether the HTLC in-flight limit, the
channe's HTLC maximum, or our feerate buffer.

This commit splits the `outbound_capacity_msat` field into two -
`outbound_capacity_msat` and `outbound_htlc_limit_msat`, setting us
up for correctly handling our next-HTLC-limit in the future.

This also addresses the first of the reasons why the values may
not match - the max-in-flight limit. The inaccuracy is ultimately
tracked as #1126.
2022-04-25 15:04:21 +00:00
Viktor Tigerström
63f0a31b59 Add outbound min/max to ChannelCounterparty 2022-04-21 12:27:51 +02:00
Viktor Tigerström
6644ef138d Add inbound htlc min/max to ChannelDetails 2022-04-19 23:54:55 +02:00
Jeffrey Czyz
e0b9b748d6
Merge pull request #1414 from ViktorTigerstrom/2022-04-default-to-tlv-onions
Default to BOLT 4 tlv payload format onions
2022-04-18 13:09:55 -07:00
Viktor Tigerström
c72ae67768 Add tests for defaulting to creating tlv onions 2022-04-16 01:35:32 +02:00
Matt Corallo
e6c702f786 Log as channel liquidities are/not updated in ProbabilisticScorer 2022-04-15 17:06:58 +00:00
Matt Corallo
8baa4c1945 Add an (unused) Logger reference in ProbabilisticScorer 2022-04-15 17:06:58 +00:00
Viktor Tigerström
a316ef4596 Default to creating BOLT4 tlv payload format onions
Default to creating tlv onions for nodes for which we haven't received
any features through node announcements or which aren't in the
`network_graph`, and where no other features are known such as invoice
features nor features in the init msg for nodes we have channels to.
2022-04-14 23:04:51 +02:00
Matt Corallo
30e1922797 Lower-bound the log approximation and stop using it > ~98.5%
When we start getting a numerator and divisor particularly close to
each other, the log approximation starts to get very noisy. In
order to avoid applying scores that are basically noise (and can
range upwards of 2x the default per-hop penalty), simply consider
such cases as having a success probability of 100%.
2022-04-11 20:55:55 +00:00
Matt Corallo
4930af9b54 Expand the precision of our log10 lookup tables + add precision
When we send values over channels of rather substantial size, the
imprecision of our log lookup tables creates a rather substantial
non-linearity between values that round up or down one bit.

For example, with the default scoring values, sending 100k sats
over channels with 1m, 2m, 3m, and 4m sats of capacity score
rather drastically differently: 3645, 2512, 500, and 1442 msat.

Here we expand the precision of our log lookup tables rather
substantially by: (a) making the multiplier 2048 instead of 1024,
which still fits inside a u16, and (b) quadrupling the size of the
lookup table to look at the top 6 bits after the most-significant
bit of an input instead of the top 4.

This makes the scores of the same channels substantially more
linear, with values of 3613, 1977, 1474, and 1223 msat.

The same channels would be scored at 3611, 1972, 1464, and 1216
msat with a non-approximating scorer.
2022-04-10 21:29:33 +00:00
Matt Corallo
02bebee62e Add a test which demonstrates scores for some realistic payments 2022-04-03 21:18:15 +00:00
Matt Corallo
af318312c5
Merge pull request #1399 from jkczyz/2022-03-scoring-tweaks
ProbabilisticScorer improvements
2022-04-02 01:50:55 +00:00
Jeffrey Czyz
5425b2b77e
Add an amount penalty to ProbabilisticScorer
The cost of large payments tends to be dominated by the channel fees. To
avoid this, add an amount penalty to ProbabilisticScorer with a user
configurable multiplier. The multiplier is applied for every 2^20th of
the amount weighted by the negative log10 of the channel's success
probability for the payment.
2022-04-01 15:52:10 -05:00
Jeffrey Czyz
5337f89d8b
Avoid retrying over recently failed channels
In ProbabilisticScorer, the channel liquidity balance is reduced
whenever a payment fails at the corresponding channel. The payment may
still be retried through the channel, however, because the liquidity
penalty is capped. Use u64::max_value instead in this situation to avoid
retrying over the same path. This effectively makes u64::max_value the
penalty for amounts exceeding the upper bound, as well.

As an edge case, avoid using u64::max_value on attempts where the amount
is equal to the effective capacity, which may be the HTLC maximum when
the channel capacity is unknown.
2022-04-01 15:52:10 -05:00
Matt Corallo
8ddfe66046
Don't consider a path as having hit HTLC-min if it isn't sufficient
During the first pass of path finding, we seek a single path with the
exact payment amount, and only seek additional paths if (a) no single
path can carry the entire balance of the payment or (b) we found a good
path, but along the way we found candidate paths with the potential to
result in a lower total fee. This commit fixes the behavior of (b) -- we
were previously considering some paths to be candidates for a lower fee
when in fact they never would have worked. This caused us to re-run
Dijkstra's when it might not have been beneficial.
2022-03-31 21:36:22 -05:00
Jeffrey Czyz
f9cdf93da0
Select best route by lowest total cost
Selecting only by fees rather than cost (fees plus penalty) may result
in preferring higher cost routes over lower cost ones.
2022-03-31 21:36:18 -05:00
Jeffrey Czyz
30b6873d03
Correctly pick middle hop to victimize
For even-length paths, preferring a later hop avoids overly limiting the
possible paths on the next iteration.
2022-03-30 17:42:00 -05:00
Matt Corallo
7671ae5452
Merge pull request #1351 from TheBlueMatt/2022-03-scid-privacy
Implement the SCIDAlias Channel Type and provide SCID Privacy
2022-03-28 20:33:55 +00:00
Matt Corallo
b42ebd892b Expose chan type in Event::OpenChannelRequest & ChannelDetails
As we add new supported channel types, inbound channels which use
new features may cause backwards-compatibility issues for clients.
If a new channel is opened using new features while a client still
wishes to ensure support for downgrading to a previous version of
LDK, that new channel may cause the `ChannelManager` to fail
deserialization due to unsupported feature flags.

By exposing the channel type flags to the user in channel requests,
users wishing to support downgrading to previous versions of LDK
can reject channels which use channel features which previous
versions of LDK do not understand.
2022-03-27 17:12:17 +00:00
valentinewallace
eb68b5fe9d
Merge pull request #1375 from jkczyz/2022-03-scorer-followup
ProbabilisticScorer optimizations
2022-03-25 17:01:46 -04:00
Matt Corallo
77cab14a7a
Merge pull request #1382 from TheBlueMatt/2022-03-gossip-queries-sucks
Fix gossip using `gossip_timestamp_filter` instead of queries
2022-03-25 19:49:37 +00:00
Matt Corallo
1386a0c96b Fix gossip using gossip_timestamp_filter instead of queries
See large comment added for more details
2022-03-25 17:12:09 +00:00
Jeffrey Czyz
9596cc7110
Increase default liquidity_penalty_multiplier_msat
Using a larger multiplier gives more reasonable penalties for larger
success probabilities.
2022-03-25 11:31:04 -05:00
Jeffrey Czyz
c6348cb552
Move max penalty cap in ProbabilisticScorer
This reduce a branch in the 0 and u6::max_value cases.
2022-03-25 09:35:35 -05:00
Jeffrey Czyz
4ea18e3232
Fix overflow in ProbabilisticScorer
When a routing hint is given in an invoice, the effective capacity of
the channel is assumed to be infinite (i.e., u64::max_value) if the hop
is private. Adding 1 to this in the success probability calculation will
cause an overflow and ultimately an `index out of bounds panic` in
log10_times_1024. This was not an issue with using log10 because the use
of f64 would give infinite which casts to 0 for u64.
2022-03-25 09:16:22 -05:00
Jeffrey Czyz
5b36449c59
Add a base penalty to ProbabilisticScorer
ProbabilisticScorer tends to prefer longer routes to shorter ones. Make
the default scoring behavior include a customizable base penalty to
avoid longer routes.
2022-03-25 09:12:49 -05:00
Jeffrey Czyz
188f919a15
Don't serialize FixedPenaltyScorer parameters
Serializing scorer parameters makes it difficult to experiment with
different settings.
2022-03-25 08:53:19 -05:00
Matt Corallo
216225c00b
Merge pull request #1359 from tnull/2022-03-real-random-shuffle
Randomize candidate paths during route selection.
2022-03-24 23:13:12 +00:00
Matt Corallo
4e89e5741b
Merge pull request #1380 from TheBlueMatt/2022-03-skip-redundant-sig-checks
Skip `channel_update` signature checks if we have a newer state
2022-03-24 22:51:17 +00:00