Commit graph

5578 commits

Author SHA1 Message Date
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
Wilmer Paulino
64c58a565b
Merge pull request #2280 from TheBlueMatt/2023-05-event-deadlock
Never block a thread on the `PeerManager` event handling lock
2023-05-24 10:51:16 -07:00
Matt Corallo
0c034e9a82 Never block a thread on the PeerManager event handling lock
If thre's a thread currently handling `PeerManager` events, the
next thread which attempts to handle events will block on the first
and then handle events after the first completes. (later threads
will return immediately to avoid blocking more than one thread).

This works fine as long as the user has a spare thread to leave
blocked, but if they don't (e.g. are running with a single-threaded
tokio runtime) this can lead to a full deadlock.

Instead, here, we never block waiting on another event processing
thread, returning immediately after signaling that the first thread
should start over once its complete to ensure all events are
handled.

While this could lead to starvation as we cause one thread to go
around and around and around again, the risk of that should be
relatively low as event handling should be pretty quick, and it's
certainly better than deadlocking.

Fixes https://github.com/lightningdevkit/rapid-gossip-sync-server/issues/32

Atomic lock simplification suggestion from @andrei-21
2023-05-24 02:39:37 +00:00
Matt Corallo
7f3701a399
Merge pull request #2284 from dunxen/2023-05-netgraphpartialeqtotallock
Use a total lockorder for `NetworkGraph`'s `PartialEq` impl
2023-05-24 00:14:25 +00:00
Duncan Dean
6418a86e51
Use a total lockorder for NetworkGraph's PartialEq impl
`NetworkGraph`'s `PartialEq` impl before this commit was deadlock-prone.
Similarly to `ChannelMonitor`'s, `PartialEq` impl, we use position in
memory for a total lockorder. This uses the assumption that the objects
cannot move within memory while the inner locks are held.
2023-05-23 22:51:22 +02:00
Matt Corallo
b09ccd10be Consider HTLC in-flight count limits 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 the number of in-flight HTLCs which we are allowed
to push towards a counterparty at once, setting the available
balance to zero if we cannot push any further HTLCs.

We also add some testing when sending to ensure that send failures
are accounted for in our balance calculations.
2023-05-21 19:05:22 +00:00
Gleb Naumenko
e43cfbd5f1 Consider commitment tx fee while 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 include the cost of the commitment transaction fee in our
calculation, subtracting the commitment tx fee cost from the
available as we do in `send_payment`.

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

This commit is based on original work by
Gleb Naumenko <naumenko.gs@gmail.com> and modified by
Matt Corallo <git@bluematt.me>.
2023-05-21 19:05:22 +00:00
Matt Corallo
4b900b7e08 Simplify test_fail_holding_cell_htlc_upon_free_multihop somewhat
In the coming commits we redo our next-HTLC-available logic which
requires some minor test changes for tests which relied on
calculating routes which were not usable.

Here we do a minor prefactor to simplify a test which now no longer
requires later changes.
2023-05-21 19:05:22 +00:00
Matt Corallo
2290141ed9 Disallow sending an HTLC when the balance needed is pending removal
While its nice to be able to push an HTLC which spends balance that
is removed in our local commitment transaction but awaiting an RAA
from our peer for final removal its by no means a critical feature.

Because peers should really be sending RAAs quickly after we send
a commitment, this should be an exceedingly rare case, and we
already don't expose this as available balance when routing, so
this isn't even made available when sending, only forwarding.

Note that `test_pending_claimed_htlc_no_balance_underflow` is
removed as it tested a case which was only possible because of this
and now is no longer possible.
2023-05-21 19:05:22 +00:00
Matt Corallo
6775b957bc
Merge pull request #2272 from benthecarman/package-broadcast
Support broadcasting multiple transactions at once
2023-05-21 01:53:35 +00:00
Matt Corallo
bada71394e
Merge pull request #2235 from TheBlueMatt/2023-04-criterion
Replace std's unmaintained bench with criterion
2023-05-20 23:02:44 +00:00
Matt Corallo
6aca7e1c4d
Merge pull request #2226 from alecchendev/2023-04-persist-network-graph-on-rgs
Update BP `NetworkGraph` and `Scorer` persist frequency
2023-05-20 22:55:43 +00:00
Matt Corallo
498f233145
Merge pull request #2204 from jkczyz/2023-04-custom-feature-bits
Support for custom feature bits
2023-05-18 19:28:19 +00:00
Matt Corallo
78663947a8
Merge pull request #1841 from ariard/2022-11-revoked-balance-non-aggregable
Post-anchor: do not aggregate claim of revoked output
2023-05-18 19:24:55 +00:00
Valentine Wallace
88821cbd0c
Rename EffectiveCapacity::MaximumHTLC to ::AdvertisedMaxHTLC
Also get rid of some trailing whitespace because my text editor likes to do
that.

