Commit graph

2065 commits

Author SHA1 Message Date
Viktor Tigerström
b852df5276 Remove redundant hashmap lookups
Avoid doing the same hashmap lookups twice in a row, when it's not
needed. Refactor `claim_funds_from_hop` in order to enable this change.
2023-02-14 15:03:26 +01:00
wpaulino
be4bb58573
Merge pull request #1980 from TheBlueMatt/2023-01-async-utxo-lookups 2023-02-10 19:57:11 -08:00
Matt Corallo
90bb3f9075
Merge pull request #2019 from tnull/2023-02-expose-peer-addrs
Expose peer addresses in `PeerManager`
2023-02-10 21:20:36 +00:00
Elias Rohrer
36e0cffc8b
Test get_peer_nodeids returns peer addresses 2023-02-10 11:31:10 -06:00
Elias Rohrer
2e8f73e52d
Expose peer addresses via get_peer_node_ids 2023-02-10 11:01:55 -06:00
Daniel Granhão
dab08c1135
Fix out-of-date create_inbound_payment() docs 2023-02-10 16:09:24 +00:00
Matt Corallo
34b0f2556d Suggest a socket read buffer of 4KiB to limit message count
...and switch the same in `lightning-net-tokio`
2023-02-09 15:40:43 +00:00
Matt Corallo
c21480f7d3 Don't apply gossip backpressure to non-channel-announcing peers
When we apply the new gossip-async-check backpressure on peer
connections, if a peer has never sent us a `channel_announcement`
at all, we really shouldn't delay reading their messages.

This does so by tracking, on a per-peer basis, whether they've sent
us a channel_announcement, and resetting that state whenever we're
not backlogged.
2023-02-09 15:40:43 +00:00
Matt Corallo
00a70c25f9 Apply backpressure when we have too many gossip checks in-flight
Now that the `RoutingMessageHandler` can signal that it needs to
apply message backpressure, we implement it here in the
`PeerManager`. There's not much complicated here, aside from noting
that we need to add the ability to call `send_data` with no data
to indicate that reading should resume (and track when we may need
to make such calls when updating the routing-backpressure state).
2023-02-09 15:40:43 +00:00
Matt Corallo
02b187856b Allow RoutingMessageHandler to signal backpressure
Now that we allow `handle_channel_announcement` to (indirectly)
spawn async tasks which will complete later, we have to ensure it
can apply backpressure all the way up to the TCP socket to ensure
we don't end up with too many buffers allocated for UTXO
validation.

We do this by adding a new method to `RoutingMessageHandler` which
allows it to signal if there are "many" checks pending and
`channel_announcement` messages should be delayed. The actual
`PeerManager` implementation thereof is done in the next commit.
2023-02-09 15:40:43 +00:00
Matt Corallo
41e6eba201 Add the ability to broadcast gossip msgs via the event pipeline
When we process gossip messages asynchronously we may find that we
want to forward a gossip message to a peer after we've returned
from the existing `handle_*` method. In order to do so, we need to
be able to send arbitrary loose gossip messages back to the
`PeerManager` via `MessageSendEvent`.

This commit modifies `MessageSendEvent` in order to support this.
2023-02-08 23:54:30 +00:00
Alec Chen
4c1055d4ad Cache NodeId by converting their_node_id to tuple
This is done to avoid redundantly serializing peer node
ids when forwarding gossip messages in
`PeerManager::forward_broadcast_msg`.
2023-02-08 11:56:58 -06:00
Matt Corallo
56146e740f
Merge pull request #2016 from alecchendev/2023-02-gossip-msg-pubkey-to-nodeid
Swap gossip message `PublicKey` for `NodeId`
2023-02-07 20:18:19 +00:00
Alec Chen
b156371d45 Swap PublicKey for NodeId in UnsignedNodeAnnouncement
Also swaps `PublicKey` for `NodeId` in `get_next_node_announcement`
and `InitSyncTracker` to avoid unnecessary deserialization that came
from changing `UnsignedNodeAnnouncement`.
2023-02-07 10:52:20 -06:00
Alec Chen
1fd95496d1 Swap PublicKey for NodeId in UnsignedChannelAnnouncement
Adds the macro `get_pubkey_from_node_id`
to parse `PublicKey`s back from `NodeId`s for signature
verification, as well as `make_funding_redeemscript_from_slices`
to avoid parsing back and forth between types.
2023-02-07 10:51:54 -06:00
Valentine Wallace
f78448c604
Expand ChannelManager::send_spontaneous_payment_with_retry docs 2023-02-06 16:30:51 -05:00
Viktor Tigerström
1a5482a8bb Don't pass per_peer_state to claim_funds_from_hop 2023-02-04 20:49:41 +02:00
Matt Corallo
9033b43873 Track if a peer is connected or not in ChannelManager 2023-02-04 20:49:25 +02:00
Matt Corallo
760ab65dbd
Merge pull request #1873 from jurvis/jurvis/2022-11-expose-pending-payments
Expose pending payments through `ChannelManager`
2023-02-03 19:16:02 +00:00
valentinewallace
b77f03e520
Merge pull request #2002 from valentinewallace/2023-01-keysend-retries
Support auto-retrying keysend payments in `ChannelManager`
2023-02-03 14:09:00 -05:00
Matt Corallo
a7293fded9
Merge pull request #1996 from valentinewallace/2023-01-migrate-payment-scoring
Score payment paths from events in `BackgroundProcessor`
2023-02-03 18:44:13 +00:00
jurvis
c98f80dfae
Expose pending payments through ChannelManager
Adds a new method, `list_recent_payments ` to `ChannelManager` that
returns an array of `RecentPaymentDetails` containing the payment
status (Fulfilled/Retryable/Abandoned) and its total amount across all
paths.
2023-02-03 10:16:10 -08:00
Valentine Wallace
2f9c3e5ea1
Score payment paths in BackgroundProcessor 2023-02-03 11:25:20 -05:00
Valentine Wallace
9f01092eae
Spontaneous payments: make preimage construction more concise 2023-02-03 10:44:31 -05:00
Valentine Wallace
6b49af1563
Support spontaneous payment retries in ChannelManager 2023-02-02 19:30:25 -05:00
Valentine Wallace
c863350507
Store keysend preimage in outbound payments
This sets us up for spontaneous payment retries in ChannelManager.

