Commit graph

5410 commits

Author SHA1 Message Date
Jeffrey Czyz
0970f3f63f
Remove custom blinded path test vector
These were added to help debug an encoding issue. However, the encoding
code was moved to the blinded_path module. Additionally, the test vector
used an old TLV encoding.
2023-06-07 16:55:09 -05:00
benthecarman
06c6750b54
Add helper for getting claimable balance
It is annoying to have to match across all the enums of `Balance` to
just pull out the `claimable_amount_satoshis` value. This helper makes
it easier if you just want to amount.
2023-06-07 13:39:50 -05:00
Vladimir Fomene
b5c89cc977
Use PrintableString for displaying errors in PeerManager
We currently just print "with non-ASCII error message"
to log when we see non-ASCII chars, but should instead
use our fancy PrintableString type to display the
untrusted string and ignore control chars.
2023-06-07 21:38:23 +03:00
Matt Corallo
f068df03c5
Merge pull request #2312 from TheBlueMatt/2023-05-next-htlc-min-max
Avoid generating unpayable routes due to balance restrictions
2023-06-07 17:03:01 +00:00
valentinewallace
7a78998552
Merge pull request #2305 from valentinewallace/2023-05-respect-hint-maxhtlc
Respect route hint `max_htlc` in pathfinding
2023-06-07 15:02:26 +02:00
Matt Corallo
583a5b2748
Merge pull request #2330 from wvanlint/partial_config_updates
Support atomic partial updates to ChannelConfig
2023-06-07 01:02:48 +00:00
Matt Corallo
4bc3a79365 Slightly improve docs on next_*_commit_tx_fee_msat 2023-06-06 23:57:56 +00:00
Matt Corallo
10e213cf40 Replace send_htlc amount checking with available balances
Now that the `get_available_balances` min/max bounds are exact, we
can stop doing all the explicit checks in `send_htlc` entirely,
instead comparing against the `get_available_balances` bounds and
failing if the amount is out of those bounds.

This breaks support for sending amounts below the dust limit if
there is some amount of dust exposure remaining before we hit our
cap, however we will no longer generate such routes anyway.
2023-06-06 23:57:56 +00:00
Matt Corallo
66c4f454f0 Ensure a 1:1 mapping of value sendable to send success in fuzzing
Now that the value available to send is expected to match the
success or failure of sending exactly, we should assert this in the
`chanmon_consistency` fuzzer.

In the next commit we'll actually rip the checks out of `send_htlc`
which will make this a somewhat less useful test, however fuzzing
on this specific commit can help to reveal bugs.
2023-06-06 23:57:56 +00:00
Matt Corallo
7edbf547fb Consider dust exposure when assembling a route
When calculating the amount available to send for the next HTLC, if
we over-count we may create routes which are not actually usable.

Historically this has been an issue, which we resolve over a few
commits.

Here we consider how much adding one additional (dust) HTLC would
impact our total dust exposure, setting the new next-HTLC-minimum
field to require HTLCs be non-dust if required or set our next-HTLC
maximum if we cannot send a dust HTLC but do have some additional
exposure remaining.

We also add some testing when sending to ensure that send failures
are accounted for in our balance calculations.

Fixes #2252.
2023-06-06 23:57:56 +00:00
Matt Corallo
3aa8a1721c Add a next-outbound-HTLC minimum field to chan details and use it
In the coming commits, in order to ensure all routes we generate
are usable, we'll start calculating the next-HTLC minimum for our
channels and using it in the router. Here we set this up by adding
an always-0 field for it in `ChannelDetails` and use it when
routing.
2023-06-06 23:57:55 +00:00
Matt Corallo
52a90577f2 Consider counterparty commitment tx fees when assembling a route
When calculating the amount available to send for the next HTLC, if
we over-count we may create routes which are not actually usable.

Historically this has been an issue, which we resolve over a few
commits.

