Commit graph

659 commits

Author SHA1 Message Date
Matt Corallo
89749eddec
Merge pull request #2649 from benthecarman/display-outpoint
Impl Display for Outpoint
2023-10-06 19:00:01 +00:00
benthecarman
42c5640d19
Impl Display for Outpoint 2023-10-05 22:45:29 -05:00
Matt Corallo
7a583bb756 Remove unused mem::drop which drops a reference 2023-10-01 00:05:01 +00:00
Matt Corallo
34f36d5ffe Drop various bounds on types passed to MonitorUpdatingPersister
The new `MonitorUpdatingPersister` has a few redundant type bounds
(re-specified on functions after having been specified on the
struct itself), which we remove here.

Further, it requires a `Deref<FeeEstimator>` which is `Clone`able.
This is generally fine in rust, but annoying in bindings, so we
simply elide it in favor if a `&Deref<FeeEstimator>`.
2023-10-01 00:05:01 +00:00
Matt Corallo
cff2061335
Merge pull request #2610 from wpaulino/missing-htlc-claim-balance
Fix matching of second-stage HTLC claim in get_htlc_balance
2023-09-29 23:55:04 +00:00
Matt Corallo
f534ce26c9
Merge pull request #2621 from G8XSU/dont-persist-erroneous-update
Persist entire monitor if there is an error while applying monitor_update
2023-09-29 23:45:57 +00:00
Gursharan Singh
976acd8af0
Add update_persisted_channel doc to indicate rare case for None update 2023-09-29 16:26:40 -07:00
Gursharan Singh
5e6a0d5f38
Persist full monitor if there is an error while applying monitor_update
Motivation: When there is an error while applying monitor_update to a
channel_monitor,  we don't want to persist a 'monitor_update' which
results in a failure to apply later while reading 'channel_monitor' with
updates from storage. Instead, we should persist the entire 'channel_monitor'
here.
2023-09-29 16:26:40 -07:00
Gursharan Singh
13eac47ed9
Correctly mark chain_sync updates in test_utils
We were incorrectly marking updates as chain_sync
or not in test_utils based on whether monitor_update
is None or not. Instead, use UpdateOrigin to determine it.
2023-09-29 16:26:29 -07:00
Matt Corallo
0930be3304
Fix matching of second-stage HTLC claim in get_htlc_balance
We incorrectly assumed that the descriptor's output index from
second-stage HTLC transaction would always match the HTLC's output index
in the commitment transaction. This doesn't make any sense though, we
need to make sure we map the descriptor to it's corresponding HTLC in
the commitment. Instead, we check that the transaction from which the
descriptor originated from spends the HTLC in question.

Note that pre-anchors, second-stage HTLC transactions are always 1
input-1 output, so previously we would only match if the HTLC was the
first output in the commitment transaction. Post-anchors, they are
malleable, so  we can aggregate multiple HTLC claims into a single
transaction making this even more likely to happen. Unfortunately, we
lacked proper coverage in this area so the bug went unnoticed. To
address this, we aim to extend our existing coverage of
`get_claimable_balances` to anchor outputs channels in the following
commits.
2023-09-29 16:24:39 -07:00
Matt Corallo
620244dc2e
Merge pull request #2605 from wpaulino/anchors-monitor-track-to-remote-script
Use correct to_remote script in counterparty commitments
2023-09-29 22:06:58 +00:00
Wilmer Paulino
9f3bb7d7a5
Fix incorrect anchors counterparty_payment_script upon deserialization 2023-09-29 14:22:02 -07:00
Matt Corallo
efbaa19a05
Merge pull request #2626 from TheBlueMatt/2023-09-revert-2476
Revert "Remove AvailableBalances::balance_msat"
2023-09-29 21:06:41 +00:00
Wilmer Paulino
fa2a2efef4
Support signing to_remote anchors variant for StaticPaymentOutput
`to_remote` outputs on commitment transactions with anchor outputs have
an additional `1 CSV` constraint on its spending condition,
transitioning away from the previous P2WPKH script to a P2WSH.

