Commit graph

1808 commits

Author SHA1 Message Date
Viktor Tigerström
0eb74ec007 Unify failure to query Channel error messages 2023-01-09 23:50:41 +01:00
Viktor Tigerström
ff9840ea35 Avoid unnecessary immediate retake per_peer_state lock 2023-01-09 23:50:41 +01:00
Viktor Tigerström
b8ca7c9256 Remove unnecessary per_peer_state branch
After `channels` are now stored in the `per_peer_state`, some logic can
be simplified and extra accessing of the `per_peer_state` can be
removed.
2023-01-09 23:50:41 +01:00
Viktor Tigerström
1ab25a086a Store channels per peer 2023-01-09 23:50:41 +01:00
Omer Yacine
3a33693b1e
Expose impl_writeable_tlv_based macro
Every exported macro needed to have all the macros used inside it:
1- to be exported as well.
2- be called from the `$crate` namespace so it works in other crates.

Some structs in `lightning::util::ser` needed to be made public as they were used inside the exported macros.

Use the macros like this:
```Rust
lightning::impl_writeable_tlv_based!(...)
```
2023-01-09 21:16:30 +02:00
Viktor Tigerström
48f9c72eb6 Add ChannelManager::PeerState::latest_features docs 2023-01-07 00:52:29 +01:00
Viktor Tigerström
ce5cc73b4d Add counterparty_node to test macros 2023-01-07 00:52:29 +01:00
valentinewallace
d8a20eda5f
Merge pull request #1927 from jkczyz/2022-12-invoice-rework
Pre-work for BOLT 12 invoices
2023-01-06 11:07:17 -05:00
Jeffrey Czyz
b50fc4e32c
Define blinded hop features for use in BOLT 12
BOLT 12 invoices may contain blinded_payinfo for each hop in a blinded
path. Each blinded_payinfo contains features, whose length must be
encoded since there may be multiple hops.

Note these features are also needed in the BOLT 4 encrypted_data_tlv
stream. But since they are a single TLV record, the length must *not* be
encoded there.
2023-01-05 22:39:24 -06:00
Jeffrey Czyz
d985ced7e3
Define BOLT 12 invoice features with MPP support 2023-01-05 22:39:24 -06:00
Jeffrey Czyz
ea1a68c6e6
Use explicit WithoutLength for BOLT 12 features
Most BOLT 12 features are used as the value of a TLV record and thus
don't use an explicit length. One exception is the features inside the
blinded payinfo subtype since the TLV record contains a list of them.
However, these features are also used in the BOLT 4 encrypted_data_tlv
TLV stream as a single record, where the length is implicit.

Implement Readable and Writeable for Features wrapped in WithoutLength
such that either serialization can be used where required.
2023-01-05 22:39:24 -06:00
Valentine Wallace
19516c041e
Test utils: allow queueing >2 persistence update results 2023-01-05 11:29:24 -05:00
Valentine Wallace
682bb9b0ae
Parameterize Simple*ChannelManager with DefaultRouter and ProbScorer 2023-01-05 11:29:00 -05:00
Valentine Wallace
3a274e0415
Implement routing against the netgraph in tests 2023-01-05 11:23:45 -05:00
Valentine Wallace
2e06efe2ff
Parameterize ChannelManager by a Router trait
This will be used in upcoming work to fetch routes on-the-fly for payment
retries, which will no longer be the responsibility of InvoicePayer.
2023-01-03 15:34:14 -05:00
Valentine Wallace
cc60fd601f
outbound_payment: put method signature closing paren on next line
in long method signatures
2022-12-21 16:26:55 -05:00
Valentine Wallace
60492d769a
Fix cfg(test) indentation 2022-12-20 21:23:54 -05:00
Valentine Wallace
8d5f7c87cb
Make add_new_pending_payment private to module
And expose it in testing only, for safety
2022-12-20 21:23:54 -05:00
Valentine Wallace
1ded1d21bd
Fix main build 2022-12-20 17:55:06 -05:00
Matt Corallo
f7211fbf79
Merge pull request #1910 from arik-so/2022-12-keys-interface-name-split
Split KeysInterface into EntropySource, NodeSigner, and SignerProvider
2022-12-20 22:19:43 +00:00
valentinewallace
e64ebe8608
Merge pull request #1923 from valentinewallace/2022-12-outbound-payment-mod
Abstract `ChannelManager` outbound payment logic
2022-12-20 15:40:48 -05:00
Arik Sosman
9d7bb73b59
Split out KeysInterface into EntropySource, NodeSigner, and SignerProvider. 2022-12-20 10:09:11 -08:00
Valentine Wallace
afdaa64b44
Rename send_payment and retry_payment for retries
Once ChannelManager supports payment retries, it will make more sense for its
current send_payment method to be named send_payment_with_route because
retrying should be the default. Here we get a head start on this by making the
rename in outbound_payment, but not changing the public interface yet.
2022-12-19 21:08:08 -05:00
Valentine Wallace
3e89cc7e08
Reduce visibility of outbound payment methods 2022-12-19 21:08:08 -05:00
Valentine Wallace
ec55730959
Start parameters on a newline if they don't fit
Separating out this commit to keep the main refactor move-only
2022-12-19 21:08:03 -05:00
Valentine Wallace
e69a4c2636
Remove unnecessary mut in finalize_claims 2022-12-19 21:04:58 -05:00
Valentine Wallace
afd31507d9
Swap pending_outbound_payments for OutboundPayments struct
This allows us to move a lot of outbound payment logic out of ChannelManager
and into the new outbound_payment module, and helps avoid growing
ChannelManager when we add retry logic to it in upcoming work.
2022-12-19 21:04:53 -05:00
Valentine Wallace
278ebd208a
Move PaymentSendFailure into outbound_payment module
And re-export it in channelmanager.rs so it can remain public
2022-12-19 14:10:03 -05:00
Valentine Wallace
070832643f
Move PendingOutboundPayment to new outbound_payment module
We want to move all outbound payment-related things to this new module, to help
break up ChannelManager so future payment retries work doesn't increase the
size of ChannelManager.
2022-12-19 14:09:59 -05:00
Wilmer Paulino
ff48f5df4d
Avoid redundant broadcast of local commitment transaction
This change follows the rationale of commit 62236c7 and addresses the
last remaining redundant local commitment broadcast.