Here we consider whether one additional HTLC's commitment tx fees
would result in the counterparty's commitment tx fees being greater
than the reserve we've picked for them and, if so, limit our next
HTLC value to only include dust HTLCs.

We also add some testing when sending to ensure that send failures
are accounted for in our balance calculations.

This, and the previous few commits, fixes #1126.
2023-06-06 23:57:55 +00:00
Willem Van Lint
8fd8966b9a Support atomic partial updates to ChannelConfig 2023-06-06 16:17:47 -07:00
valentinewallace
9cafede23c
Merge pull request #2340 from TheBlueMatt/2023-06-fix-docs
Remove spurious docs which imply you cannot retry a failed payment
2023-06-06 16:41:22 +02:00
Valentine Wallace
f130f95018
Account for used liquidity in first hops when processing route hints
.. in get_route.
2023-06-06 15:15:30 +02:00
Valentine Wallace
14cd18b5e6
Abide by route hint max_htlc in pathfinding 2023-06-06 15:12:18 +02:00
Matt Corallo
60ce627b23 Remove spurious double comma in documentation 2023-06-06 00:44:06 +00:00
Matt Corallo
632c0d22b5 Remove spurious docs which imply you cannot retry a failed payment
If a payment (fully) fails, users are free to retry it, its only
once a payment succeeds that a user must never retry it.
2023-06-05 23:53:45 +00:00
Jeffrey Czyz
486c16a26d
Merge pull request #2290 from upjohnc/2240_replace_vectors_with_iterators
Set return type to Iterator for functions in file: `lightning-invoice/src/utils.rs` : issue #2240
2023-06-05 13:43:46 -05:00
Matt Corallo
166f32621d
Merge pull request #2329 from dunxen/2023-05-initgenesischeck
Add support for `networks` field in `Init` message
2023-06-05 18:14:17 +00:00
Duncan Dean
b52b936bdd
Send and handle networks field in Init messages
If the `networks` field is present in a received `Init` message, then
we need to make sure our genesis chain hash matches one of those, otherwise
we should disconnect the peer.

We now also always send our genesis chain hash in `Init` messages to
our peers.
2023-06-05 09:45:48 +02:00
Duncan Dean
e23102f565
Add networks TLV to Init's TLV stream
This was a fairly old introduction to the spec to allow nodes to indicate
to their peers what chains they are interested in (i.e. will open channels
and gossip for).

We don't do any of the handling of this message in this commit and leave
that to the very next commit, so the behaviour is effectively the same
(ignore networks preference).
2023-06-05 09:45:41 +02:00
Jeffrey Czyz
ede06d84de
Merge pull request #2332 from danielgranhao/fix/wrong-docs-link-channel-manager-send-payment
Fix wrong link in `ChannelManager::send_payment()` docs
2023-06-02 15:47:51 -05:00
Jeffrey Czyz
b6bb32ce14
Remove duplicate BOLT 12 test vector 2023-06-02 14:20:30 -05:00
Daniel Granhão
490ab6e453
Fix wrong link in ChannelManager::send_payment() docs 2023-06-02 17:29:52 +01:00
Matt Corallo
fb140b55c7
Merge pull request #2328 from benthecarman/partial-eq-in-mem-signer
Impl PartialEq and Debug for InMemorySigner
2023-06-01 19:51:24 +00:00
Chad Upjohn
ec67ee7020 Refactor lightning-invoice/src/utils.rs to yield iterators
- two functions refatored: `select_phantom_hints`, `sort_and_filter_channels`
2023-06-01 14:45:38 -05:00
benthecarman
a8a7fc1092
Impl PartialEq and Debug for InMemorySigner
These are needed for being able to compare a
ChannelMonitor<InMemorySigner> and are just nice to haves for
developers.
2023-05-31 18:19:31 -05:00
Matt Corallo
32eb89474c
Merge pull request #2167 from TheBlueMatt/2023-04-monitor-e-monitor-prep
Add infra to block ChannelMonitorUpdates on forwarded claims
2023-05-31 22:48:34 +00:00
Matt Corallo
91536edb0d
Merge pull request #2324 from dunxen/2023-05-rgscheckgenesishash
Fail RGS data processing early if there is a chain hash mismatch
2023-05-31 19:21:10 +00:00
Chad Upjohn
31807bc2f6 Adding rotate_through_iterators for select_phantom_hints refactor
- adding function to allow for select_phantom_hints to yield an iterator
2023-05-31 11:46:08 -05:00
Matt Corallo
394f54da31 Add infra to block ChannelMonitorUpdates on forwarded claims
When we forward a payment and receive an `update_fulfill_htlc`
message from the downstream channel, we immediately claim the HTLC
on the upstream channel, before even doing a `commitment_signed`
dance on the downstream channel. This implies that our
`ChannelMonitorUpdate`s "go out" in the right order - first we
ensure we'll get our money by writing the preimage down, then we
write the update that resolves giving money on the downstream node.

