Commit graph

5618 commits

Author SHA1 Message Date
Jeffrey Czyz
442b030504
Rename ChannelPhase to Channel
In preparation for hiding ChannelPhase inside a Channel type, rename
ChannelPhase to Channel.
2025-01-10 11:18:13 -06:00
Jeffrey Czyz
c55508860f
Rename Channel to FundedChannel
In preparation for hiding ChannelPhase inside a Channel type, rename
Channel to FundedChannel.
2025-01-10 11:16:13 -06:00
Jeffrey Czyz
4a81e65b0e
Implement From<PendingV2Channel> for ChannelPhase
Exposing ChannelPhase in ChannelManager has led to verbose match
statements, which need to be modified each time a ChannelPhase is added.
Making ChannelPhase an implementation detail of Channel would help avoid
this.

As a step in this direction, define a conversion from PendingV2Channel
to ChannelPhase (to be renamed Channel).
2025-01-10 11:16:13 -06:00
Jeffrey Czyz
e8c4849dc7
Implement From<InboundV1Channel> for ChannelPhase
Exposing ChannelPhase in ChannelManager has led to verbose match
statements, which need to be modified each time a ChannelPhase is added.
Making ChannelPhase an implementation detail of Channel would help avoid
this.

As a step in this direction, define a conversion from InboundV1Channel
to ChannelPhase (to be renamed Channel).
2025-01-10 11:16:12 -06:00
Jeffrey Czyz
583224f4f9
Implement From<OutboundV1Channel> for ChannelPhase
Exposing ChannelPhase in ChannelManager has led to verbose match
statements, which need to be modified each time a ChannelPhase is added.
Making ChannelPhase an implementation detail of Channel would help avoid
this.

As a step in this direction, define a conversion from OutboundV1Channel
to ChannelPhase (to be renamed Channel).
2025-01-10 11:16:12 -06:00
Jeffrey Czyz
12ff3614c9
Implement From<Channel> for ChannelPhase
Exposing ChannelPhase in ChannelManager has led to verbose match
statements, which need to be modified each time a ChannelPhase is added.
Making ChannelPhase an implementation detail of Channel would help avoid
this.

As a step in this direction, define a conversion from Channel (to be
renamed FundedChannel) to ChannelPhase (to be renamed Channel).
2025-01-10 11:16:12 -06:00
Jeffrey Czyz
28971d4be1
Remove ChannelPhase::Unfunded*V1 pattern matches
Exposing ChannelPhase in ChannelManager has led to verbose match
statements, which need to be modified each time a ChannelPhase is added.
Making ChannelPhase an implementation detail of Channel would help avoid
this.

As a step in this direction, update ChannelManager methods to use
methods on ChannelPhase for obtaining the appropriate V1 channel types.
2025-01-10 11:16:12 -06:00
Jeffrey Czyz
06a61b3b15
Remove ChannelPhase from convert_chan_phase_err
Exposing ChannelPhase in ChannelManager has led to verbose match
statements, which need to be modified each time a ChannelPhase is added.
Making ChannelPhase an implementation detail of Channel would help avoid
this.

As a step in this direction, update the convert_chan_phase_err macro to
use ChannelPhase::as_funded_mut instead.
2025-01-10 11:16:12 -06:00
Jeffrey Czyz
4b965e0f78
Remove ChannelPhase::UnfundedV2 pattern matches
Exposing ChannelPhase in ChannelManager has led to verbose match
statements, which need to be modified each time a ChannelPhase is added.
Making ChannelPhase an implementation detail of Channel would help avoid
this.

As a step in this direction, update ChannelManager methods to use
ChannelPhase::as_unfunded_v2_mut and ChannelPhase::into_unfunded_v2
methods.
2025-01-10 11:16:12 -06:00
Jeffrey Czyz
537ed88ae9
Rewrite ChannelManager::timer_tick_occurred
Exposing ChannelPhase in ChannelManager has led to verbose match
statements, which need to be modified each time a ChannelPhase is added.
Making ChannelPhase an implementation detail of Channel would help avoid
this.

As a step in this direction, update ChannelManager::timer_tick_occurred
to use ChannelPhase::as_funded_mut and a new
ChannelPhase::unfunded_context_mut method.
2025-01-10 11:16:11 -06:00
Jeffrey Czyz
e24082c6ab
Rewrite ChannelManager::handle_error
Exposing ChannelPhase in ChannelManager has led to verbose match
statements, which need to be modified each time a ChannelPhase is added.
Making ChannelPhase an implementation detail of Channel would help avoid
this.

As a step in this direction, update ChannelManager::handle_error to use
a new ChannelPhase::maybe_handle_error_without_close.
2025-01-10 11:16:11 -06:00
Jeffrey Czyz
fdbce7f75b
Rewrite ChannelManager::peer_connected
Exposing ChannelPhase in ChannelManager has led to verbose match
statements, which need to be modified each time a ChannelPhase is added.
Making ChannelPhase an implementation detail of Channel would help avoid
this.

