Commit graph

6114 commits

Author SHA1 Message Date
Jeffrey Czyz
80ae66ac17
Include a one-hop blinded path in Offer and Refund
While this doesn't add much privacy over not including any blinded
paths, it allows us to exercise code for receiving on blinded paths.
2023-10-18 18:33:14 -05:00
Jeffrey Czyz
7c6e62f423
Stateless offer and refund builder utilities
Add utility functions to ChannelManager for creating OfferBuilder,
and RefundBuilder such that derived keys are used for the signing
pubkey and payer id, respectively. This allows for stateless
verification of any InvoiceRequest and Invoice messages.

Later, blinded paths can be included in the returned builders.

Also tracks future payments using the given PaymentId such that the
corresponding Invoice is paid only once.
2023-10-18 18:33:14 -05:00
Jeffrey Czyz
11fb9c486b
Await for invoices using an absolute expiry
PendingOutboundPayment::AwaitingInvoice counts the number of timer ticks
that have passed awaiting a Bolt12Invoice for an InvoiceRequest. When a
constant INVOICE_REQUEST_TIMEOUT_TICKS has passed, the payment is
forgotten. However, this mechanism is insufficient for the Refund
scenario, where the Refund's expiration should be used instead.

Change AwaitingInvoice to store an absolute expiry instead. When
removing stale payments, pass the `SystemTime` in `std` and the highest
block time minus two hours in `no-std`.
2023-10-18 18:32:46 -05:00
Jeffrey Czyz
622f7f2f79
Remove outdated docs 2023-10-18 18:31:27 -05:00
Jeffrey Czyz
6dc42235ba
Allow sending onion messages to 1-hop blinded path
This allows for specifying the introduction node as the message
recipient.
2023-10-18 18:31:27 -05:00
Jeffrey Czyz
8b442fe4eb
Enqueue onion messages in handlers
When constructing onion messages to send initially (opposed to replying
to one from a handler), the user must construct an OnionMessagePath first
before calling OnionMessener::send_onion_message. Additionally, having a
reference to OnionMessener isn't always desirable. For instance, in an
upcoming commit, ChannelManager will implement OffersMessageHandler,
which OnionMessenger needs a reference to. If ChannelManager had a
reference to OnionMessenger, too, there would be a dependency cycle.

Instead, modify OffersMessageHandler and CustomOnionMessageHandler's
interfaces to include a method for releasing pending onion messages.
That way, ChannelManager may, for instance, construct and enqueue an
InvoiceRequest for sending without needing a reference to
OnionMessenger.

Additionally, OnionMessenger has responsibility for path finding just as
it does when replying to messages from a handler. It performs this when
extracting messages from the handlers before returning the next message
to send to a peer.
2023-10-18 18:31:16 -05:00
Jeffrey Czyz
840efd5334
Generalize CustomOnionMessageContents trait
Rename CustomOnionMessageContents to OnionMessageContents and use it as
a trait bound on messages passed to OnionMessenger methods. This allows
using the trait in an upcoming commit as a bound on the contents of
PendingOnionMessage.

Also, make ParsedOnionMessageContent implement OnionMessageContents so
that Payload can be bounded by OnionMessageContents directly, but used
when either reading a ParsedOnionMessageContent or writing a specific
type of OnionMessageContents (e.g., OffersMessage).
2023-10-18 18:15:05 -05:00
Jeffrey Czyz
94573dda33
Rename OnionMessageContents
In preparation for needing the name OnionMessageContents for a trait to
bound methods, rename it to ParsedOnionMessageContents. In the next
commit, it's use will be limited to reading only, and the new trait will
be a bound on method parameters instead.
2023-10-18 17:18:03 -05:00
Jeffrey Czyz
81c6147a9e
Generalize respond_with_onion_message
OnionMessenger can send onion message responses from its handlers using
respond_with_onion_message, which finds a path to the destination and
enqueues the response for sending. Generalize this as it can be used not
only for responses but for initial sends as well.
2023-10-18 17:09:27 -05:00
Jeffrey Czyz
cfe6b952a8
Import msgs::OnionMessage 2023-10-18 17:09:24 -05:00
Jeffrey Czyz
a4894bd3ca
Clean up onion messenger parameters and docs 2023-10-18 17:00:04 -05:00
Jeffrey Czyz
b78cb69de3
Avoid overloading introduction_node_id 2023-10-18 17:00:04 -05:00
Jeffrey Czyz
86e2b0059f
Remove OnionMessageProvider
OnionMessageProvider is a super-trait of OnionMessageHandler, but they
don't need to be used separately. Additionally, the former is misplaced
in the events module. Remove OnionMessageProvider and add it's only
method, next_onion_message_for_peer, into OnionMessageHandler.
2023-10-18 17:00:04 -05:00
Jeffrey Czyz
a6cd661712
Update OnionMessenger docs for Offers 2023-10-18 17:00:03 -05:00
Matt Corallo
0357cafbbb
Merge pull request #2663 from TheBlueMatt/2023-10-peer-race-send-discon
Fix race between outbound messages and peer disconnection
2023-10-18 21:54:57 +00:00
Matt Corallo
34f8dd9a49
Merge pull request #2658 from wpaulino/bogus-channel-reestablish
Send bogus ChannelReestablish for unknown channels
2023-10-18 21:47:31 +00:00
Matt Corallo
28602d9dd8
Merge pull request #2599 from Evanfeenstra/peel-onion
public static peel_onion method on OnionMessenger
2023-10-18 21:11:52 +00:00
Matt Corallo
4366369ef5 Fix race between outbound messages and peer disconnection
Previously, outbound messages held in `process_events` could race
with peer disconnection, allowing a message intended for a peer
before disconnection to be sent to the same peer after
disconnection.

