Commit graph

2905 commits

Author SHA1 Message Date
Matt Corallo
efcb5e02dc Move the pub wait methods from ChannelManager to Future
Rather than having three ways to await a `ChannelManager` being
persistable, this moves to just exposing the awaitable `Future` and
having sleep functions on that.
2023-04-03 16:49:54 +00:00
Matt Corallo
b455fb5e77 Implement the ability to block on multiple futures at once
In the next commits we'll be adding a second notify pipeline - from
the `ChainMonitor` back to the background processor. This will
cause the `background-processor` to need to await multiple wakers
at once, which we cannot do in the current scheme without taking on
a full async runtime.

Building a multi-future waiter isn't so bad, and notably will allow
us to remove the existing sleep pipeline entirely, reducing the
complexity of our wakers implementation by only having one notify
path to consider.
2023-04-03 16:49:54 +00:00
Matt Corallo
328407351c Do not bound callbacks by Send when building for no-std
`Send` is rather useless on a `no-std` target - we don't have
threads and are just needlessly restricting ourselves, so here we
skip it for the wakers callback.
2023-04-03 16:49:54 +00:00
Matt Corallo
a1b5a1bba3 Add CondVar::wait_{timeout_,}while to debug_sync
These are useful, but we previously couldn't use them due to our
MSRV. Now that we can, we should use them, so we expose them via
our normal debug_sync wrappers.
2023-04-03 16:49:54 +00:00
Matt Corallo
783e8188a7
Merge pull request #2136 from marctyndel/2023-03-paymentforwarded-expose-amount-forwarded
Expose amount forwarded in `PaymentForwarded` event
2023-03-30 18:15:23 +00:00
Matt Corallo
a9534fe6b5
Merge pull request #2059 from wpaulino/broadcast-missing-anchors-event
Queue BackgroundEvent to force close channels upon ChannelManager::read
2023-03-29 21:54:58 +00:00
Marc Tyndel
ee2cb8ef21 add outbound_amount_forwarded_msat field to PaymentForwarded event 2023-03-29 14:42:35 -04:00
valentinewallace
723c1a62ca
Merge pull request #2062 from alecchendev/2023-02-allow-overshoot-mpp
Allow overshooting final htlc amount and expiry
2023-03-29 11:37:51 -04:00
Wilmer Paulino
2166c8a2c4
Ignore lockorder violation on same callsite with different construction
As long as the lock order on such locks is still valid, we should allow
them regardless of whether they were constructed at the same location or
not. Note that we can only really enforce this if we require one lock
call per line, or if we have access to symbol columns (as we do on Linux
and macOS). We opt for a smaller patch by relying on the latter.

This was previously triggered by some recent test changes to
`test_manager_serialize_deserialize_inconsistent_monitor`. When the
test ends and a node is dropped causing us to persist each, we'd detect
a possible lockorder violation deadlock across three different `Mutex`
instances that are held at the same location when serializing our
`per_peer_states` in `ChannelManager::write`.

The presumed lockorder violation happens because the first `Mutex` held
shares the same construction location with the third one, while the
second `Mutex` has a different construction location. When we hold the
second one, we consider the first as a dependency, and then consider the
second as a dependency when holding the third, causing a circular
dependency (since the third shares the same construction location as the
first).