As a step in this direction, update ChannelManager::peer_connected to
use ChannelPhase::as_funded_mut and a new
ChannelPhase::maybe_get_open_channel method.
2025-01-10 11:16:11 -06:00
Jeffrey Czyz
a6c70eab0a
Rewrite ChannelManager::peer_disconnected
Exposing ChannelPhase in ChannelManager has led to verbose match
statements, which need to be modified each time a ChannelPhase is added.
Making ChannelPhase an implementation detail of Channel would help avoid
this.

As a step in this direction, update ChannelManager::peer_disconnected to
use ChannelPhase::as_funded_mut and a new ChannelPhase::is_resumable
method.
2025-01-10 11:16:11 -06:00
Jeffrey Czyz
cae893af64
Rewrite ChannelManager::signer_unblocked
Exposing ChannelPhase in ChannelManager has led to verbose match
statements, which need to be modified each time a ChannelPhase is added.
Making ChannelPhase an implementation detail of Channel would help avoid
this.

As a step in this direction, update ChannelManager::signer_unblocked to
use ChannelPhase::as_funded and a new method on ChannelPhase dispatching
to each variant's signer_maybe_unblocked method.
2025-01-10 11:16:11 -06:00
Jeffrey Czyz
307e0485d2
Handle tx_abort without using ChannelPhase
Exposing ChannelPhase in ChannelManager has led to verbose match
statements, which need to be modified each time a ChannelPhase is added.
Making ChannelPhase an implementation detail of Channel would help avoid
this.

As a step in this direction, update ChannelManager::internal_tx_abort to
use ChannelPhase::is_funded and a new ChannelPhase::as_unfunded_v2_mut
method.
2025-01-10 11:16:11 -06:00
Jeffrey Czyz
6f119eb20c
Rewrite ChannelManager::unfunded_channel_count
Exposing ChannelPhase in ChannelManager has led to verbose match
statements, which need to be modified each time a ChannelPhase is added.
Making ChannelPhase an implementation detail of Channel would help avoid
this.

As a step in this direction, rewrite ChannelManager's
unfunded_channel_count method to use ChannelPhase::as_funded and a new
ChannelPhase::as_unfunded_v2 method.
2025-01-10 11:16:10 -06:00
Jeffrey Czyz
401bdb84e3
Add ChannelPhase::is_funded for filtering channels.
Exposing ChannelPhase in ChannelManager has led to verbose match
statements, which need to be modified each time a ChannelPhase is added.
Making ChannelPhase an implementation detail of Channel would help avoid
this.

As a step in this direction, introduce ChannelPhase::is_funded for use
in ChannelManager when a Channel (to be later renamed FundedChannel)
needs to be tested for.
2025-01-10 11:16:03 -06:00
Jeffrey Czyz
1780ce4e5a
Hide ChannelPhase::Funded behind as_funded method
Exposing ChannelPhase in ChannelManager has led to verbose match
statements, which need to be modified each time a ChannelPhase is added.
Making ChannelPhase an implementation detail of Channel would help avoid
this.

As a step in this direction, introduce ChannelPhase::as_funded and
ChannelPhase::as_funded_mut for use in ChannelManager when a Channel (to
be later renamed FundedChannel) is needed.
2025-01-08 21:29:43 -06: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
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
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
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
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
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
Matt Corallo
c55f54802c
Merge pull request #3414 from TheBlueMatt/2024-09-async-persist-claiming-from-closed-chan
Support async `ChannelMonitorUpdate` persist for claims against closed channels
2024-12-16 16:06:48 +00:00
Duncan Dean
6f8328ebd1
Reintroduce cfg(dual_funding) for handling of open_channel2 messages 2024-12-16 06:06:48 +02:00
Matt Corallo
47ca19d39e Remove the async_signing cfg flag
Now that the core features required for `async_signing` are in
place, we can go ahead and expose it publicly (rather than behind a
a `cfg`-flag). We still don't have full async support for
`get_per_commitment_point`, but only one case in channel
reconnection remains. The overall logic may still have some
hiccups, but its been in use in production at a major LDK user for
some time now. Thus, it doesn't really make sense to hide behind a
`cfg`-flag, even if the feature is only 99% complete. Further, the
new paths exposed are very restricted to signing operations that
run async, so the risk for existing users should be incredibly low.
2024-12-16 00:39:39 +00:00
Matt Corallo
79190adcc1 DRY the pre-startup ChannelMonitorUpdate handling
This moves the common `if during_startup { push background event }
else { apply ChannelMonitorUpdate }` pattern by simply inlining it
in `handle_new_monitor_update`.
2024-12-16 00:27:13 +00:00
Matt Corallo
41f703c6d5 Support async ChannelMonitorUpdates to closed chans at startup
One of the largest gaps in our async persistence functionality has
been preimage (claim) updates to closed channels. Here we finally
implement support for this (for updates which are generated during
startup).

