Commit graph

8384 commits

Author SHA1 Message Date
Valentine Wallace
c6f276887f
Outbound payments: pass session privs by reference
We need to stop passing this Vec by value for the next commit so we can pass it
to a different method.
2025-01-15 16:29:53 -05:00
Elias Rohrer
c835e8002d
Merge pull request #3521 from TheBlueMatt/2025-01-fix-pin
Fix fuzz CI failures
2025-01-13 19:48:31 +01:00
valentinewallace
5f68d71cbe
Merge pull request #3522 from TheBlueMatt/2025-01-overflow-cltv
Fix max-value overflows in `set_max_path_length`
2025-01-13 12:34:54 -05:00
Matt Corallo
3e88b327ef Fix max-value overflows in set_max_path_length
When either the amount or the `max_total_cltv_expiry_delta` are
set to max-value, `set_max_path_length` can trigger overflows in
`build_onion_payloads_callback`, leading to debug-panics.
2025-01-13 14:51:26 +00:00
Matt Corallo
5a771c3de7 Clean up fuzz test build to fix disk space usage fuzz CI failures 2025-01-13 13:07:34 +00:00
Elias Rohrer
f92c4dc780
Merge pull request #3524 from TheBlueMatt/2025-01-spurious-assert
Drop spurious debug assertion in sweeping logic
2025-01-13 09:24:48 +01:00
Matt Corallo
0282b0d963 Drop spurious debug assertion in sweeping logic
With the `Confirm` interface, transaction confirmations can come
in at any time, so asserting that a confirmation is more recent
than the last time we broadcasted a transaction can lead to
spurious assertion failures.
2025-01-11 17:39:50 +00:00
Matt Corallo
c25dfaffb2
Merge pull request #3520 from jkczyz/2025-01-bindings-payment-paths
Support `Bolt12Invoice::payment_paths` in bindings
2025-01-10 20:28:11 +00:00
Jeffrey Czyz
93d00b385d
Support Bolt12Invoice::payment_paths in bindings
Lack of bindings support was because the method used to return a slice
of tuples, it seems. Now that it returns &[BlindedPaymentPath], bindings
should be possible given that they can be generated for
Bolt12Invoice::message_paths.
2025-01-10 09:51:31 -06:00
Elias Rohrer
cb5bf96cca
Merge pull request #3518 from dunxen/2025-01-allow-unnecessary-map-or
ci: silence unnecessary_map_or lint as solution requires MSRV >= 1.70
2025-01-10 09:14:36 +01:00
Duncan Dean
ec579f0303
ci: silence unnecessary_map_or lint as solution requires MSRV >= 1.70
Rust 1.84.0 was recently released along with some new clippy lints, one
of which is `unnecessary_map_or`. Unfortunately this lint suggests using
`Option::is_some_and` as a fix, but this is only available in Rust
 version >= 1.70, while we still have an MSRV of 1.63. So we silence that
lint for now.

We'd still like our lint CI to use stable Rust so that we can benefit from
new lint checks which may be helpful and don't require an MSRV bump, but
sometimes new lints (like in this case) do.

See:
  https://rust-lang.github.io/rust-clippy/master/index.html#unnecessary_map_or
  https://doc.rust-lang.org/std/option/enum.Option.html#method.is_some_and