Since our `ChannelMonitor` was never updated to track the proper
`to_remote` script on anchor outputs channels, we also missed updating
our signer to handle the new script changes.
2023-09-29 13:46:59 -07:00
Wilmer Paulino
33b745f54e
Use correct to_remote script in counterparty commitments
While our commitment transactions did use the correct `to_remote`
script, the `ChannelMonitor`'s was not as it is tracked separately. This
would lead to users never receiving an `Event::SpendableOutputs` with a
`StaticPaymentOutput` descriptor to claim the funds.

Luckily, any users affected which had channel closures confirmed by a
counterparty commitment just need to replay the closing transaction to
receive the event.
2023-09-29 13:46:56 -07:00
Matt Corallo
955e81086f
Merge pull request #2624 from wpaulino/2609-follow-up
Address 2609 follow-up comments
2023-09-29 20:07:16 +00:00
Matt Corallo
fbc86cb564
Merge pull request #2623 from wpaulino/htlc-claim-receive-preimage-after-close
Claim HTLCs with preimage from currently confirmed commitment
2023-09-29 18:53:44 +00:00
Matt Corallo
c7c4226e99 Revert "Remove AvailableBalances::balance_msat"
While removing the `balance_msat` field absolutely makes sense -
it is, at best, confusing - we really need a solid replacement for
it before we can do so. While one such replacement is in progress,
it is not complete and we'd like to not block our current release
on its completion.

This reverts commit ef5be580f5.
2023-09-29 18:32:25 +00:00
Wilmer Paulino
f267a30cc7
Only yield DelayedPaymentOutput descriptors once their delay expires
Otherwise, we could give users a descriptor ahead of time that will
result in an invalid transaction spend/broadcast.
2023-09-29 10:56:48 -07:00
Elias Rohrer
a8fa5a1685
Merge pull request #2591 from TheBlueMatt/2023-09-2562-followups
Doc and comment followups to #2562
2023-09-29 19:08:36 +02:00
Wilmer Paulino
6cf0351462
Note required levels of descendant transactions in get_spendable_outputs
Three levels of descendant transactions starting from the channel's
funding transaction should cover all potential spendable outputs.

The first level covers the commitment transaction.

The second level covers the to_self claims, to_remote claims,
second-stage HTLC claims and justice transactions.

The third levels covers the justice transactions on second-stage HTLCs,
and to_self claims on second-stage HTLCs.
2023-09-29 10:01:21 -07:00
Wilmer Paulino
89fbbb3ce2
Claim HTLCs with preimage from currently confirmed commitment
We should always claim HTLCs from the currently confirmed commitment,
rather than always claiming from the latest or previous counterparty
commitment if we've seen either confirm onchain at a prior point.
2023-09-29 09:58:35 -07:00
Matt Corallo
6016101ac8
Merge pull request #2609 from wpaulino/monitor-get-spendable-output
Allow retrieval of SpendableOutputDescriptors from relevant transactions
2023-09-29 01:29:47 +00:00
Wilmer Paulino
ffec24b3e3
Retrieve all possible spendable outputs from transactions
Assuming our keys haven't been compromised, and that random transactions
aren't learning of these scripts somehow and sending funds to them, it
was only possible for one spendable output to exist within a
transaction.

- `shutdown_script` can only exist in co-op close transactions.
- `counterparty_payment_script` can only exist in counterparty
  commitment transactions.
- `broadcasted_holder_revokable_script` can only exist in holder
  commitment/HTLC transactions.
- `destination_script` can exist in any other type of claim we support.

