Commit graph

296 commits

Author SHA1 Message Date
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
Matt Corallo
63ca72e5b0 Skip channel_update signature checks if we have a newer state
`channel_update` messages already have their signatures checked
with the network graph write lock held, so there's no reason to
check the signatures before doing other quicker checks first,
including checking if we're already aware of a newer update for the
channel.

This reduces common-case CPU usage as `channel_update`s are sent
rather liberally over the p2p network to gossip them.
2022-03-24 17:21:30 +00:00
Elias Rohrer
ff7ec0c645 Minor refactor for sort / add, and some nits.
- `sort_by_key` to `sort_unstable_by_key`
- `checked_add() .. max_value()` to `saturating_add()`
- Some typos and nits
2022-03-24 09:12:44 -06:00
Elias Rohrer
b11dcf9ba8 Randomize candidate paths during route selection. 2022-03-24 09:12:26 -06:00
Matt Corallo
f6fa8e9c5b
Merge pull request #1370 from TheBlueMatt/2022-03-pref-first-hop-chans
Avoid needless MPP on multiple channels to the same first-hop
2022-03-23 22:44:37 +00:00
Matt Corallo
fcfd683312
Merge pull request #1360 from tnull/2022-03-loopless-random-walks
Avoid looping CLTV shadow routes.
2022-03-23 21:40:25 +00:00
Matt Corallo
b010aeb5f1
Merge pull request #1326 from Psycho-Pirate/peers
Added option to send remote IP to peers
2022-03-23 21:02:17 +00:00
Matt Corallo
b1bc07802e Avoid needless MPP on multiple channels to the same first-hop
When we have many channels to the same first-hop, many of which do
not have sufficient balance to make the requested payment, but when
some do, instead of simply using the available channel balance we
may switch to MPP, potentially with many, many paths.

Instead, we should seek to use the smallest channel which can
easily handle the requested payment, which we do here by sorting
the first_hops in our router before beginning the graph search.

Note that the "real" fix for this should be to instead decide which
channel to use at HTLC-send time, as most other nodes do during
relay, but this provides a minimal fix without needing to do the
rather-large work of refactoring our HTLC send+relay pipelines.

Issues with overly-aggressive MPP on many channels were reported by
Cash App.
2022-03-23 21:01:49 +00:00
Elias Rohrer
11c3120309 Avoid looping CLTV shadow routes. 2022-03-23 12:21:48 -06:00
Matt Corallo
cb1d795559
Merge pull request #1374 from TheBlueMatt/2022-03-bindings-cleanups
Trivial Bindings Cleanups
2022-03-23 00:46:31 +00:00
psycho-pirate
20a81e5c14 added network address in methods, filter_address function with tests and updated documentation 2022-03-23 04:44:28 +05:30
Matt Corallo
5588f2fa5d Use impl<bounds> instead of a where clause to help bindings 2022-03-21 20:09:30 +00:00
Matt Corallo
3cca221f8b Send a gossip_timestamp_filter on connect to enable gossip sync
On connection, if our peer supports gossip queries, and we never
send a `gossip_timestamp_filter`, our peer is supposed to never
send us gossip outside of explicit queries. Thus, we'll end up
always having stale gossip information after the first few
connections we make to peers.

The solution is to send a dummy `gossip_timestamp_filter`
immediately after connecting to peers.
2022-03-17 22:18:33 +00:00