We'll next add a new variant for max_htlc provided in route hints, which will
be treated differently in scoring.
2023-05-17 18:43:56 -04:00
Antoine Riard
5e968ed107 Remove aggregable flag from PackageTemplate constructor 2023-05-16 23:02:03 +01:00
Antoine Riard
b9aa902e51 Anchor: do not aggregate claim of revoked output
See https://github.com/lightning/bolts/pull/803

This protect the justice claim of counterparty revoked output. As
otherwise if the all the revoked outputs claims are batched in a
single transaction, low-feerate HTLCs transactions can delay our
honest justice claim transaction until BREAKDOWN_TIMEOUT expires.
2023-05-16 01:51:48 +01:00
Alec Chen
2afbdf5d1c Persist scorer upon update based on event handling
Now that we persist the scorer upon events, we extend timer persistence
from 30 seconds to 1 hour, similar to network graph persistence.
2023-05-15 18:53:04 -05:00
Alec Chen
ad8ab4d722 Prune and persist RGS network graph after initial sync
Previously we would wait 60 seconds after startup, however for RGS we
prune/persist after its initial sync since 60 seconds is likely too
long.
2023-05-15 18:51:08 -05:00
Matt Corallo
5c89d01905
Merge pull request #2288 from wpaulino/rust-bitcoin-30-prereqs 2023-05-15 18:42:38 +00:00
benthecarman
29b392a96d
Support broadcasting multiple transactions at once 2023-05-12 23:29:38 -05:00
Matt Corallo
d7f6e34b73
Merge pull request #2271 from tnull/2023-04-fix-onion-panic
Return error when failing onion packet construction
2023-05-11 21:52:47 +00:00
Matt Corallo
288fe0298a
Merge pull request #2286 from benthecarman/spendable-outputs-psbt
Create and Sign PSBTs for spendable outputs
2023-05-11 21:41:07 +00:00
Elias Rohrer
de6649cb25
Return error when failing to construc onion messages
Previously, we would panic when failing to construct onion messages in
certain circumstances. Here we opt to always rather error out and don't
panic if something goes wrong during OM packet construction.
2023-05-11 18:23:47 +02:00
Matt Corallo
4b27cc486c Update .gitignore to ignore benchmark data files 2023-05-11 06:11:51 +00:00
Matt Corallo
6ddc88b8d7 Add trivial README to bench to describe how to run them. 2023-05-11 06:11:51 +00:00
Matt Corallo
1701b02124 Replace std's unmaintained bench with criterion
Rather than using the std benchmark framework (which isn't
maintained and is unlikely to get any further maintenance), we swap
for criterion, which at least gets us a variable number of test
runs so our benchmarks don't take forever.

We also fix the RGS benchmark to pass now that the file in use is
stale compared to today's date.
2023-05-11 06:11:49 +00:00
Matt Corallo
2775902f3a Add an additional test/bench for routing larger amounts, score more
When benchmarking our router, we previously only ever tested with
amounts under 1,000 sats, which is an incredibly small amount.
While this ensures we have the maximal number of available channels
to consider, it prevents our scorer from getting exercise across
its range. Further, we only score the immediate path we are
expecting to to send over, and not randomly but rather based on the
amount sent.

Here we try to make the benchmarks a bit more realistic by adding
a new benchmark which attempts to send around 100K sats, which is
a reasonable amount to send over a channel today. We also convert
the scoring data to be randomized based on the seed as well as
attempt to (possibly) find a new route for a much larger value and
score based on that. This potentially allows us to score multiple
potential paths between the source and destination as the large
route-find may return an MPP result.
2023-05-11 05:49:17 +00:00
Matt Corallo
fbaa3c4855 Unify route benchmarking with route tests
There's a few route tests which do the same thing as the benchmarks
as they're also a good test. However, they didn't share code, which
is somewhat wasteful, so we fix that here.
2023-05-11 05:42:21 +00:00
Matt Corallo
e61b128967
Merge pull request #2237 from henghonglee/issue-2189-score-params
[#2189] Score Fee Params as a passed in parameter
2023-05-11 05:27:14 +00:00
benthecarman
8c0479ac53
Create and Sign PSBTs for spendable outputs 2023-05-10 20:19:35 -05:00
henghonglee
86af670afa Move functions around to colocate impl of FeeParams and DecayParams 2023-05-10 15:32:29 -07:00
henghonglee
21b0818be7 Score's FeeParams as passed-in params on Routefinding functions
This PR aims to create a "stateless" scorer. Instead of passing
in fee params at construction-time, we want to parametrize the
scorer with an associated "parameter" type, which is then
passed to the router function itself, and allows passing
different parameters per route-finding call.
2023-05-10 12:53:42 -07:00
Jeffrey Czyz
432d180898
Update missed comment in Features test 2023-05-10 14:06:33 -05:00