This isn't considered a lockorder violation that could result in a
deadlock as the comment suggests inline though, since we are under a
dependent write lock which no one else can have access to.
2023-03-28 17:27:47 -07:00
Alec Chen
1d31b0e84e Use onion amount amt_to_forward for MPP set calculation
If routing nodes take less fees and pay the final node more than
`amt_to_forward`, the receiver may see that `total_msat` has been met
before all of the sender's intended HTLCs have arrived. The receiver
may then prematurely claim the payment and release the payment hash,
allowing routing nodes to claim the remaining HTLCs. Using the onion
value `amt_to_forward` to determine when `total_msat` has been met
allows the sender to control the set total.
2023-03-28 17:21:09 -05:00
Alec Chen
ee57738ca8 Allow overshooting final cltv_expiry
Final nodes previously had stricter requirements on HTLC contents
matching onion value compared to intermediate nodes. This allowed
for probing, i.e. the last intermediate node could overshoot the
value by a small amount and conclude from the acceptance or rejection
of the HTLC whether the next node was the destination. This also
applies to the msat amount, however this change was already present.
2023-03-28 17:21:09 -05:00
Alec Chen
f3d8e58374 Allow overshooting total_msat for an MPP
While retrying a failed path of an MPP, a node may want to overshoot
the `total_msat` in order to use a path with an `htlc_minimum_msat`
greater than the remaining value being sent. This commit no longer
fails MPPs that overshoot the `total_msat`, however it does fail
HTLCs with the same payment hash that are received *after* a
payment has become claimable.
2023-03-28 17:21:09 -05:00
Alec Chen
b9f4ebdd28 Add total_value_received to ClaimableHTLC for claim validation
This is pre-work for allowing nodes to overshoot onion values and
changing validation for MPP completion. This adds a field to
`ClaimableHTLC` that is separate from the onion values, which
represents the actual received amount reported in `PaymentClaimable`
which is what we want to validate against when a user goes to claim.
2023-03-28 17:21:09 -05:00
Wilmer Paulino
23e233ba25
Expose HTLC transaction locktime in BumpTransactionEvent::HTLCResolution
While users could easily figure it out based on the set of HTLC
descriptors included within, we already track it within the
`OnchainTxHandler`, so we might as well expose it to users as a
nice-to-have. It's also yet another thing they must get right to ensure
their HTLC transaction broadcasts are valid.
2023-03-28 12:42:25 -07:00
Wilmer Paulino
68122bd09d
Set transaction locktime on malleable packages to discourage fee sniping
This only applies to all malleable packages on channels pre-dating
anchors and malleables packages for counterparty commitments
post-anchors. Malleables packages for holder commitments post-anchors
should have their transaction locktime applied manually by the consumer
of `BumpTransactionEvent::HTLCResolution` events.
2023-03-28 12:42:23 -07:00
Wilmer Paulino
2ac09711d3
Re-work PackageSolvingData::absolute_tx_timelock
Previously, this would return the earliest height the output could be
confirmed, which seems to no longer be useful. The only use of the
method was to determine whether we should delay a package to a future
block. Instead, we choose to return the absolute locktime the
transaction spending the output should have, which better corresponds to
the method name and still supports the delay functionality mentioned.

Doing so also allows us to expose the locktime required for HTLC
transactions we need to broadcast based on our own commitments for
anchor channels.
2023-03-28 12:15:54 -07:00
Matt Corallo
2d4bf974e5
Merge pull request #2083 from wpaulino/events-module
Move events.rs into its own top-level module
2023-03-28 16:37:55 +00:00
Matt Corallo
2223e92ac6
Merge pull request #2110 from munjesi/docs_fixes
Replacing (C-not exported) in the docs
2023-03-27 18:12:00 +00:00
Wilmer Paulino
174e16426a
Add new sub-module for BumpTransactionEvent
Its accompanying event handler will also live here.
2023-03-22 11:49:36 -07:00
Wilmer Paulino
ca9ca75f08
Move events.rs into its own top-level module
This is largely motivated by some follow-up work for anchors that will
introduce an event handler for `BumpTransaction` events, which we can
now include in this new top-level `events` module.
2023-03-22 11:49:33 -07:00
Jeffrey Czyz
3d479c9de6
Merge pull request #2114 from Evanfeenstra/force_close_msg_display
use PrintableString to Display CounterpartyForceClosed peer_msg
2023-03-22 12:32:22 -05:00
munjesi
b0bf50fa24 Replacing (C-not exported) in the docs 2023-03-22 14:30:36 +03:00
Evan Feenstra
987ab9512c SanitizedString struct to safely Display CounterpartyForceClosed peer_msg 2023-03-21 21:37:38 -07:00
Wilmer Paulino
04ee948643
Remove unused broadcast_latest_holder_commitment_txn method 2023-03-21 16:25:47 -07:00
Wilmer Paulino
00cfc6b823
Avoid refusing ChannelMonitorUpdates we expect to receive after closing
There is no need to fill the user's logs with errors that are expected
to be hit based on specific edge cases, like providing preimages after
a monitor has seen a confirmed commitment on-chain.