This is safe as long as `ChannelMonitorUpdate`s complete in the
order in which they are generated, but of course looking forward we
want to support asynchronous updates, which may complete in any
order.

Here we add infrastructure to handle downstream
`ChannelMonitorUpdate`s which are blocked on an upstream
preimage-containing one. We don't yet actually do the blocking which
will come in a future commit.
2023-05-30 23:05:03 +00:00
Matt Corallo
785bdb84cb Reapply pending ChannelMonitorUpdates on startup
If a `ChannelMonitorUpdate` was created and given to the user but
left uncompleted when the `ChannelManager` is persisted prior to a
restart, the user likely lost the `ChannelMonitorUpdate`(s). Thus,
we need to replay them for the user, which we do here using the
new `BackgroundEvent::MonitorUpdateRegeneratedOnStartup` variant.
2023-05-30 23:05:03 +00:00
Matt Corallo
e5070c4880 Process background events when taking the total_consistency_lock
When we generated a `ChannelMonitorUpdate` during `ChannelManager`
deserialization, we must ensure that it gets processed before any
other `ChannelMonitorUpdate`s. The obvious hook for this is when
taking the `total_consistency_lock`, which makes it unlikely we'll
regress by forgetting this.

Here we add that call in the `PersistenceNotifierGuard`, with a
test-only atomic bool to test that this criteria is met.
2023-05-30 23:05:02 +00:00
Matt Corallo
acbe41abe2 Handle BackgroundEvents replaying non-closing monitor updates
`BackgroundEvent` was used to store `ChannelMonitorUpdate`s which
result in a channel force-close, avoiding relying on
`ChannelMonitor`s having been loaded while `ChannelManager`
block-connection methods are called during startup.

In the coming commit(s) we'll also generate non-channel-closing
`ChannelMonitorUpdate`s during startup, which will need to be
replayed prior to any other `ChannelMonitorUpdate`s generated from
normal operation.

In the next commit we'll handle that by handling `BackgroundEvent`s
immediately after locking the `total_consistency_lock`.
2023-05-30 23:00:59 +00:00
Matt Corallo
eec5ec6b50
Merge pull request #2293 from wpaulino/disconnect-peers-timer-tick
Disconnect peers on timer ticks to unblock channel state machine
2023-05-30 18:30:49 +00:00
Matt Corallo
a2989129a7 Make AChannelManager trait slightly more generic and always on
Rather than letting `AChannelManager` be bounded by all traits
being `Sized` we make them explicitly `?Sized`. We also make the
trait no longer test-only as it will be used in a coming commit.
2023-05-30 18:15:32 +00:00
Matt Corallo
34d5f2afc4 Return the counterparty node_id as a part of a force-shutdown res
In the coming commits we'll need the counterparty node_id when
handling a background monitor update as we may need to resume
normal channel operation as a result. Thus, we go ahead and pipe it
through from the shutdown end, as it makes the codepaths
consistent.