There's no need to broadcast our local commitment transaction if we've
already seen a confirmed one as it'll be immediately rejected as a
duplicate/conflict.

This will also help prevent dispatching spurious events for bumping
commitment and HTLC transactions through anchor outputs since the
dispatch for said events follows the same flow as our usual commitment
broadcast.
2022-12-16 11:54:26 -08:00
Matt Corallo
2d6818376c Drop forwarded HTLCs which were still pending at persist-time
If, after forwarding an intercepted payment to our counterparty, we
restart with a ChannelMonitor update having been persisted, but the
corresponding ChannelManager update not having been persisted,
we'll still have the intercepted HTLC in the
`pending_intercepted_htlcs` map on start (and potentially a pending
`HTLCIntercepted` event). This will cause us to allow the user to
handle the forwarded HTLC twice, potentially double-forwarding it.

This builds on 0bb87ddad7, which
provided a preemptive fix for the general relay case (though it was
not an actual issue at the time). We simply check for the HTLCs
having been forwarded on startup and remove them from the map.

Fixes #1858
2022-12-13 19:33:58 +00:00
Matt Corallo
0fa67fb96c
Merge pull request #1892 from tnull/2022-12-spendableoutputdescriptor-doccs
Clean up docs in `keysinterface.rs`
2022-12-12 22:45:00 +00:00
Matt Corallo
b291f4ab7a
Merge pull request #1907 from TheBlueMatt/2022-12-abandon-crash-reset
Note that abandon_payment does not persist the state update in docs
2022-12-12 22:16:43 +00:00
Elias Rohrer
03de0598af
Clean up docs in keysinterface.rs 2022-12-12 21:31:26 +01:00
Matt Corallo
1969b48b7a Note that abandon_payment does not persist the state update in docs
If a user calls `abandon_payment`, then restarts without freshly
persisting the `ChannelManager`, the payment will still be pending
on restart. This was unclear from the docs (and the docs seemed to
imply otherwise). Because this doesn't materially impact the
usability of `abandon_payment` (users shouldn't be called
`retry_payment` on an abandoned one anyway), we simply document it.

Fixes #1804.
2022-12-12 19:59:19 +00:00
Matt Corallo
a4df59b377
Merge pull request #1904 from TheBlueMatt/2022-12-1825-followups
Trivial Followups to #1825
2022-12-12 17:58:21 +00:00
valentinewallace
4a0010d739
Merge pull request #1738 from jkczyz/2022-09-invoice-request
BOLT 12 `invoice_request` encoding and building
2022-12-12 11:25:07 -05:00
Matt Corallo
626c60600e
Merge pull request #1886 from TheBlueMatt/2022-11-claim-relock
Relock `channel_state` in for each HTLC in `claim_funds` and lay the groundwork for async event generation
2022-12-12 03:10:38 +00:00
Jeffrey Czyz
0c621646a6
Invoice request message interface and data format
Define an interface for BOLT 12 `invoice_request` messages. The
underlying format consists of the original bytes and the parsed
contents.

