Commit graph

1629 commits

Author SHA1 Message Date
Jeffrey Czyz
dcffefae3d
Update missed references to get_route in docs 2022-06-02 13:15:15 -07:00
valentinewallace
ab20284e26
Merge pull request #1505 from tnull/2022-05-support-0conf-channeltype
Support `ZeroConf` channel type.
2022-06-02 13:02:25 -07:00
Matt Corallo
47045b0ac8 Do not panic on early tx broadcasts in fuzzing
If the user broadcasts a funding transaction before the
counterparty provides a `funding_signed` we will panic in
`check_get_channel_ready`. This is expected - the user did
something which may lead to loss of funds, and we *really* need to
let them know.

However, the fuzzer can do this and we shouldn't treat it as a bug,
its a totally expected panic. Thus, we disable the panic in fuzz.

Thanks to Chaincode for providing fuzzing resources which managed
to hit this panic.
2022-06-02 03:39:42 +00:00
Elias Rohrer
efad02b8be Implement ZeroConf feature. 2022-06-01 17:05:17 -07:00
Elias Rohrer
e98f68aee6 Rename FundingLocked to ChannelReady. 2022-05-30 17:07:09 -07:00
valentinewallace
a534a5e7af
Merge pull request #1434 from TheBlueMatt/2022-04-robust-payment-claims
Improve Robustness of Inbound MPP Claims Across Restart
2022-05-30 10:05:01 -07:00
Matt Corallo
531d6c8663 Change Event amt fields to amount_msat for clarity 2022-05-28 18:50:32 +00:00
Matt Corallo
8a5670245a Add internal docs for ChannelMonitor::payment_preimages 2022-05-28 00:02:49 +00:00
Matt Corallo
a12d37e063 Drop return value from fail_htlc_backwards, clarify docs
`ChannelManager::fail_htlc_backwards`' bool return value is quite
confusing - just because it returns false doesn't mean the payment
wasn't (already) failed. Worse, in some race cases around shutdown
where a payment was claimed before an unclean shutdown and then
retried on startup, `fail_htlc_backwards` could return true even
though (a duplicate copy of the same payment) was claimed, but the
claim event has not been seen by the user yet.

While its possible to use it correctly, its somewhat confusing to
have a return value at all, and definitely lends itself to misuse.

Instead, we should push users towards a model where they don't care
if `fail_htlc_backwards` succeeds - either they've locally marked
the payment as failed (prior to seeing any `PaymentReceived`
events) and will fail any attempts to pay it, or they have not and
the payment is still receivable until its timeout time is reached.

We can revisit this decision based on user feedback, but will need
to very carefully document the potential failure modes here if we
do.
2022-05-28 00:02:49 +00:00
Matt Corallo
11c2f12baa Do additional pre-flight checks before claiming a payment
As additional sanity checks, before claiming a payment, we check
that we have the full amount available in `claimable_htlcs` that
the payment should be for. Concretely, this prevents one
somewhat-absurd edge case where a user may receive an MPP payment,
wait many *blocks* before claiming it, allowing us to fail the
pending HTLCs and the sender to retry some subset of the payment
before we go to claim. More generally, this is just good
belt-and-suspenders against any edge cases we may have missed.
2022-05-28 00:02:49 +00:00
Matt Corallo
0e2542176b Provide a redundant Event::PaymentClaimed on restart if needed
If we crashed during a payment claim and then detected a partial
claim on restart, we should ensure the user is aware that the
payment has been claimed. We do so here by using the new
partial-claim detection logic to create a `PaymentClaimed` event.
2022-05-28 00:02:49 +00:00
Matt Corallo
0a2a40c4fd Add a PaymentClaimed event to indicate a payment was claimed
This replaces the return value of `claim_funds` with an event. It
does not yet change behavior in any material way.
2022-05-28 00:02:49 +00:00
Matt Corallo
ce7b0b4ca2
Merge pull request #1401 from TheBlueMatt/2022-02-0conf-round-two
Zero Conf Channels
2022-05-27 16:54:52 -07:00
Matt Corallo
86ad2527bd Add test of 0conf channels getting the funding transaction reorg'd
In a previous version of the 0-conf code we did not correctly
handle 0-conf channels getting the funding transaction reorg'd out
(and the real SCID possibly changing on us).
2022-05-27 22:40:07 +00:00
Matt Corallo
7ed7a7d22e Correctly handle sending announcement sigs on public 0conf channels 2022-05-27 22:40:07 +00:00
Matt Corallo
8be97f0389 Add a new test for 0conf-with-monitor-update-failures
This tests a few cases of monitor failure updates that were broken
in earlier versions of the 0conf patchset.
2022-05-27 22:40:07 +00:00
Matt Corallo
26288e3014 Expose outbound SCID alias in ChannelDetails and use in routing
This supports routing outbound over 0-conf channels by utilizing
the outbound SCID alias that we assign to all channels to refer to
the selected channel when routing.
2022-05-27 22:40:07 +00:00
Matt Corallo
ff9e4572b6 Send funding_locked immediately for inbound channels with 0conf 2022-05-27 22:40:07 +00:00
Matt Corallo
9569bfe820 Add API and signaling to accept incoming channels at 0conf 2022-05-27 22:40:07 +00:00
Matt Corallo
35cd39da15 Lock outbound channels at 0conf if the peer indicates support for it
If our peer sets a minimum depth of 0, and we're set to trusting
ourselves to not double-spend our own funding transactions, send a
funding_locked message immediately after funding signed.

