Commit graph

534 commits

Author SHA1 Message Date
Matt Corallo
2bd2637b7e Store a HistoricalMinMaxBuckets in DirectedChannelLiquidity
This removes the need to reconstruct the struct in a number of
places by simply creating it up front.
2023-08-23 21:15:11 +00:00
Matt Corallo
2a1dff4c10 Move the bucketed history tracking logic into a scoring submodule 2023-08-23 21:15:11 +00:00
Matt Corallo
534d7317cf Expose the historical success probability calculation itself
In 3f32f60ae7 we exposed the
historical success probability buckets directly, with a long method
doc explaining how to use it. While this is great for logging
exactly what the internal model thinks, its also helpful to let
users know what the internal model thinks the success probability
is directly, allowing them to compare route success probabilities.

Here we do so but only for the historical tracking buckets.
2023-08-23 21:15:11 +00:00
Matt Corallo
568731008e Find payment bucket in calculate_success_probability_times_billion
This simply moves code which will simplify the next commit
somewhat.
2023-08-23 21:15:11 +00:00
Matt Corallo
c4947acaec Correctly apply penalty bounds on the per-amount penalties
When we attempt to score a channel which has a success probability
very low, we may have a log well above our cut-off of two. For the
liquidity penalties this works great, we bound it by
`NEGATIVE_LOG10_UPPER_BOUND` and `min` the two scores. For the
amount liquidity penalty we didn't do any `min`ing at all.

This fix is to min the log itself first and then reuse the min'd
log in both calculations.
2023-08-23 21:15:11 +00:00
Matt Corallo
86976e0003 Don't rely on calculate_success_probability* to handle amt > cap
Currently we let an `htlc_amount >= channel_capacity` pass through
from `penalty_msat` to
`calculate_success_probability_times_billion`, but only if its only
marginally bigger (less than 65/64ths). This is fine as
`calculate_success_probability_times_billion` handles bogus values
just fine (it will always return a zero probability in such cases).

However, this is risky, and in fact breaks in the coming commits,
so instead check it before ever calling through to the historical
bucket probability calculations.
2023-08-23 21:15:11 +00:00
Matt Corallo
1701b02124 Replace std's unmaintained bench with criterion
Rather than using the std benchmark framework (which isn't
maintained and is unlikely to get any further maintenance), we swap
for criterion, which at least gets us a variable number of test
runs so our benchmarks don't take forever.

We also fix the RGS benchmark to pass now that the file in use is
stale compared to today's date.
2023-05-11 06:11:49 +00:00
Matt Corallo
2775902f3a Add an additional test/bench for routing larger amounts, score more
When benchmarking our router, we previously only ever tested with
amounts under 1,000 sats, which is an incredibly small amount.
While this ensures we have the maximal number of available channels
to consider, it prevents our scorer from getting exercise across
its range. Further, we only score the immediate path we are
expecting to to send over, and not randomly but rather based on the
amount sent.