Thanks to all the work we've built up over the past many commits,
this is a fairly straightforward patch, removing the
immediate-completion logic from `claim_mpp_part` and adding the
required in-flight tracking logic to
`apply_post_close_monitor_update`.

Like in the during-runtime case in the previous commit, we sadly
can't use the `handle_new_monitor_update` macro wholesale as it
handles the `Channel` resumption as well which we don't do here.
2024-12-16 00:27:13 +00:00
Matt Corallo
260f8759b0 Don't double-claim MPP payments that are pending on multiple chans
On startup, we walk the preimages and payment HTLC sets on all our
`ChannelMonitor`s, re-claiming all payments which we recently
claimed. This ensures all HTLCs in any claimed payments are claimed
across all channels.

In doing so, we expect to see the same payment multiple times,
after all it may have been received as multiple HTLCs across
multiple channels. In such cases, there's no reason to redundantly
claim the same set of HTLCs again and again. In the current code,
doing so may lead to redundant `PaymentClaimed` events, and in a
coming commit will instead cause an assertion failure.
2024-12-16 00:27:13 +00:00
Matt Corallo
e938ed74bb Support async ChannelMonitorUpdates to closed chans at runtime
One of the largest gaps in our async persistence functionality has
been preimage (claim) updates to closed channels. Here we finally
implement support for this (for updates at runtime).

Thanks to all the work we've built up over the past many commits,
this is a well-contained patch within `claim_mpp_part`, pushing
the generated `ChannelMonitorUpdate`s through the same pipeline we
use for open channels.

Sadly we can't use the `handle_new_monitor_update` macro wholesale
as it handles the `Channel` resumption as well which we don't do
here.
2024-12-16 00:27:13 +00:00
Matt Corallo
3395938771 Add an additional variant to handle_new_monitor_update!
In d1c340a0e1 we added support in
`handle_new_monitor_update!` for handling updates without dropping
locks.

In the coming commits we'll start handling `ChannelMonitorUpdate`s
"like normal" for updates against closed channels. Here we set up
the first step by adding a new `POST_CHANNEL_CLOSE` variant on
`handle_new_monitor_update!` which attempts to handle the
`ChannelMonitorUpdate` and handles completion actions if it
finishes immediately, just like the pre-close variant.
2024-12-16 00:27:13 +00:00
Matt Corallo
1481216793 Set closed chan mon upd update_ids at creation not application
In c99d3d785d we added a new
`apply_post_close_monitor_update` method which takes a
`ChannelMonitorUpdate` (possibly) for a channel which has been
closed, sets the `update_id` to the right value to keep our updates
well-ordered, and then applies it.

Setting the `update_id` at application time here is fine - updates
don't really have an order after the channel has been closed, they
can be applied in any order - and was done for practical reasons
as calculating the right `update_id` at generation time takes a
bit more work on startup, and was impossible without new
assumptions during claim.