This doesn't really change our behavior – we still apply and persist the
state changes resulting from processing these updates regardless of
whether they succeed or not.
2023-03-21 16:25:47 -07:00
Wilmer Paulino
bd4eb0da76
Queue BackgroundEvent to force close channels upon ChannelManager::read
This results in a new, potentially redundant, `ChannelMonitorUpdate`
that must be applied to `ChannelMonitor`s to broadcast the holder's
latest commitment transaction.

This is a behavior change for anchor channels since their commitments
may require additional fees to be attached through a child anchor
transaction. Recall that anchor transactions are only generated by the
event consumer after processing a `BumpTransactionEvent::ChannelClose`
event, which is yielded after applying a
`ChannelMonitorUpdateStep::ChannelForceClosed` monitor update. Assuming
the node operator is not watching the mempool to generate these anchor
transactions without LDK, an anchor channel which we had to fail when
deserializing our `ChannelManager` would have its commitment transaction
broadcast by itself, potentially exposing the node operator to loss of
funds if the commitment transaction's fee is not enough to be accepted
into the network's mempools.
2023-03-21 16:25:46 -07:00
Wilmer Paulino
5a90f014f2
Use CLOSED_CHANNEL_UPDATE_ID in force closing ChannelMonitorUpdates
Currently, all that is required to force close a channel is to broadcast
either of the available commitment transactions, but this changes with
anchor outputs – commitment transactions may need to have
additional fees attached in order to confirm in a timely manner. While
we may be able to just queue a new update using the channel's next
available update ID, this may result in a violation of the
`ChannelMonitor` API (each update ID must strictly increase by 1) if the
channel had updates that were persisted by its `ChannelMonitor`, but not
the `ChannelManager`. Therefore, we choose to re-purpose the existing
`CLOSED_CHANNEL_UPDATE_ID` update ID to also apply to
`ChannelMonitorUpdate`s that will force close their respective channel
by broadcasting the holder's latest commitment transaction.
2023-03-21 16:25:45 -07:00
Matt Corallo
14ee173593
Merge pull request #2102 from douglaz/node_info_addresses
Remove NodeAnnouncementInfo addresses
2023-03-21 22:42:16 +00:00
Matt Corallo
9f8e832c7b
Merge pull request #2034 from wpaulino/anchor-revoked-aggregate-claim
Add test for aggregated revoked HTLC claim on anchors channel
2023-03-21 22:32:18 +00:00
Matt Corallo
ea15f0f448
Merge pull request #2100 from douglaz/docs_fixes
Docs improvements
2023-03-21 18:44:23 +00:00
Allan Douglas R. de Oliveira
6f5e5e3898 Remove redundant addresses field from NodeAnnouncementInfo
...replacing it with an acessor `addresses()`.