Note that some special care has to be taken around the
`channel_state` values - `ChannelFunded` no longer implies the
funding transaction is confirmed on-chain. Thus, for example, the
should-we-re-broadcast logic has to now accept `channel_state`
values greater than `ChannelFunded` as indicating we may still need
to re-broadcast our funding tranasction, unless `minimum_depth` is
greater than 0.

Further note that this starts writing `Channel` objects with a
`MIN_SERIALIZATION_VERSION` of 2. Thus, LDK versions prior to
0.0.99 (July 2021) will now refuse to read serialized
Channels/ChannelManagers.
2022-05-27 22:40:07 +00:00
Matt Corallo
585493a3e1 Handle cases where a channel is in use w/o an SCID in ChannelManager
In the next few commits we add support for 0conf channels, allowing
us to have an active channel with HTLC and other updates flying
prior to having an SCID available. This would break several
assumptions made in `ChannelManager`, which we address here by
looking at SCID aliases in addition to SCIDs.
2022-05-27 22:40:07 +00:00
valentinewallace
1fd6c6fb9f
Merge pull request #1481 from TheBlueMatt/2022-05-new-chain-tests
Test coverage for `transaction_unconfirmed`
2022-05-27 10:38:42 -07:00
Matt Corallo
08ab6581f1
Merge pull request #1494 from TheBlueMatt/2022-05-mon-cleanups-renames
Correct variable names in `ChannelMonitor` and DRY tests
2022-05-26 11:11:08 -07:00
Matt Corallo
28c70ac506 Ensure all HTLCs for a claimed payment are claimed on startup
While the HTLC-claim process happens across all MPP parts under one
lock, this doesn't imply that they are claimed fully atomically on
disk. Ultimately, an application can crash after persisting one
`ChannelMonitorUpdate` out of multiple monitor updates needed for
the full claim.

Previously, this would leave us in a very bad state - because of
the all-channels-available check in `claim_funds` we'd refuse to
claim the payment again on restart (even though the
`PaymentReceived` event will be passed to the user again), and we'd
end up having partially claimed the payment!

The fix for the consistency part of this issue is pretty
straightforward - just check for this condition on startup and
complete the claim across all channels/`ChannelMonitor`s if we
detect it.

This still leaves us in a confused state from the perspective of
the user, however - we've actually claimed a payment but when they
call `claim_funds` we return `false` indicating it could not be
claimed.
2022-05-26 00:53:11 +00:00
Matt Corallo
d443b79743 Correct bogus references to revocation_point in ChannelMonitor
The `ChannelMonitor` had a field for the counterparty's
`cur_revocation_points`. Somewhat confusingly, this actually stored
the counterparty's *per-commitment* points, not the (derived)
revocation points.

Here we correct this by simply renaming the references as
appropriate. Note the update in `channel.rs` makes the variable
names align correctly.
2022-05-26 00:50:30 +00:00
Matt Corallo
78c3080537 Rename HTLC onchain_value_satoshis to htlc_value_satoshis
In `HTLCUpdate` and `OnchainEvent` tracking, we store the HTLC
value (rounded down to whole satoshis). This is somewhat
confusingly referred to as the `onchain_value_satoshis` even though
it refers to the commitment transaction output value, not the value
available on chain (which may have been reduced by an
HTLC-Timeout/HTLC-Success transaction).
2022-05-26 00:50:30 +00:00
Matt Corallo
a847809b5a DRY SpendableOutput tests in monitor_tests.rs 2022-05-26 00:50:30 +00:00
Arik Sosman
a58ae4c97b
Introduce graph sync crate for fast-forwarding through gossip data downloaded from a server. 2022-05-25 01:21:33 -07:00
Elias Rohrer
ba7935d1f3 Use new spec repository URL. 2022-05-20 17:17:29 +02:00
Matt Corallo
bd1e20d49e Store an events::PaymentPurpose with each claimable payment
In fc77c57c3c we stopped using the
`FInalOnionHopData` in `OnionPayload::Invoice` directly and intend
to remove it eventually. However, in the next few commits we need
access to the payment secret when claimaing a payment, as we create
a new `PaymentPurpose` during the claim process for a new event.