In the previous commit we added exactly the new assumption we need
at claiming (as it's required for the next few commits anyway), so
now the only thing stopping us is the extra complexity.

In the coming commits, we'll move to tracking post-close
`ChannelMonitorUpdate`s as in-flight like any other updates, which
requires having an `update_id` at generation-time so that we know
what updates are still in-flight.

Thus, we go ahead and eat the complexity here, creating
`update_id`s when the `ChannelMonitorUpdate`s are generated for
closed-channel updates, like we do for channels which are still
live.

We also ensure that we always insert `ChannelMonitorUpdate`s in the
pending updates set when we push the background event, avoiding a
race where we push an update as a background event, then while its
processing another update finishes and the post-update actions get
run.
2024-12-16 00:27:13 +00:00
Alec Chen
d1e94bd5ee Add test for async open and accept channel
Here we make a test that disables a channel signer's ability
to return commitment points upon being first derived for a channel.

We also fit in a couple cleanups: removing a comment referencing a
previous design with a `HolderCommitmentPoint::Uninitialized` variant,
as well as adding coverage for updating channel maps in async closing
signed.
2024-12-13 13:06:31 -08:00
Alec Chen
e64af019f3 Handle fallible commitment point when getting channel_ready
Here we handle the case where our signer is pending the next commitment
point when we try to send channel ready. We set a flag to remember to
send this message when our signer is unblocked. This follows the same
general pattern as everywhere else where we're waiting on a commitment
point from the signer in order to send a message.
2024-12-13 13:06:31 -08:00
Alec Chen
8058a600d0 Handle fallible commitment point when getting accept_channel
Similar to `open_channel`, if a signer cannot provide a commitment point
immediately, we set a flag to remember we're waiting for a point to send
`accept_channel`. We make sure to get the first two points before moving
on, so when we advance our commitment we always have a point available.
2024-12-13 13:06:31 -08:00
Alec Chen
08251ca14b Move setting signer flags to get_funding_created_msg
For all of our async signing logic in channel establishment v1, we set
signer flags in the method where we create the raw lightning message
object. To keep things consistent, this commit moves setting the signer
flags to where we create funding_created, since this was being set
elsewhere before.

While we're doing this cleanup, this also slightly refactors our
funding_signed method to move some code out of an indent, as well
as removes a log to fix a nit from #3152.
2024-12-13 13:06:31 -08:00
Alec Chen
5026d7114c Handle fallible commitment point for open_channel message
In the event that a signer cannot provide a commitment point
immediately, we set a flag to remember we're waiting for this before we
can send `open_channel`. We make sure to get the first two commitment
points, so when we advance commitments, we always have a commitment
point available.

When initializing a context, we set the `signer_pending_open_channel`
flag to false, and leave setting this flag for where we attempt to
generate a message.

When checking to send messages when a signer is unblocked, we must
handle both when we haven't gotten any commitment point, as well as when
we've gotten the first but not the second point.
2024-12-13 13:06:31 -08:00
Alec Chen
2de72f3490 Remove holder commitment point from channel context
Following a previous commit adding `HolderCommitmentPoint` elsewhere, we
make the transition to use those commitment points and remove the
existing one.
2024-12-13 13:06:28 -08:00
Alec Chen
380b87191d Add holder commitment point to channel and unfunded context
We are choosing to move the `HolderCommitmentPoint` (the struct that
tracks commitment points retrieved from the signer + the commitment
number) to handle channel establishment, where we have no commitment
point at all. Previously we introduced this struct to track when we were
pending a commitment point (because of an async signer) during normal
channel operation, which assumed we always had a commitment point to
start out with.

Intiially we tried to add an `Uninitialized` variant
that held no points, but that meant that we needed to handle that case
everywhere which left a bunch of scary/unnecessary unwraps/expects.
Instead, we just hold an optional `HolderCommitmentPoint` struct
on our unfunded channels, and a non-optional `HolderCommitmentPoint`
for funded channels.

This commit starts that transition. A following commit will remove the
holder commitment point from the current `ChannelContext`.

This also makes small fixups to the comments on the
HolderCommitmentPoint variants.
2024-12-13 13:04:16 -08:00
Matt Corallo
f9765c470f Always require a PeerState for the CP when claiming an HTLC
Now that we track the latest `ChannelMonitorUpdate::update_id` for
each closed channel in
`PeerState::closed_channel_monitor_update_ids`, we should always
have a `PeerState` entry for the channel counterparty any time we
go to claim an HTLC on a channel, even if its closed.

Here we make this a hard assertion as we'll need to access that
`PeerState` in the coming commits to track in-flight updates
against closed channels.
2024-12-13 16:50:45 +00:00
Jeffrey Czyz
d287bf0d7d
Fix lint warning in lightning when fuzzing 2024-12-13 09:26:04 -06:00
Jeffrey Czyz
4f0252fe75
Test payment::ReceiveTlvs authentication failure 2024-12-13 09:26:03 -06:00
Jeffrey Czyz
faf8367e9a
Require a PaymentContext in payment::ReceiveTlvs
UnknownPaymentContext is used when payment::ReceiveTlvs doesn't contain
a PaymentContext. This is only needed for a legacy BlindedPaymentPath.
Since these paths a short-lived, UnknownPaymentContext is no longer
needed. Remove it and require that payment::ReceiveTlvs always contains
a PaymentContext.

Any such path would fail authentication since the payment::ReceiveTlvs
would be missing an HMAC and Nonce, so this is a good time to remove
UnknownPaymentContext.
2024-12-13 09:26:03 -06:00
Jeffrey Czyz
62cdf5d60b
Verify that an HTLC's ReceiveTlvs is authentic
When receiving a payment over a BlindedPaymentPath, a PaymentContext is
included but was not authenticated. The previous commit adds an HMAC of
the payment::ReceiveTlvs (which contains the PaymentContext) and the
nonce used to create the HMAC. This commit verifies the authenticity
when parsing the InboundOnionPayload. This prevents a malicious actor
from for forging it.
2024-12-13 09:26:03 -06:00
Jeffrey Czyz
55c02fdee1
Include HMAC and Nonce in payment::ReceiveTlvs
In order to authenticate a PaymentContext, an HMAC and Nonce must be
included along with it in payment::ReceiveTlvs. Compute the HMAC when
constructing a BlindedPaymentPath and include it in the recipient's
BlindedPaymentTlvs. Authentication will be added in an upcoming commit.
2024-12-13 09:26:03 -06:00