Besides removing a redundant data structure already present on inner
`NodeAnnouncement`, this change makes it possible to discover new address types
upon deserialization thanks to `UnsignedNodeAnnouncement`'s implementation.
2023-03-21 17:27:48 +00:00
Allan Douglas R. de Oliveira
963d6c4a51 Docs improvements 2023-03-21 14:11:13 +00:00
Matt Corallo
535dcc74b6 Remove unnecessary use in channelmonitor tests module 2023-03-20 20:08:29 +00:00
Matt Corallo
348e7274dc Remove unnecessary heap allocations in log-entry-matching tests 2023-03-20 20:07:18 +00:00
Wilmer Paulino
2cc48c5a3c
Add test for aggregated revoked HTLC claim on anchors channel 2023-03-20 11:32:15 -07:00
Wilmer Paulino
4be56b93b0
Maintain order of yielded claim events
Since the claim events are stored internally within a HashMap, they will
be yielded in a random order once dispatched. Claim events may be
invalidated if a conflicting claim has confirmed on-chain and we need to
generate a new claim event; the randomized order could result in the
new claim event being handled prior to the previous. To maintain the
order in which the claim events are generated, we track them in a Vec
instead and ensure only one instance of a PackageId only ever exists
within it.

This would have certain performance implications, but since we're
bounded by the total number of HTLCs in a commitment anyway, we're
comfortable with taking the cost.
2023-03-20 11:32:14 -07:00
Wilmer Paulino
7b9c28a021
Rename keys for OnchainTxHandler::claimable_outpoints map 2023-03-20 11:32:13 -07:00
Wilmer Paulino
1638c8b34a
Clarify OnchainEvent::Claim behavior
The previous documentation was slightly incorrect, a `Claim` can also be
from the counterparty if they happened to claim the same exact set of
outputs as a claiming transaction we generated.
2023-03-20 11:32:12 -07:00
Wilmer Paulino
7c446b4892
Add missing docs for BumpHTLCResolution 2023-03-20 11:32:09 -07:00
Wilmer Paulino
1958626744
Fix stale import behind anchors build tag 2023-03-20 11:32:07 -07:00
Wilmer Paulino
e7fb47b05a
Derive Eq on structs behind anchors build flag 2023-03-20 11:32:07 -07:00
Wilmer Paulino
cfa8941cc5
Implement PartialEq manually
Since we don't store `pending_claim_events` within `OnchainTxHandler` as
they'll be regenerated on restarts, we opt to implement `PartialEq`
manually such that the field is not longer considered.
2023-03-20 11:32:05 -07:00
Matt Corallo
48fa2fd172
Merge pull request #2024 from TheBlueMatt/2023-02-6conf-pub-hints
Include a route hint for public, not-yet-announced channels
2023-03-19 23:42:15 +00:00
Matt Corallo
cab6c976b6 Include a route hint for public, not-yet-announced channels
If we have a public channel which doesn't yet have six
confirmations the network can't possibly know about it as we cannot
have announced it yet. However, because we refuse to include
route-hints if we have any public channels, we will generate
invoices that no one can pay.

Thus, if we have any public, not-yet-announced channels, include
them as a route-hint.
2023-03-18 00:45:23 +00:00
Matt Corallo
217c3e09b3
Merge pull request #2107 from TheBlueMatt/2023-04-msrv-cleanup
Bump MSRV to 1.48 and replace most of CI with a bash script
2023-03-17 19:21:49 +00:00
Matt Corallo
12d799e6cb
Merge pull request #2094 from johncantrell97/expose-fee
expose `feerate_per_kw` in `ChannelDetails`
2023-03-15 21:16:23 +00:00
Matt Corallo
28cc71f980 Fix onion_message functional_tests no-std build 2023-03-15 19:19:49 +00:00
John Cantrell
d76b43fe44 expose feerate_sat_per_1000_weight in ChannelDetails
renames Channel::get_feerate to get_feerate_sat_per_1000_weight
2023-03-15 13:36:14 -04:00
Matt Corallo
2d213a47bf
Merge pull request #2045 from wpaulino/fix-broken-commitment-test-vectors
Update commitment test vectors
2023-03-14 19:01:59 +00:00
Matt Corallo
54f8895096
Merge pull request #2063 from valentinewallace/2023-03-remove-paymentpathfailed-retry
Remove `PaymentPathFailed::retry`
2023-03-13 23:01:38 +00:00