2025-01-10 08:02:12 +02:00
Matt Corallo
0282cfb29e
Merge pull request #3511 from cequals/amackillop/2024-12-30/add-debug-to-scorer-params
Add debug implementations for scoring parameters
2025-01-09 16:22:44 +00:00
dunxen
7c77daff85
Merge pull request #3498 from jkczyz/2024-12-combine-inbound-v2-phases
Combine `InboundV2Channel` and `OutboundV2Channel`
2025-01-09 11:56:25 +02:00
Jeffrey Czyz
d6637d7d04
Combine UnfundedInboundV2 and UnfundedOutboundV2
Now that InboundV2Channel and OutboundV2Channel have been combined into
a PendingV2Channel, only one ChannelPhase variant is needed.
2025-01-08 14:09:12 -06:00
Jeffrey Czyz
270c5ab7ab
Remove InteractivelyFunded trait
Now that InboundV2Channel and OutboundV2Channel have been combined into
a PendingV2Channel, the InteractivelyFunded trait is no longer needed.
2025-01-08 14:09:12 -06:00
Jeffrey Czyz
91ff6c1a32
Combine InboundV2Channel and OutboundV2Channel
Pending v2 channels will need to be broken up into separate phases for
constructing and signing the funding transaction. To avoid increasing
the number of phases, combine the InboundV2Channel and OutboundV2Channel
types so that the can be used in one phase. Whether the channel is
inbound or outbound can be inferred from the ChannelContext.
2025-01-08 14:08:55 -06:00
Austin Mackillop
48ceefdc03
Add debug implementations for scoring parameters
Derives Debug for
ProbabilisticScoringFeeParameters and
ProbabiliticScoringDecayParameters
2025-01-08 10:54:06 -05:00
Elias Rohrer
2c0066e1a5
Merge pull request #3508 from tnull/2025-01-fix-spammy-async-om-event-handling-logs-main
Fix overly spammy `TRACE` logging in async onion message event handling (main)
2025-01-08 12:29:10 +01:00
Elias Rohrer
262d789734
Merge pull request #3506 from tnull/2025-01-allow-upperase-hrp-main
Allow uppercase bech32 HRP (main)
2025-01-08 12:28:42 +01:00
Elias Rohrer
1c0e4635dd
Fix overly spammy TRACE logging in async onion message event handling
We recently introduced `TRACE`-level logging for event handling.
However, in onion messenger we'd now log (twice, actually) every time
`process_events_async` is called, which is very very spammy. Here we fix
this by short-cutting to only proceed when we actualy have any event
futures to poll.
2025-01-07 15:54:54 +01:00
Elias Rohrer
7d653c2ffb
Add test coverage for upper-/mixed-case Offer encodings
.. to ensure we're able to decode all-uppercase HRPs and reject
mixed-case encodings.
2025-01-07 09:21:55 +01:00
Elias Rohrer
540bcf7b61
Allow uppercase bech32 HRP
Previously, we would fail parsing `Offer`s if the HRP didn't match our
expected (lowercase) HRP. Here, we relax this check in accordance with
the spec to also allow all-uppercase HRPs.
2025-01-07 09:21:55 +01:00
Matt Corallo
85d1e5f0fb
Merge pull request #3501 from contrun/simply-some-code 2024-12-24 00:44:01 +00:00
YI
988e5aad83 Simplify some code channel.rs 2024-12-23 18:01:46 +08:00
Matt Corallo
463e432e92
Merge pull request #3495 from TheBlueMatt/2024-12-optimal-score-params
Tweak historical scoring model PDF and default penalties
2024-12-20 18:47:26 +00:00
Matt Corallo
adb0afc523 Raise bucket weights to the power four in the historical model
Utilizing the results of probes sent once a minute to a random node
in the network for a random amount (within a reasonable range), we
were able to analyze the accuracy of our resulting success
probability estimation with various PDFs across the historical and
live-bounds models.

For each candidate PDF (as well as other parameters, including the
histogram bucket weight), we used the
`min_zero_implies_no_successes` fudge factor in
`success_probability` as well as a total probability multiple fudge
factor to get both the historical success model and the a priori
model to be neither too optimistic nor too pessimistic (as measured
by the relative log-loss between succeeding and failing hops in our
sample data).

We then compared the resulting log-loss for the historical success
model and selected the candidate PDF with the lowest log-loss,
skipping a few candidates with similar resulting log-loss but with
more extreme constants (such as a power of 11 with a higher
`min_zero_implies_no_successes` penalty).

Somewhat surprisingly (to me at least), the (fairly strongly)
preferred model was one where the bucket weights in the historical
histograms are exponentiated. In the current design, the weights
are effectively squared as we multiply the minimum- and maximum-
histogram buckets together before adding the weight*probabilities
together.

Here we multiply the weights yet again before addition. While the
simulation runs seemed to prefer a slightly stronger weight than
the 4th power we do here, the difference wasn't substantial
(log-loss 0.5058 to 0.4941), so we do the simpler single extra
multiply here.

Note that if we did this naively we'd run out of bits in our
arithmetic operations - we have 16-bit buckets, which when raised
to the 4th can fully fill a 64-bit int. Additionally, when looking
at the 0th min-bucket we occasionally add up to 32 weights together
before multiplying by the probability, requiring an additional five
bits.

Instead, we move to using floats during our histogram walks, which
further avoids some float -> int conversions because it allows for
retaining the floats we're already using to calculate probability.

Across the last handful of commits, the increased pessimism more
than makes up for the increased runtime complexity, leading to a
40-45% pathfinding speedup on a Xeon Silver 4116 and a 25-45%
speedup on a Xeon E5-2687W v3.

Thanks to @twood22 for being a sounding board and helping analyze
the resulting PDF.
2024-12-19 20:15:15 +00:00
Matt Corallo
85afe25e72 Split success_probability calculation into two separate methods
In the next commit we'll want to return floats or ints from
`success_probability` depending on the callsite, so instead of
duplicating the calculation logic, here we split the linear (which
always uses int math) and nonlinear (which always uses float math)
into separate methods, allowing us to write trivial
`success_probability` wrappers that return the desired type.
2024-12-19 20:15:14 +00:00
Matt Corallo
cd33ade75b Reduce the default default channel bounds half-life
Utilizing the results of probes sent once a minute to a random node
in the network for a random amount (within a reasonable range), we
were able to analyze the accuracy of our resulting success
probability estimation with various PDFs across the historical and
live-bounds models.