The bytes are later needed when constructing an `invoice` message. This
is because it must mirror all the `offer` and `invoice_request` TLV
records, including unknown ones, which aren't represented in the
contents.

The contents will be used in `invoice` messages to avoid duplication.
Some fields while required in a typical user-pays-merchant flow may not
be necessary in the merchant-pays-user flow (e.g., refund, ATM).
2022-12-09 08:53:33 -06:00
Matt Corallo
616d3ac784 Add second TODO when claiming to mirror the existing TODO on claim fail 2022-12-08 21:24:26 +00:00
Matt Corallo
7c48151c22 Drop unused link in claim_funds 2022-12-08 21:24:26 +00:00
Matt Corallo
b331778e34 Drop now-unused ClaimFundsFromHop enum and replace with an Err 2022-12-08 21:24:26 +00:00
Matt Corallo
1feb459811 Handle claim result event generation in claim_funds_from_hop
Currently `claim_funds` and `claim_funds_internal` call
`claim_funds_from_hop` and then surface and `Event` to the user
informing them of the forwarded/claimed payment based on it's
result. In both places we assume that a claim "completed" even if
a monitor update is being done async.

Instead, here we push that event generation through a
`MonitorUpdateCompletionAction` and a call to
`handle_monitor_update_completion_action`. This will allow us to
hold the event(s) until async monitor updates complete in the
future.
2022-12-08 21:24:26 +00:00
Matt Corallo
def193d6bd Don't hold channel_state lock for entire duration of claim_funds
When `claim_funds` has to claim multiple HTLCs as a part of a
single MPP payment, it currently does so holding the
`channel_state` lock for the entire duration of the claim loop.
Here we swap that for taking the lock once for each HTLC. This
allows us to be more flexible with locks going forward, and
ultimately isn't a huge change - if our counterparty intends to
force-close a channel, us choosing to ignore it by holding the
`channel_state` lock for the duration of the claim isn't going to
result in a commitment update, it will just result in the preimage
already being in the `ChannelMonitor`.
2022-12-08 21:24:26 +00:00
Matt Corallo
7b77a016b5 Handle closed-chan HTLC claims in claim_funds_from_hop
Currently `claim_funds` does all HTLC claims in one `channel_state`
lock, ensuring that we always make claims from channels which are
open. It can thus avoid ever having to generate a
`ChannelMonitorUpdate` containing a preimage for a closed channel,
which we only do in `claim_funds_internal` (for forwarded payments).

In the next commit we'll change the locking of
`claim_funds_from_hop` so that `claim_funds` is no longer under a
single lock but takes a lock for each claim. This allows us to be
more flexible with locks going forward, and ultimately isn't a huge
change - if our counterparty intends to force-close a channel, us
choosing to ignore it by holding the `channel_state` lock for the
duration of the claim isn't going to result in a commitment update,
it will just result in the preimage already being in the
`ChannelMonitor`.
2022-12-08 21:24:26 +00:00
Matt Corallo
bffbd3784d Add support for handling "actions" after a monitor update completes
This adds a new enum, `MonitorUpdateCompletionAction` and a method
to execute the "actions". They are intended to be done once a
(potentially-async) `ChannelMonitorUpdate` persistence completes,
however this behavior will be implemented in a future PR. For now,
this adds the relevant infrastructure which will allow us to
prepare `claim_funds` for better monitor async handling.
2022-12-08 21:24:26 +00:00
Matt Corallo
27e59ef01a Store pending claims awaiting monitor update in a separate map
In the next commits we'll move to generating `PaymentClaimed`
events while handling `ChannelMonitorUpdate`s rather than directly
in line. Thus, as a prerequisite, here we move to storing the info
required to generate the `PaymentClaimed` event in a separate map.

Note that while this does introduce a new map which is written as
an even value which users cannot opt out of, the map is only filled
in when users use the asynchronous `ChannelMonitor` updates and
after a future PR. As these are still considered beta, breaking
downgrades for such users is considered acceptable in the future PR
(which will likely be one LDK version later).
2022-12-08 19:52:28 +00:00
Matt Corallo
381e8b9678 Use Witness::push_bitcoin_signature where relevant 2022-12-07 23:17:58 +00:00
Matt Corallo
d9d4611e65
Merge pull request #1863 from TheBlueMatt/2022-11-holding-cell-batch-update
Lean on the holding cell when batch-forwarding/failing HTLCs
2022-12-07 17:52:04 +00:00
Matt Corallo
eea56e967f
Merge pull request #1825 from wpaulino/anchors-bump-htlc-resolution-event
Introduce new BumpTransactionEvent variant HTLCResolution
2022-12-07 05:51:27 +00:00