rust-lightning/lightning-invoice
Matt Corallo 31049ed961 Delay RAA-after-next processing until PaymentSent is are handled
In 0ad1f4c943 we fixed a nasty bug
where a failure to persist a `ChannelManager` faster than a
`ChannelMonitor` could result in the loss of a `PaymentSent` event,
eventually resulting in a `PaymentFailed` instead!

As noted in that commit, there's still some risk, though its been
substantially reduced - if we receive an `update_fulfill_htlc`
message for an outbound payment, and persist the initial removal
`ChannelMonitorUpdate`, then respond with our own
`commitment_signed` + `revoke_and_ack`, followed by receiving our
peer's final `revoke_and_ack`, and then persist the
`ChannelMonitorUpdate` generated from that, all prior to completing
a `ChannelManager` persistence, we'll still forget the HTLC and
eventually trigger a `PaymentFailed` rather than the correct
`PaymentSent`.

Here we fully fix the issue by delaying the final
`ChannelMonitorUpdate` persistence until the `PaymentSent` event
has been processed and document the fact that a spurious
`PaymentFailed` event can still be generated for a sent payment.

The original fix in 0ad1f4c943 is
still incredibly useful here, allowing us to avoid blocking the
first `ChannelMonitorUpdate` until the event processing completes,
as this would cause us to add event-processing delay in our general
commitment update latency. Instead, we ultimately race the user
handling the `PaymentSent` event with how long it takes our
`revoke_and_ack` + `commitment_signed` to make it to our
counterparty and receive the response `revoke_and_ack`. This should
give the user plenty of time to handle the event before we need to
make progress.

Sadly, because we change our `ChannelMonitorUpdate` semantics, this
change requires a number of test changes, avoiding checking for a
post-RAA `ChannelMonitorUpdate` until after we process a
`PaymentSent` event. Note that this does not apply to payments we
learned the preimage for on-chain - ensuring `PaymentSent` events
from such resolutions will be addressed in a future PR. Thus, tests
which resolve payments on-chain switch to a direct call to the
`expect_payment_sent` function with the claim-expected flag unset.
2023-08-17 22:19:48 +00:00
..
fuzz Bump workspace to rust edition 2018 2022-10-21 14:47:34 -07:00
src Delay RAA-after-next processing until PaymentSent is are handled 2023-08-17 22:19:48 +00:00
tests Qualify the BOLT 11 semantic error type 2023-07-14 15:06:17 -05:00
.gitignore Pure import of lightning-invoice crate 2021-04-09 10:08:27 -04:00
Cargo.toml Bump crate versions to 0.0.116 release 2023-07-21 20:42:13 +00:00
README.md Clean up lightning-invoice Cargo.toml and README 2021-04-09 10:08:27 -04:00

lightning-invoice

Docs.rs

This repo provides data structures for BOLT 11 lightning invoices and functions to parse and serialize these from and to bech32.

Please be sure to run the test suite since we need to check assumptions regarding SystemTime's bounds on your platform. You can also call check_platform on startup or in your test suite to do so.