For each candidate PDF (as well as other parameters, to be tuned in
the coming commits), we used the `min_zero_implies_no_successes`
fudge factor in `success_probability` as well as a total
probability multiple fudge factor to get both the historical
success model and the a priori model to be neither too optimistic
nor too pessimistic (as measured by the relative log-loss between
succeeding and failing hops in our sample data).

Across the simulation runs, for a given PDF and other parameters,
we nearly always did better with a shorter half-life (even as short
as 1ms, i.e. only learning per-probe rather than across probes).
While this likely makes sense for nodes which do live probing, not
all nodes do, and thus we should avoid over-biasing on the dataset
we have.

While it may make sense to only learn per-payment and not across
payments, I can't fully rationalize this result and thus want to
avoid over-tuning, so here we reduce the half-life from 6 hours to
30 minutes.
2024-12-19 20:04:34 +00:00
Matt Corallo
6582f29f06 Skip calculation steps when the liquidity penalty multipliers are 0
If the liquidity penalty multipliers in the scoring config are both
0 (as is now the default), the corresponding liquiditiy penalties
will be 0. Thus, we should avoid doing the work to calculate them
if we're ultimately just gonna get a value of zero anyway, which we
do here.
2024-12-19 20:04:34 +00:00
Matt Corallo
e65900254e Update the default scoring parameters to use historical model only
Utilizing the results of probes sent once a minute to a random node
in the network for a random amount (within a reasonable range), we
were able to analyze the accuracy of our resulting success
probability estimation with various PDFs across the historical and
live-bounds models.

For each candidate PDF (as well as other parameters, to be tuned in
the coming commits), we used the `min_zero_implies_no_successes`
fudge factor in `success_probability` as well as a total
probability multiple fudge factor to get both the historical
success model and the a priori model to be neither too optimistic
nor too pessimistic (as measured by the relative log-loss between
succeeding and failing hops in our sample data).

We then compared the resulting log-loss for the historical success
model and selected the candidate PDF with the lowest log-loss,
skipping a few candidates with similar resulting log-loss but with
more extreme constants (such as a power of 11 with a higher
`min_zero_implies_no_successes` penalty).

In every case, the historical model performed substantially better
than the live-bounds model, so here we simply disable the
live-bounds model by default and use only the historical model.
Further, we use the calculated total probability multiple fudge
factor (0.7886892844179266) to choose the ratio between the
historical model and the per-hop penalty (as multiplying each hop's
probability by 78% is equivalent to adding a per-hop penalty of
log10(0.78) of our probabilistic penalty).

We take this opportunity to bump the penalties up a bit as well, as
anecdotally LDK users are willing to pay more than they do today to
get more successful paths.

Fixes #3040
2024-12-19 20:04:34 +00:00
Matt Corallo
e422ab207e Use a new PDF for our channel liquidity estimation when scoring
Utilizing the results of probes sent once a minute to a random node
in the network for a random amount (within a reasonable range), we
were able to analyze the accuracy of our resulting success
probability estimation with various PDFs.

For each candidate PDF (as well as other parameters, to be tuned in
the coming commits), we used the `min_zero_implies_no_successes`
fudge factor in `success_probability` as well as a total
probability multiple fudge factor to get both the historical
success model and the a priori model to be neither too optimistic
nor too pessimistic (as measured by the relative log-loss between
succeeding and failing hops in our sample data).

We then compared the resulting log-loss for the historical success
model and selected the candidate PDF with the lowest log-loss,
skipping a few candidates with similar resulting log-loss but with
more extreme constants (such as a power of 11 with a higher
`min_zero_implies_no_successes` penalty).

This resulted in a PDF of `128 * (1/256 + 9*(x - 0.5)^8)` with a
`min_zero_implies_no_successes` probability multiplier of 64/78.