Currently, retrying spontaneous payments is broken in InvoicePayer because it
does not include the keysend preimage on retry.
2023-02-02 19:30:22 -05:00
Matt Corallo
2a72f4f98c
Merge pull request #1994 from TheBlueMatt/2023-01-1916-followups
1916 Followups Part 1
2023-02-02 23:05:07 +00:00
Matt Corallo
076560062b Reduce the code in the commitment_signed_dance macro
This should marginally reduce compile times for the tests by
reducing the total volume of code across the tests in the lightning
crate.
2023-02-01 21:16:18 +00:00
Matt Corallo
071297234a Use only the failed amount when retrying payments, not the full amt
When we landed the initial in-`ChannelManager` payment retries, we
stored the `RouteParameters` in the payment info, and then re-use
it as-is for new payments. `RouteParameters` is intended to store
the information specific to the *route*, `PaymentParameters` exists
to store information specific to a payment.

Worse, because we don't recalculate the amount stored in the
`RouteParameters` before fetching a new route with it, we end up
attempting to retry the full payment amount, rather than only the
failed part.

This issue brought to you by having redundant data in
datastructures, part 5,001.
2023-02-01 21:16:18 +00:00
Matt Corallo
8af05e0172 Move retry-limiting to retry_payment_with_route
The documentation for `Retry` is very clear that it counts the
number of failed paths, not discrete retries. When we added
retries internally in `ChannelManager`, we switched to counting
the number if discrete retries, even if multiple paths failed and
were replace with multiple MPP HTLCs.

Because we are now rewriting retries, we take this opportunity to
reduce the places where retries are analyzed, specifically a good
chunk of code is removed from `pay_internal`.

Because we now retry multiple failed paths with one single retry,
we keep the new behavior, updating the docs on `Retry` to describe
the new behavior.
2023-02-01 21:16:18 +00:00
Matt Corallo
ddde63ee12 Log more information when retrying a payment attempt fails 2023-02-01 21:16:18 +00:00
Matt Corallo
5ce4bfc1f6 Test the RouteParameters passed to TestRouter
`TestRouter` allows us to simply select the `Route` that will be
returned in the next `find_route` call, but it does so without any
checking of what was *requested* for the call. This makes it a
somewhat dubious test utility as it very helpfully ensures we
ignore errors in the routes we're looking for.

Instead, we require users of `TestRouter` pass a `RouteParameters`
to `expect_find_route`, which we compare against the requested
parameters passed to `find_route`.
2023-02-01 21:16:18 +00:00
Matt Corallo
2b135578e8 Use the PaymentParameter final CLTV delta over RouteParameters
`PaymentParams` is all about the parameters for a payment, i.e. the
parameters which are static across all the paths of a paymet.
`RouteParameters` is about the information specific to a given
`Route` (i.e. a set of paths, among multiple potential sets of
paths for a payment). The CLTV delta thus doesn't belong in
`RouterParameters` but instead in `PaymentParameters`.

Worse, because `RouteParameters` is built from the information in
the last hops of a `Route`, when we deliberately inflate the CLTV
delta in path-finding, retries of the payment will have the final
CLTV delta double-inflated as it inflates starting from the final
CLTV delta used in the last attempt.