The fix is simple - hold the peers read lock while we fetch
pending messages from peers (as we disconnect with the write lock).
2023-10-18 19:35:00 +00:00
Wilmer Paulino
ed38eac1a3
Release short_to_chan_info lock throughout forwarding_channel_not_found
Not doing so caused a lock order inversion between the locks
`ChannelManager::best_block` and `ChannelManager::short_to_chan_info`
after the addition of `test_trigger_lnd_force_close`.

It turns out that we were holding the `short_to_chan_info` for longer
than needed when processing HTLC forwards. We only need to acquire it to
quickly obtain channel info, and there aren't any other locks within
`forwarding_channel_not_found` that depend on it being held.
2023-10-18 11:25:27 -07:00
Wilmer Paulino
94e0ecec68
Disconnect peer when force closing a funded channel with an error
We do this to ensure that the counterparty will always broadcast their
latest state when we broadcast ours. Usually, they'll do this with the
`error` message alone, but if they don't receive it or ignore it, then
we'll force them to broadcast by sending them a bogus
`channel_reestablish` upon reconnecting. Note that this doesn't apply to
unfunded channels as there is no commitment transaction to broadcast.
2023-10-18 11:25:27 -07:00
Wilmer Paulino
9f7de472fb
Send bogus ChannelReestablish for unknown channels
Unfortunately, lnd doesn't force close on errors
(abb1e3463f/htlcswitch/link.go (L2119)).
One of the few ways to get an lnd counterparty to force close is by
replicating what they do when restoring static channel backups (SCBs).
They send an invalid `ChannelReestablish` with `0` commitment numbers
and an invalid `your_last_per_commitment_secret`.

Since we received a `ChannelReestablish` for a channel that doesn't
exist, we can assume it's likely the channel closed from our point of
view, but it remains open on the counterparty's side. By sending this
bogus `ChannelReestablish` message now as a response to theirs, we
trigger them to force close broadcasting their latest state. If the
closing transaction from our point of view remains unconfirmed, it'll
enter a race with the counterparty's to-be-broadcast latest commitment
transaction.
2023-10-18 11:25:25 -07:00
Evan Feenstra
fe6f166bca public static peel_onion method on OnionMessenger 2023-10-17 14:48:09 -07:00
valentinewallace
22a0bfc073
Merge pull request #2662 from jkczyz/2023-10-chain-hash
Use `ChainHash` instead of `BlockHash` as applicable
2023-10-17 11:05:45 -04:00
valentinewallace
5fdc770b46
Merge pull request #2665 from TheBlueMatt/2023-10-scanable-test-logs
Make test log lines somewhat more eye-scannable
2023-10-16 15:59:32 -04:00
Jeffrey Czyz
54f96ef944
Use ChainHash instead of BlockHash as applicable
ChainHash is more appropriate for places where an arbitrary BlockHash is
not desirable. This type was introduced in later versions of the bitcoin
crate, thus BlockHash was used instead.

Using ChainHash also makes it easier to check if ChannelManager is
compatible with an Offer.
2023-10-16 13:29:53 -05:00
Matt Corallo
b1d3aa86a4
Merge pull request #2664 from TheBlueMatt/2023-10-ci-disk-usage
Reduce disk usage in CI
2023-10-16 14:56:34 +00:00
Matt Corallo
c86cacd29d
Merge pull request #2625 from tnull/2023-09-moar-tests-n-fixes
Improve test coverage of #2575 router fixes
2023-10-15 20:18:56 +00:00
Matt Corallo
ab2117796d Make test log lines somewhat more eye-scannable
When running tests, our log output should be reasonably readable
by developers, but currently it repeats the module twice (via the
module and file name), and then starts the log line at a variable
location.