Thanks to @twood22 for being a sounding board and helping analyze
the resulting PDF.
2024-12-19 20:00:52 +00:00
Matt Corallo
d414ba9128
Merge pull request #3493 from tnull/2024-12-3436-followup
Follow-ups to #3436
2024-12-19 16:25:01 +00:00
Elias Rohrer
dd91418463
Add notes to docs/README to indicate beta status of service-side
As a few things are missing (most importantly persistence), we add notes
that the service-side integration is currently considered 'beta'.
2024-12-19 17:12:09 +01:00
Elias Rohrer
6e06262935
Update best_block field in Confirm::best_block_updated
Previously, we wouldn't set the field as we aren't yet making use of it.
Here, we start setting the field. To this end, we make `best_block` an
`RwLock<Option<BestBlock>>` rather than `Option<RwLock<BestBlock>>`.
2024-12-18 10:12:53 +01:00
Elias Rohrer
8825fc387b
Drop disconnecting peers from the list of ignored peers
When a peer misbehaves/sends bogus data we reply with an error message
and insert it to the ignored list.

Here, we avoid having this list grow unboundedly over time by removing
peers again once they disconnect, allowing them a second chance upon
reconnection.
2024-12-18 09:54:05 +01:00
Matt Corallo
42cc4e7f4c
Merge pull request #3486 from TheBlueMatt/2024-12-async-sign
Remove the async_signing cfg flag
2024-12-17 19:41:50 +00:00
Matt Corallo
d2172e389c Update signer docs to describe which methods are async
We should update the return types on the signing methods here as
well, but we should at least start by documenting which methods are
async and which are not.

Once we complete async support for `get_per_commitment_point`, we
can change the return types as most things in the channel signing
traits will be finalized.
2024-12-17 18:36:39 +00:00
valentinewallace
0e6f47e23f
Merge pull request #3490 from TheBlueMatt/2024-12-nits
Fix fuzz deadlock
2024-12-17 13:29:15 -05:00
Matt Corallo
a91bf02b24 Fix validation of payment success in chanmon_consistency fuzzer
Prior to bcaba29f92, the
`chanmon_consistency` fuzzer checked that payments sent either
succeeded or failed as expected by looking at the `APIError` which
we received as a result of calling the send method.

bcaba29f92 removed the legacy send
method during fuzzing so attempted to replicate the old logic by
checking for events which contained the legacy `APIError` value.
While this was plenty thorough, it was somewhat brittle in that it
made expectations about the event state of a `ChannelManager` which
turned out to not be true.

Instead, here, we validate the send correctness by examining the
`RecentPaymentDetails` list from a `ChannelManager` immediately
after sending.
2024-12-17 15:37:43 +00:00
Elias Rohrer
4cb4d66e1b
Address doc nits
We address some minor mistakes that made it into the docs before.
2024-12-17 11:06:15 +01:00
Matt Corallo
177a6122e6 Correct route construction in chanmon_consistency fuzz
bcaba29f92 started returning
pre-built `Route`s from the router in the `chanmon_consistency`
fuzzer. In doing so, it didn't properly fill in the `route_parms`
field which is expected to match the requested parameters. This
causes a debug assertion when sending.

Here we fix this by setting the correct `route_params`.
2024-12-17 04:14:11 +00:00
Matt Corallo
351d414457 Fix deadlock in chanmon_consistency fuzzer
bcaba29f92 introduced a deadlock in
the `chanmon_consistency` fuzzer by holding a lock on the route
expectations before sending a payment, which ultimately tries to
lock the route expectations. Here we fix this deadlock.
2024-12-17 03:55:03 +00:00
Matt Corallo
54725ceee4 Marginally expand do_test_data_migration coverage
This marginally expands the test coverage in our persister
`do_test_data_migration` test.
2024-12-17 03:31:32 +00:00
Matt Corallo
dcc531ebed
Merge pull request #3481 from tnull/2024-12-add-kvstore-migration-ext
Add `MigratableKVStore` trait
2024-12-17 02:39:00 +00:00
Matt Corallo
6ad40f996a
Merge pull request #3436 from tnull/2024-12-add-lightning-liquidity-crate
Add `lightning-liquidity` crate to the workspace
2024-12-17 02:02:55 +00:00
Elias Rohrer
b0af39faaf
Add test for FilesystemStore-to-FilesystemStore migration 2024-12-16 20:07:57 +01:00
Elias Rohrer
4c1f6bdf34
Add migrate_kv_store_data util method
.. allowing to migrate data from one store to another.
2024-12-16 20:07:56 +01:00
Elias Rohrer
96f7bfda8c
Implement MigratableKVStore for FilesystemStore
We implement the new interface on `FilesystemStore`, in particular
`list_all_keys`.
2024-12-16 20:07:56 +01:00
Elias Rohrer
d69a5ee460
Prefactor: DRY up dir entry checks and key extraction to helper methods
.. which we'll be reusing shortly.
2024-12-16 20:07:56 +01:00
Matt Corallo
f53a09d6dc
Merge pull request #3485 from dunxen/2024-12-cfgflagdualfunding
Reintroduce cfg(dual_funding) for handling of open_channel2 messages
2024-12-16 17:51:14 +00:00