In order to get access to a `PaymentPurpose` without having access
to the `FinalOnionHopData` we here change the storage of
`claimable_htlcs` to store a single `PaymentPurpose` explicitly
with each set of claimable HTLCs.
2022-05-19 18:16:53 +00:00
Matt Corallo
2a4259566e Enable removal of OnionPayload::Invoice::_legacy_hop_data later
In fc77c57c3c we stopped using the
`FinalOnionHopData` in `OnionPayload::Invoice` directly and renamed
it `_legacy_hop_data` with the intent of removing it in a few
versions. However, we continue to check that it was included in the
serialized data, meaning we would not be able to remove it without
breaking ability to serialize full `ChannelManager`s.

This fixes that by making the `_legacy_hop_data` an `Option` which
we will happily handle just fine if its `None`.
2022-05-19 18:16:53 +00:00
Matt Corallo
b083870554 Randomize the ConnectStyle during tests
We have a bunch of fancy infrastructure to ensure we can connect
blocks using all our different connection interfaces, but we only
bother to use it in a few select tests.

This expands our use of `ConnectStyle` to most of our tests by
simply randomizing the style in each test. This makes our tests
non-deterministic, but we print the connection style at start so
that it's easy to reproduce a failure deterministically.
2022-05-17 20:19:38 +00:00
Matt Corallo
c639920dca Make tests more robust against different connection styles
In the next commit we'll randomize the `ConnectStyle` used in each
test. However, some tests are slightly too prescriptive, which we
address here in a few places.
2022-05-17 20:19:38 +00:00
Matt Corallo
9ac483bc84 Add new block ConnectionStyles for transaction_unconfirmed
Previously `transaction_unconfirmed` was never called in tests!
2022-05-17 20:19:38 +00:00
valentinewallace
b20aea1cb0
Merge pull request #1472 from TheBlueMatt/2022-06-less-secp-ctx
Pull secp256k1 contexts from per-peer to per-PeerManager
2022-05-17 16:10:09 -04:00
Viktor Tigerström
d543ac04c4 Add missing counterparty_node_id in force_close_channel calls 2022-05-16 22:25:46 +02:00
Arik Sosman
a5629e5ca2
Merge pull request #1479 from ViktorTigerstrom/2022-05-pass-counterparty-id-to-functions
Pass `counterparty_node_id` to `ChannelManager` functions
2022-05-16 12:44:16 -07:00
valentinewallace
257a6f3e48
Merge pull request #1475 from atalw/2022-04-paymentforwarded-event
Expose `next_channel_id` in `PaymentForwarded` event
2022-05-16 14:21:39 -04:00
Matt Corallo
12e8e9f3db Store full blocks in the test blockchain tracker instead of headers 2022-05-16 02:16:20 +00:00
atalw
1ae1de97fd
Add next_channel_id in PaymentForwarded event
This update also includes a minor refactor. The return type of
`pending_monitor_events` has been changed to a `Vec` tuple with the
`OutPoint` type. This associates a `Vec` of `MonitorEvent`s with a
funding outpoint.

We've also renamed `source/sink_channel_id` to `prev/next_channel_id` in
the favour of clarity.
2022-05-15 09:41:18 +05:30
Matt Corallo
e5c988e00c
Merge pull request #1429 from TheBlueMatt/2022-04-drop-no-conn-possible 2022-05-14 19:35:47 +00:00
Viktor Tigerström
70fa465924 Pass counterparty_node_id to accept_inbound_channel 2022-05-14 20:32:44 +02:00
Viktor Tigerström
c581bab8be Pass counterparty_node_id to funding_transaction_generated 2022-05-14 20:32:44 +02:00
Viktor Tigerström
14e52cd7a6 Pass counterparty_node_id to force_close_channel 2022-05-14 20:32:44 +02:00
Viktor Tigerström
84a6e7bc51 Pass counterparty_node_id to close_channel functions 2022-05-14 20:32:44 +02:00
Viktor Tigerström
7893ddc721 Add counterparty_node_id to FundingGenerationReady 2022-05-14 02:15:32 +02:00
Matt Corallo
e6aaf7c72d Pull secp256k1 contexts from per-peer to per-PeerManager
Instead of including a `Secp256k1` context per
`PeerChannelEncryptor`, which is relatively expensive memory-wise
and nontrivial CPU-wise to construct, we should keep one for all
peers and simply reuse it.

This is relatively trivial so we do so in this commit.

Since its trivial to do so, we also take this opportunity to
randomize the new PeerManager context.
2022-05-11 20:02:29 +00:00
Matt Corallo
b5a63070f5
Merge pull request #1023 from TheBlueMatt/2021-07-par-gossip-processing 2022-05-11 17:24:16 +00:00
Matt Corallo
46009a5f83 Add a few more simple tests of the PeerHandler
These increase coverage and caught previous lockorder inversions.
2022-05-10 23:40:20 +00:00
Matt Corallo
45c1411b16 Require PartialEq for wire::Message in cfg(test)
...and implement wire::Type for `()` for `feature = "_test_utils"`.
2022-05-10 23:40:20 +00:00