Here we try to make the benchmarks a bit more realistic by adding
a new benchmark which attempts to send around 100K sats, which is
a reasonable amount to send over a channel today. We also convert
the scoring data to be randomized based on the seed as well as
attempt to (possibly) find a new route for a much larger value and
score based on that. This potentially allows us to score multiple
potential paths between the source and destination as the large
route-find may return an MPP result.
2023-05-11 05:49:17 +00:00
Matt Corallo
fbaa3c4855 Unify route benchmarking with route tests
There's a few route tests which do the same thing as the benchmarks
as they're also a good test. However, they didn't share code, which
is somewhat wasteful, so we fix that here.
2023-05-11 05:42:21 +00:00
Matt Corallo
e61b128967
Merge pull request #2237 from henghonglee/issue-2189-score-params
[#2189] Score Fee Params as a passed in parameter
2023-05-11 05:27:14 +00:00
henghonglee
86af670afa Move functions around to colocate impl of FeeParams and DecayParams 2023-05-10 15:32:29 -07:00
henghonglee
21b0818be7 Score's FeeParams as passed-in params 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.
2023-05-10 12:53:42 -07:00
Wilmer Paulino
7b64527b16
Merge pull request #2279 from benthecarman/ord-invoice
Impl PartialOrd and Ord for Invoice
2023-05-10 11:24:00 -07:00
benthecarman
2ddce64ba6
Impl PartialOrd and Ord for Invoice 2023-05-09 12:39:17 -05:00
Matt Corallo
0ecb4b093a
Merge pull request #2258 from valentinewallace/2023-04-blinded-pathfinding-groundwork-2
Prefactor `PaymentParameters` for blinded recipients
2023-05-08 23:17:42 +00:00
Valentine Wallace
d56672c11d
Move final_cltv_expiry_delta from PaymentParams to Payee::Clear
Since blinded pay params won't have this value.
2023-05-08 18:01:43 -04:00
Valentine Wallace
746f25aed0
Add BOLT 12 features to PaymentParams 2023-05-08 18:01:43 -04:00
Valentine Wallace
91dc76721b
Move BOLT11 features from top level PaymentParams to Payee::Clear
Since blinded payees don't have this.
2023-05-08 18:01:43 -04:00
Valentine Wallace
6d62b62cec
Error if BOLT 11 features are provided for blinded payment params 2023-05-08 18:01:43 -04:00
Valentine Wallace
7f49f6bf4d
Move payee node id from top level PaymentParams to Payee::Clear
Since blinded payees don't have one
2023-05-08 18:01:41 -04:00
Valentine Wallace
cea78f585a
Error if clear hints are provided for blinded PaymentParams 2023-05-04 10:50:53 -04:00
Valentine Wallace
06eeefc5e7
Groundwork for refactoring PaymentParams::Hints to ::Payee
Minor changes in preparation for supporting route blinding in
PaymentParameters. In the next commit, we'll be moving more
unblinded-payee-specific fields from the top level parameters into the clear
enum variant.
2023-05-04 10:31:56 -04:00
Arik Sosman
6cb9919f0c
Move keysinterface.rs to a directory-level module called sign. 2023-05-02 21:48:08 -07:00
Wilmer Paulino
41e94f9404
Merge pull request #2239 from valentinewallace/2023-04-remove-redundant-final-cltv-param
Remove redundant `final_cltv_delta` param from `get_route`
2023-04-28 10:46:51 -07:00
Valentine Wallace
cae41c17ee
Remove redundant final_cltv_delta param from get_route
PaymentParameters already includes this value.

This set us up to better support route blinding, since there is no known
final_cltv_delta when paying to a blinded route.
2023-04-27 17:09:19 -04:00
Fred Walker
bd962fc2eb
Check chain hash for channel announcement and update 2023-04-26 08:58:05 -04:00
Matt Corallo
c1825672ed
Merge pull request #2222 from benthecarman/pub-utxo-resolver 2023-04-25 02:01:06 +00:00
Matt Corallo
c89fd38f2a
Merge pull request #2220 from TheBlueMatt/2023-04-dont-ban-cln
Don't remove nodes if there's no channel_update for a temp failure
2023-04-24 21:15:08 +00:00
benthecarman
09e29c86db
Add function for updating network graph with announcement with no UTXO resolver 2023-04-24 14:10:25 -05:00
Matt Corallo
67ad6c40f0 Don't remove nodes if there's no channel_update for a temp failure
Previously, we were requiring any `UPDATE` onion errors to include
a `channel_update`, as the spec mandates[1]. If we see an onion
error which is missing one we treat it as a misbehaving node that
isn't behaving according to the spec and simply remove the node.

Sadly, it appears at least some versions of CLN are such nodes, and
opt to not include `channel_update` at all if they're returning a
`temporary_channel_failure`. This causes us to completely remove
CLN nodes from our graph after they fail to forward our HTLC.

While CLN is violating the spec here, there's not a lot of reason
to not allow it, so we go ahead and do so here, treating it simply
as any other failure by letting the scorer handle it.

[1] The spec says `Please note that the channel_update field is
mandatory in messages whose failure_code includes the UPDATE flag`
however doesn't repeat it in the requirements section so its not
crazy that someone missed it when implementing.
2023-04-24 18:52:05 +00:00
Valentine Wallace
5a6f9b0028
Account for Path::blinded_tail when adding a shadow cltv offset 2023-04-21 15:35:08 -04:00
Valentine Wallace
976411d984
Test scoring paths with blinded tails 2023-04-21 15:35:08 -04:00
Valentine Wallace
dac4a1cf1c
Account for Path::blinded_tail in InflightHtlcs::process_path 2023-04-21 15:35:08 -04:00
Valentine Wallace
c8fd77de25
Support (de)serializing Path::blinded_tails in Routes 2023-04-21 15:35:07 -04:00
Valentine Wallace
64c26c8a79
Add blinded path {metadata} fields to Path, but disallow paying blinded paths for now 2023-04-21 15:35:04 -04:00
Valentine Wallace
d5b05e54c3
Replace Vec<RouteHop> with new Path struct
This lays groundwork for adding blinded path info to Path
2023-04-21 11:48:27 -04:00
Valentine Wallace
93afed56e8
Add utilities for getting a path's final value and cltv delta 2023-04-21 11:48:27 -04:00
Valentine Wallace
b5827f77ad
Minor Route/RouteHop doc updates 2023-04-21 11:48:24 -04:00
Valentine Wallace
ed4348f08a
Update PaymentParameters::route_hints for blinded paths 2023-04-20 10:14:17 -04:00
Matt Corallo
accfdae541
Merge pull request #2180 from benthecarman/impl-pk-to-node-id
Implement to and from for PublicKey and NodeId
2023-04-14 14:56:51 +00:00
benthecarman
7a37e2cd23
Impl FromStr for NodeId 2023-04-13 14:53:23 -05:00
benthecarman
f78e6b956c
Use NodeAlias type in NodeAnnouncement 2023-04-13 13:09:03 -05:00
benthecarman
5ed6732b87
Implement to and from for PublicKey and NodeId 2023-04-13 12:59:42 -05:00
Matt Corallo
2d4bf974e5
Merge pull request #2083 from wpaulino/events-module
Move events.rs into its own top-level module
2023-03-28 16:37:55 +00:00
Wilmer Paulino
ca9ca75f08
Move events.rs into its own top-level module
This is largely motivated by some follow-up work for anchors that will
introduce an event handler for `BumpTransaction` events, which we can
now include in this new top-level `events` module.
2023-03-22 11:49:33 -07:00
munjesi
b0bf50fa24 Replacing (C-not exported) in the docs 2023-03-22 14:30:36 +03:00
Matt Corallo
14ee173593
Merge pull request #2102 from douglaz/node_info_addresses
Remove NodeAnnouncementInfo addresses
2023-03-21 22:42:16 +00:00
Matt Corallo
ea15f0f448
Merge pull request #2100 from douglaz/docs_fixes
Docs improvements
2023-03-21 18:44:23 +00:00
Allan Douglas R. de Oliveira
6f5e5e3898 Remove redundant addresses field from NodeAnnouncementInfo
...replacing it with an acessor `addresses()`.

Besides removing a redundant data structure already present on inner
`NodeAnnouncement`, this change makes it possible to discover new address types
upon deserialization thanks to `UnsignedNodeAnnouncement`'s implementation.
2023-03-21 17:27:48 +00:00
Allan Douglas R. de Oliveira
963d6c4a51 Docs improvements 2023-03-21 14:11:13 +00:00