Now that we're exposing this API to users such that they can rescan any
relevant transactions, there's no harm in allowing them to claim more
funds from spendable outputs than we expected.
2023-09-28 14:25:30 -07:00
Wilmer Paulino
b8f80f8ab9
Allow retrieval of SpendableOutputDescriptors from relevant transactions
Currently, our API will only expose `SpendableOutputDescriptor`s once
after they are no longer under reorg risk (see `ANTI_REORG_DELAY`).
Users have often requested they'd like the ability to retrieve these in
some other way, either for historical purposes, or to handle replaying
any in the event of a failure.
2023-09-28 14:23:33 -07:00
Matt Corallo
34dd48c585 Add more details about async persistence completion/backgrounding
This clarifies somewhat that async persistence should run
indefinitely or keep trying via polling, and that either is
acceptable.
2023-09-28 20:45:55 +00:00
Wilmer Paulino
3c83783800
Use correct input sequence for HTLC claims from counterparty commitments
HTLC outputs, like the `to_remote` output, in commitment transactions
with anchor outputs also have an additional `1 CSV` constraint on the
counterparty. When spending such outputs, their corresponding input
needs to have their sequence set to 1. This was done for HTLC claims
from holder commitments, but unfortunately not for counterparty
commitments as we were lacking test coverage.
2023-09-27 11:49:57 -07:00
Matt Corallo
974ba314a2 Refer to an "outage" over a "timeout", for when failure happens
Timeouts may be worth retrying, but an outage is a more general
term which obviously cannot be retried.
2023-09-26 16:37:19 +00:00
benthecarman
66821a9e72
Implement Debug for MonitorUpdateId 2023-09-24 00:34:27 -05:00
Matt Corallo
4f4e84ef4d
Merge pull request #2562 from TheBlueMatt/2023-08-no-perm-fail
Drop the ChannelMonitorUpdateStatus::PermanentFailure variant
2023-09-21 20:22:16 +00:00
Matt Corallo
f254c56585 Add an UnrecoverableError variant to ChannelMonitorUpdateStatus
While there is no great way to handle a true failure to persist a
`ChannelMonitorUpdate`, it is confusing for users for there to be
no error variant at all on an I/O operation.

Thus, here we re-add the error variant removed over the past
handful of commits, but rather than handle it in a truly unsafe
way, we simply panic, optimizing for maximum mutex poisoning to
ensure any future operations fail and return immediately.

In the future, we may consider changing the handling of this to
instead set some "disconnect all peers and fail all operations"
bool to give the user a better chance to shutdown in a semi-orderly
fashion, but there's only so much that can be done in lightning if
we truly cannot persist new updates.
2023-09-21 19:12:31 +00:00
Matt Corallo
aa9c601774 Drop doc comments on ChainMonitor trait impl methods
In general, doc comments on trait impl blocks are not very visible
in rustdoc output, and unless they provide useful information they
should be elided.

Here we drop useless doc comments on `ChainMonitor`'s `Watch` impl
methods.
2023-09-21 19:04:41 +00:00
Matt Corallo
e5bd7920bd Update ChannelMonitorUpdateStatus documentation with async support
Since we now (almost) support async monitor update persistence, the
documentation on `ChannelMonitorUpdateStatus` can be updated to no
longer suggest users must keep a local copy that persists before
returning. However, because there are still a few remaining issues,
we note that async support is currently beta and explicily warn of
potential for funds-loss.

Fixes #1684
2023-09-21 19:04:41 +00:00
Matt Corallo
a96e2fe144 Rename MonitorEvent::CommitmentTxConfirmed to HolderForceClosed
The `MonitorEvent::CommitmentTxConfirmed` has always been a result
of us force-closing the channel, not the counterparty doing so.
Thus, it was always a bit of a misnomer. Worse, it carried over
into the channel's `ClosureReason` in the event API.

Here we simply rename it and use the proper `ClosureReason`.
2023-09-21 19:04:41 +00:00
Matt Corallo
6e115db22b Drop ChannelMonitorUpdate::UpdateFailed as its now unused 2023-09-21 19:04:41 +00:00
Matt Corallo
f24502e986 Drop channel_perm_failed tracking in ChainMonitor
Now that `PermanentFailure` is not a possible return value, we can
simply remove handling of it in `ChannelMonitor`.
2023-09-21 19:04:41 +00:00
Matt Corallo
23c5308bcb Drop the ChannelMonitorUpdateStatus::PermanentFailure variant
When a `ChannelMonitorUpdate` fails to apply, it generally means
we cannot reach our storage backend. This, in general, is a
critical issue, but is often only a transient issue.

Sadly, users see the failure variant and return it on any I/O
error, resulting in channel force-closures due to transient issues.