Instead, we only print the module and then align the start of the
log lines so that the output is much more scannable.
2023-10-15 20:04:35 +00:00
Matt Corallo
d186c683b9 Reduce disk usage in CI
Recently github appears to have reduced the available free disk
space in actions runs, causing CI to fail with out of space errors.
Here we simply run `cargo clean` a few times in CI to reduce our
disk usage somewhat.
2023-10-14 18:41:34 +00:00
Matt Corallo
2c51080449
Merge pull request #2655 from TheBlueMatt/2023-10-no-test-net
Replace `lightning-block-sync` test that depended on `foo.com`
2023-10-14 02:10:31 +00:00
valentinewallace
ded9080807
Merge pull request #2639 from vladimirfomene/fix-final-incorrect-cltv
Fix final incorrect cltv
2023-10-13 17:12:11 -04:00
Vladimir Fomene
33715e87d8
fix: use the update_add_htlc's cltv_expiry for comparison
As noted in BOLT 4, we should be using the update_add_htlc's cltv_expiry,
not the CLTV expiry set by the sender in the onion for this comparison.
See here: 4dcc377209/04-onion-routing.md (L334)
2023-10-13 14:05:21 +03:00
Matt Corallo
631f989fb5 Replace lightning-block-sync test that depended on foo.com
Our tests should generally not rely on internet access, and should
not rely on the behavior of any given remote server. However, one
of the `endpoint_tests` in `lightning-block-sync::http` relied on
`foo.com` resolving to a single socket address, which both might
change in the future and makes our tests fail without internet.
2023-10-13 02:52:15 +00:00
Matt Corallo
6cafba9f5b
Merge pull request #2650 from TheBlueMatt/2023-10-make-clippy-shut-up
Make clippy shut up about `PartialOrd` and `Ord` both impl'd
2023-10-12 20:44:46 +00:00
Matt Corallo
60c10735f9
Merge pull request #2657 from Fedeparma74/fix-close-channel-deadlock
Fix deadlock when closing an unavailable channel
2023-10-12 18:16:02 +00:00
Fedeparma74
7cdb31ae20 Fix deadlock when closing an unavailable channel 2023-10-11 10:50:28 +02:00
Elias Rohrer
989304ed36
Merge pull request #2652 from tnull/2023-10-deref-achannelmanager 2023-10-08 09:11:19 +02:00
valentinewallace
1f1a8dd5c5
Merge pull request #2651 from G8XSU/rm-same-feerate-log
Remove log for not changing feerate when it was equal
2023-10-06 13:18:32 -10:00
Matt Corallo
89749eddec
Merge pull request #2649 from benthecarman/display-outpoint
Impl Display for Outpoint
2023-10-06 19:00:01 +00:00
Elias Rohrer
808e72ad15
Have methods take AChannelManager as Deref::Target 2023-10-06 07:30:45 -10:00
benthecarman
42c5640d19
Impl Display for Outpoint 2023-10-05 22:45:29 -05:00
Gursharan Singh
2ee554a1c4
Remove log for not changing feerate when it was equal
Log is not required in this case and creates unnecessary log lines at
trace level.
2023-10-05 15:19:36 -10:00
Matt Corallo
ec7d665436 Make clippy shut up about PartialOrd and Ord both impl'd
Clippy gets mad that we have an implementation of `ParialOrd` and
`Ord` separately, even though both are identical. Making
`ParitalOrd` call `Ord` makes clippy shut up.
2023-10-06 00:02:45 +00:00
Matt Corallo
eea19de198
Merge pull request #2640 from sr-gi/20231003-expose-from-be-bytes
Makes Features::from_be_bytes public
2023-10-05 23:45:59 +00:00
Sergi Delgado Segura
2b1d6937a8 Makes Features::from_be_bytes public
Downstream projects building Feature<T> are most likely doing so with a
big-endian byte array, however only `from_le_bytes` is exposed.
2023-10-05 15:27:13 -04:00
Matt Corallo
9de51f0bee
Merge pull request #2645 from TheBlueMatt/2023-10-changelog-dates
Set the timestamp for and provide diff stats for 0.0.117 CHANGELOG
2023-10-04 02:16:04 +00:00
Matt Corallo
e515c87cf3 Set the timestamp for and provide diff stats for 0.0.117 CHANGELOG 2023-10-03 23:56:58 +00:00
Matt Corallo
dba48f62ea
Merge pull request #2620 from TheBlueMatt/2023-09-cut-0.0.117
Cut 0.0.117
2023-10-03 23:16:59 +00:00
Matt Corallo
c74874604e Bump crate versions to 0.0.117/invoice 0.25 2023-10-03 23:00:48 +00:00
Matt Corallo
3133286c88 Add 0.0.117 release notes 2023-10-03 23:00:48 +00:00