Sadly, the monitor-originated shutdown case doesn't allow for a
required counterparty node_id as some versions of LDK didn't have
it present in the ChannelMonitor.
2023-05-30 18:15:32 +00:00
Matt Corallo
3ce1a5e087 Move the ShutdownResult type alias to channel.rs
This allows us to make the `force_shutdown` definition less verbose
2023-05-30 18:15:32 +00:00
Matt Corallo
660daaacdf Fix held_by_thread in no-std to return instead of panicing
Our `no-std` locks simply panic if a lock cannot be taken as there
should be no lock contention in a single-threaded environment.
However, the `held_by_thread` debug methods were delegating to the
lock methods which resulted in a panic when asserting that a lock
*is* held by the current thread.

Instead, they are updated here to call the relevant `RefCell`
testing methods.
2023-05-30 18:15:32 +00:00
Matt Corallo
a9d49aee5f
Merge pull request #2323 from ariard/2023-05-remove-ariard-pgp-key
Remove ariard key from the security team
2023-05-29 22:18:42 +00:00
Duncan Dean
142fdca66e
Fail RGS data processing early if there is a chain hash mismatch
No point in doing any extra processing if we don't even have a match
for the chain hash.
2023-05-29 16:15:42 +02:00
Antoine Riard
34322e1fad Remove ariard key from the security team 2023-05-28 20:58:06 +01:00
Alec Chen
749ae12e22
Allow user to opt-in to accepting MPP keysend
To support receiving MPP keysends, we will add a new non-backward
compatible field to `PendingHTLCRouting::ReceiveKeysend`, which will
break deserialization of `ChannelManager` on downgrades, so we allow the
user choose whether they want to do this. Note that this commit only
adds the config flag, while full MPP support is added in later commits.
2023-05-27 22:36:09 -05:00
Wilmer Paulino
5bf7fac69f
Disconnect peers on timer ticks to unblock channel state machine
At times, we've noticed that channels with `lnd` counterparties do not
receive messages we expect to in a timely manner (or at all) after
sending them a `ChannelReestablish` upon reconnection, or a
`CommitmentSigned` message. This can block the channel state machine
from making progress, eventually leading to force closes, if any pending
HTLCs are committed and their expiration is met.

It seems common wisdom for `lnd` node operators to periodically restart
their node/reconnect to their peers, allowing them to start from a fresh
state such that the message we expect to receive hopefully gets sent. We
can achieve the same end result by disconnecting peers ourselves
(regardless of whether they're a `lnd` node), which we opt to implement
here by awaiting their response within two timer ticks.
2023-05-26 14:40:19 -07:00
Wilmer Paulino
5ba2f8091f
Add new DisconnectPeerWithWarning variant to ErrorAction 2023-05-26 14:40:18 -07:00
Wilmer Paulino
6d4f105536
Remove unreachable warning message send on UnknownRequiredFeature read
`enqueue_message` simply adds the message to the outbound queue, it
still needs to be written to the socket with `do_attempt_write_data`.
However, since we immediately return an error causing the socket to be
closed, the message never actually gets sent.
2023-05-26 14:40:17 -07:00
Wilmer Paulino
55a7a03248
Implement enqueue_message trait requirements on Message enum
The inner structs of each enum variant already implemented them and we
plan to pass in `Message`s to `enqueue_message` in a future commit.
2023-05-26 14:40:14 -07:00
Wilmer Paulino
4dce209e97
Merge pull request #2316 from benthecarman/payment-err-dervies
Derive a PartialEq and Eq for PaymentError
2023-05-25 09:41:59 -07:00
benthecarman
3003f7d719
Derive a PartialEq and Eq for PaymentError
This lets users compare error types more easily without needing a match
statement.
2023-05-24 17:40:48 -05:00