Users don't generally expect force-closes in most cases, and
luckily with async `ChannelMonitorUpdate`s supported we don't take
any risk by "delaying" the `ChannelMonitorUpdate` indefinitely.

Thus, here we drop the `PermanentFailure` variant entirely, making
all failures instead be "the update is in progress, but won't ever
complete", which is equivalent if we do not close the channel
automatically.
2023-09-21 19:04:05 +00:00
Wilmer Paulino
ceebf6256e
Limit external claim feerate bumps
Since we don't know the total input amount of an external claim (those
which come anchor channels), we can't limit our feerate bumps by the
amount of funds we have available to use. Instead, we choose to limit it
by a margin of the new feerate estimate.
2023-09-19 11:13:40 -07:00
Matt Corallo
53c8f89ba9 Avoid unnecessarily cloning unsigned Transaction when broadcasting
Our `Trusted*` wrappers in `chan_utils` expose additional inner
fields by reference. However, because they were not explicitly
marked as returning a reference with the wrapped struct's
lifetimes, rustc was considering them to return a reference with
the wrapper struct's lifetime.

This is unnecessarily restrictive, and resulted in the addition of
a clone in 9850c5814a which we remove
here.
2023-09-15 20:41:48 +00:00
Rachel Malonson
9850c5814a Remove unnecessary signing call in ChannelMonitor 2023-09-15 12:46:27 -07:00
Matt Corallo
0d8b0961a5 Update tests to test re-claiming of forwarded HTLCs on startup
Because some of these tests require connecting blocks without
calling `get_and_clear_pending_msg_events`, we need to split up
the block connection utilities to only optionally call
sanity-checks.
2023-09-12 19:03:17 +00:00
Gursharan Singh
073899a398
Add PaymentId in ChannelManager.list_recent_payments() 2023-09-11 12:19:19 -07:00
Joseph Goulden
25c0f489ae Downgrade log message regarding Channel Monitor sync still being in progress from info to debug 2023-09-03 12:48:56 +01:00
Matt Corallo
2c4f82478e
Merge pull request #2528 from arik-so/arik/2023-08-2470-shorter-term-monitor-locks
Release monitor write lock in between update iterations
2023-08-28 17:07:03 +00:00
Arik Sosman
c7a4949a25
Release write lock between monitor update iterations.
Previously, updating block data on a chain monitor
would acquire a write lock on all of its associated
channel monitors and not release it until the loop
completed.

Now, we instead acquire it on each iteration,
fixing #2470.
2023-08-27 10:24:37 -07:00
optout
e99e6ab562
Use new ChannelId type 2023-08-26 01:30:40 +02:00
Alec Chen
2cb2557669
Enable signing a justice tx using the channel monitor 2023-08-23 12:33:11 -05:00
Alec Chen
75c058670c
Enable monitor to rebuild initial counterparty commitment tx
Upon creating a channel monitor, it is provided with the initial
counterparty commitment transaction info directly before the very first
time it is persisted. Because of this, the very first counterparty
commitment is not seen as an update in the persistence pipeline, and so
our previous changes to the monitor and updates cannot be used to
reconstruct this commitment.

To be able to expose the counterparty's transaction for the very first
commitment, we add a thin wrapper around
`provide_latest_counterparty_commitment_tx`, that stores the necessary
data needed to reconstruct the initial commitment transaction in the
monitor.
2023-08-23 12:33:07 -05:00
Alec Chen
966465a282
Build and expose counterparty commitments from monitor update 2023-08-23 12:33:00 -05:00
Alec Chen
543ad4fd23
Add feerate and balances to LatestCounterpartyCommitmentTXInfo
This adds the feerate and local and remote output values to this channel
monitor update step so that a monitor can reconstruct the counterparty's
commitment transaction from an update. These commitment transactions
will be exposed to users in the following commits to support third-party
watchtowers in the persistence pipeline.

With only the HTLC outputs currently available in the monitor update, we
can tell how much of the channel balance is in-flight and towards which
side, however it doesn't tell us the amount that resides on either side.
Because of dust, we can't reliably derive the remote value from the
local value and visa versa. Thus, it seems these are the minimum fields
that need to be added.
2023-08-23 10:48:19 -05:00