When we calculate the `final_cltv_expiry_delta` to put in the
`RouteParameters` returned via events after a payment failure, we
should re-use the new one in the `PaymentParameters`, rather than
the one that was in the route itself.
2023-02-01 21:16:18 +00:00
Matt Corallo
fbc08477e8 Move the final CLTV delta to PaymentParameters from RouteParams
`PaymentParams` is all about the parameters for a payment, i.e. the
parameters which are static across all the paths of a paymet.
`RouteParameters` is about the information specific to a given
`Route` (i.e. a set of paths, among multiple potential sets of
paths for a payment). The CLTV delta thus doesn't belong in
`RouterParameters` but instead in `PaymentParameters`.

Worse, because `RouteParameters` is built from the information in
the last hops of a `Route`, when we deliberately inflate the CLTV
delta in path-finding, retries of the payment will have the final
CLTV delta double-inflated as it inflates starting from the final
CLTV delta used in the last attempt.

By moving the CLTV delta to `PaymentParameters` we avoid this
issue, leaving only the sought amount in the `RouteParameters`.
2023-02-01 17:50:24 +00:00
Elias Rohrer
041c3e615f
Return only Some(block_hash) in CM rel. txids
As of now the `Confirm::get_relevant_txids()` docs state that it won't
return any transactions for which we hadn't previously seen a
confirmation. To align its functionality a bit more with the docs, at
least for `ChannelManager`, we only return values for which we had
registered a confirmation block hash before.
2023-01-31 17:07:31 -06:00
Valentine Wallace
d2bf4078e4
Expose Retry enum from channelmanager module 2023-01-31 15:28:49 -05:00
Matt Corallo
d4de913ae7
Merge pull request #1974 from danielgranhao/speed-up-secure-random-byte-gen 2023-01-26 23:13:06 +00:00
Daniel Granhão
f19821dac4
Use Chacha20 in get_secure_random_bytes() 2023-01-26 20:58:00 +00:00
Matt Corallo
9b40e8f14e Remove stale comment in test
This should have been done in 7dcbf2cd1c
but was not.
2023-01-26 17:39:55 +00:00
Matt Corallo
8bc3428d5b
Merge pull request #1984 from TheBlueMatt/2023-01-test-robust
Make `test_duplicate_payment_hash_one_failure_one_success` robust
2023-01-26 04:02:31 +00:00
valentinewallace
e2beaef41e
Merge pull request #1916 from valentinewallace/2022-11-chanman-payment-retries
`ChannelManager` Payment Retries
2023-01-25 21:09:13 -05:00
Matt Corallo
7dcbf2cd1c Make test_duplicate_payment_hash_one_failure_one_success robust
`test_duplicate_payment_hash_one_failure_one_success` currently
fails if the "wrong" HTLC is picked to be claimed. Given the HTLCs
are identical, there's no way to figure out which we should claim.
The test instead relies on a magic value - the first one is the
right one....unless we change our CSPRNG implementation. When we
try to do so, the test randomly fails.

Here we change one HTLC to a lower amount so we can figure out
which transaction to broadcast to make the test robust against
CSPRNG changes.
2023-01-26 01:59:21 +00:00
Matt Corallo
abbd295157
Merge pull request #1948 from alecchendev/custom-fail-back-err
Allow specifying an error when failing back HTLC
2023-01-25 23:24:49 +00:00
Alec Chen
48aef2da9e Add test_fail_htlc_backwards_with_reason
Add a test for newly added function failing back a basic payment
and ensuring the intended failure code and data are sent back
to the peer.
2023-01-25 15:36:04 -06:00
Alec Chen
95892e37da Add FailureCode enum and ChannelManager::fail_htlc_backwards_with_reason
FailureCode is used to specify which error code and data to send
to peers when failing back an HTLC.

ChannelManager::fail_htlc_backwards_with_reason
allows a user to specify the error code and
corresponding data to send to peers when failing back an HTLC.
This function is mentioned in Event::PaymentClaimable docs.
ChannelManager::get_htlc_fail_reason_from_failure_code was also
added to assist with this function.
2023-01-25 15:35:59 -06:00
Valentine Wallace
6d819796f2
Disambiguate send_payment_internal from pay_internal 2023-01-25 14:44:10 -05:00
Valentine Wallace
ad486a4596
Payment retries: copy tests from InvoicePayer
As part of migrating payment retries from InvoicePayer to ChannelManager,
several tests don't need a rewrite and can be pretty much copied and pasted.
2023-01-25 14:44:10 -05:00
Valentine Wallace
2f49c8170c
Test ChannelManager automatic retries 2023-01-25 14:44:10 -05:00
Valentine Wallace
acf9292d58
Support sending payments with a retry strategy in ChannelManager 2023-01-25 14:44:10 -05:00
Valentine Wallace
d776dee3a5
Retry HTLCs in process_pending_htlc_forwards 2023-01-25 14:44:07 -05:00