Commit graph

995 commits

Author SHA1 Message Date
Matt Corallo
1f592b045f Do not log_debug when we receive duplicate gossip messages
We very often receive duplicate gossip messages, which now causes us
to log at the DEBUG level, which is almost certainly not what a
user wants. Instead, we add a new form of ErrorAction which causes
us to only log at the TRACE level.
2021-06-29 19:36:47 +00:00
Matt Corallo
7fa6a7d48e Allow logging to specify an explicit log level instead of a macro
For log entries which may have a variable level, we can't call an
arbitrary macro and need to be able to pass an explicit level. This
does so without breaking the compile-time disabling of certain log
levels.

Further, we "fix" the comparison order of log levels to make more
significant levels sort "higher", which implicitly makes more sense
than sorting "lower".

Finally, we remove the "Off" log level as no log entry should ever
be logged at the "Off" level - that would be nonsensical.
2021-06-29 19:36:47 +00:00
Matt Corallo
d36a875f98 More consistently log in msg handling, incl full msg logging at trace
This much more consistently logs information about messages
sent/received, including logging the full messages being
sent/received at the TRACE log level. Many other log messages which
are more often of interest were moved to the DEBUG log level.
2021-06-29 19:36:47 +00:00
Matt Corallo
3ea4279d55 Unify message sending to use PeerManager::enqueue_message
This makes our logging consistent and somewhat simplifies message
sending code in a few places.
2021-06-29 19:36:47 +00:00
Matt Corallo
133e28ffe6 Add error logs when a ChannelManager as inconsistent monitor state
We had a client application which provided inconsistent monitor
state when deserializing a ChannelManager, resulting in opaque and
generic "InvalidData" deserialization failures. Instead, we log
some informative (and appropriately scary) warning messages in
such cases.
2021-06-29 19:36:47 +00:00
Matt Corallo
a146ef2be2 Do not generate error messages when we receive our own gossip
When a peer sends us the routing graph, it may include gossip
messages for our channels, despite it not being a party to them.
This is completely fine, but we currently print a somewhat-scary
looking log messages in these cases, eg:

```
ERROR [lightning::ln::channelmanager:4104] Got a message for a channel from the wrong node!
TRACE [lightning::ln::peer_handler:1267] Handling SendErrorMessage HandleError event in peer_handler for node ... with message Got a message for a channel from the wrong node!
```

Instead, we should simply not consider this an "error" condition
and stay silent.
2021-06-23 01:35:26 +00:00
Matt Corallo
c5a6135edc log_debug information about network graph updates from payments 2021-06-23 01:35:26 +00:00
Matt Corallo
05157b1755 Clean up docs on peer_handler significantly.
There are various typo and grammatical fixes here, as well as
concrete updates to correctness.
2021-06-23 00:51:31 +00:00
Matt Corallo
4703d4e725 Do not require that no calls are made post-disconnect_socket
The only practical way to meet this requirement is to block
disconnect_socket until any pending events are fully processed,
leading to this trivial deadlock:

 * Thread 1: select() woken up due to a read event
 * Thread 2: Event processing causes a disconnect_socket call to
             fire while the PeerManager lock is held.
 * Thread 2: disconnect_socket blocks until the read event in
             thread 1 completes.
 * Thread 1: bytes are read from the socket and
             PeerManager::read_event is called, waiting on the lock
             still held by thread 2.

There isn't a trivial way to address this deadlock without simply
making the final read_event call return immediately, which we do
here. This also implies that users can freely call event methods
after disconnect_socket, but only so far as the socket descriptor
is different from any later socket descriptor (ie until the file
descriptor is re-used).
2021-06-21 20:25:40 +00:00
Matt Corallo
895d1a8504 [peer_handler] Drop unused return from get_peer_for_forwarding!()
This avoids a now-unnecessary SocketDescriptor clone() call in
addition to cleaning up the callsite code somewhat.
2021-06-21 19:45:17 +00:00
Matt Corallo
f76e14c425 Somewhat simplify message handling error mapping in peer_handler 2021-06-21 19:45:17 +00:00
Matt Corallo
ae39b2ce19 Drop peers_needing_send tracking and try to write for each peer
We do a lot of work to track which peers have buffers which need
to be flushed, when we could instead just try to flush ever peer's
buffer.
2021-06-21 19:45:17 +00:00
Matt Corallo
0426d6e7a9 Skip forwarding gossip messages to peers if their buffer is over-full 2021-06-21 19:45:17 +00:00
Matt Corallo
c56cd1ef3a Forward gossip msgs 2021-06-21 16:02:18 +00:00
Matt Corallo
9de22ae6fc Refactor message broadcasting out into a utility method
This will allow us to broadcast messages received in the next
commit.
2021-06-21 16:02:18 +00:00
Matt Corallo
a6463ec6cd Fix bogus reentrancy from read_event -> do_attempt_write_data
`Julian Knutsen <julianknutsen@users.noreply.github.com>` pointed
out in a previous discussion that `read_event` can reenter user
code despite the documentation stating explicitly that it will not.

This was addressed in #456 by simply codifying the reentrancy, but
its somewhat simpler to just drop the `do_attempt_write_data` call.

Ideally we could land most of Julian's work, but its still in need
of substantial git history cleanup to get it in a reviewable state
and this solves the immediate issue.
2021-06-21 16:02:18 +00:00
Matt Corallo
f4323d98b8 Drop unused "peer gone" handling in get_peer_for_forwarding!()
We can never assume that messages were reliably delivered whether
we placed them in the socket or not, so there isn't a lot of use in
explicitly handling the case that a peer was not connected when we
went to send it a message.

Two TODOs are left for the generation of a `FundingAbandoned` (or
similar) event, though it ultimately belongs in `ChannelManager`.
2021-06-21 16:02:18 +00:00
Gene Ferneau
da7a851d47
Use hashbrown replacements for std equivalents 2021-06-18 21:54:21 +00:00
Matt Corallo
84ac66e80f Make links in message signing docs rustdoc links
Latest rustc warns that "this URL is not a hyperlink" and notes that
"bare URLs are not automatically turned into clickable links". This
resolves those warnings.

Thanks to Joshua Nelson for pointing out the correct syntax for
this.
2021-06-17 16:58:59 +00:00
Matt Corallo
294009969a
Merge pull request #944 from TheBlueMatt/2021-06-0.0.99
0.0.98
2021-06-11 17:02:11 +00:00
Jeffrey Czyz
200f3d155c
Accept multi-hop route hints in get_route
Lightning invoices allow for zero or more multi-hop route hints. Update
get_route's interface to accept such hints, although only the last hop
from each is used for the time being.

Moves RouteHint from lightning-invoice crate to lightning crate. Adds a
PrivateRoute wrapper around RouteHint for use in lightning-invoice.
2021-06-11 08:44:32 -07:00
Matt Corallo
9c9081dfcb Bump versions to 0.0.98, lightning-invoice to 0.6.0 2021-06-08 21:08:29 +00:00
Matt Corallo
a8038a8234
Merge pull request #940 from TheBlueMatt/2021-06-fix-docs
Clean up docs on public chan_utils methods to be more useful
2021-06-08 02:28:46 +00:00
Matt Corallo
1d4f9c8dec
Merge pull request #936 from TheBlueMatt/2021-05-spendable-event-locktime-delay
Delay DelayedPaymentOutput spendable events until the CSV delay
2021-06-08 01:53:03 +00:00
Matt Corallo
8cdc855f01 Clean up docs on public chan_utils methods to be more useful 2021-06-08 01:52:09 +00:00
Matt Corallo
ffec147f0f
Merge pull request #939 from TheBlueMatt/2021-05-derives
Add additional derives for a few structs
2021-06-08 01:51:41 +00:00
Devrandom
b22e5c0c9b Remove unwanted check in accept_channel
This caused an interoperability issue with lnd, because they can propose a reserve lower than their dust limit (but not lower than ours).
2021-06-07 16:22:07 +02:00
Matt Corallo
ed6a69c1cf Add additional derives for a few structs 2021-06-02 16:21:00 +00:00
Matt Corallo
e60ccbb1a8 Delay DelayedPaymentOutput spendable events until the CSV delay 2021-06-01 22:32:56 +00:00
Matt Corallo
3996eaab6e Merge pull request #935 from TheBlueMatt/2021-05-enum-tlvs
TLV-ize enum serialization and a few additional structs
2021-06-01 21:53:15 +00:00
Matt Corallo
73576574a9 Update network graph sample used in benchmarks 2021-06-01 21:53:06 +00:00
Matt Corallo
c56265d225 Convert SpendableOutputDescriptor to new TLV-based serialization 2021-06-01 21:53:06 +00:00
Matt Corallo
3c93967cd2 Clean up ChannelMonitor object serialization to use TLVs/versions 2021-06-01 21:53:06 +00:00
Matt Corallo
9e5d9516dd Use TLVs inside of serialization of Event variants 2021-06-01 21:53:06 +00:00
Matt Corallo
66784e32fe Convert remaining channel inner structs and enums to TLV-based ser 2021-06-01 21:53:06 +00:00
Matt Corallo
86641ea680 Convert most chain::* inner structs and enums to TLV-based ser macros 2021-06-01 21:53:06 +00:00
Matt Corallo
68313da695 Add generic serialization implementations for Boxs and 3-tuples
These are used in the next commit(s).
2021-06-01 21:53:06 +00:00
Matt Corallo
b385a40e4a Use TLV instead of explicit length for VecReadWrapper termination
VecReadWrapper is only used in TLVs so there is no need to prepend
a length before writing/reading the objects - we can instead simply
read until we reach the end of the TLV stream.
2021-06-01 21:53:06 +00:00
Matt Corallo
ccc828412e Add a macro to implement serialization of enums using TLVs 2021-06-01 21:53:06 +00:00
Devrandom
29bad58ff4 Expose test_process_background_events 2021-06-01 19:00:00 +02:00
Matt Corallo
0e41bba506 Give OnchainEvent::HTLCUpdate individual fields instead of a pair 2021-06-01 16:11:53 +00:00
Matt Corallo
77bdc32bbd
Merge pull request #933 from TheBlueMatt/2021-05-ser-fast
Speed up deserialization of secp256k1 objects significantly
2021-06-01 16:11:24 +00:00
Matt Corallo
7231b4a245 Add additional inline hints in serialization methods
This substantially improves deserialization performance when LLVM
decides not to inline many short methods, eg when not building
with LTO/codegen-units=1.

Even with the default bench params of LTO/codegen-units=1, the
serialization benchmarks on an Intel 2687W v3 take:

test routing::network_graph::benches::read_network_graph  ... bench: 1,955,616,225 ns/iter (+/- 4,135,777)
test routing::network_graph::benches::write_network_graph ... bench: 165,905,275 ns/iter (+/- 118,798)
2021-06-01 15:47:01 +00:00
Matt Corallo
583e6ac6f0 Impl serialized_length() without LengthCalculatingWriter
With the new `serialized_length()` method potentially being
significantly more efficient than `LengthCalculatingWriter`, this
commit ensures we call `serialized_length()` when calculating
length of a larger struct.

Specifically, prior to this commit a call to
`serialized_length()` on a large object serialized with
`impl_writeable`, `impl_writeable_len_match`, or
`encode_varint_length_prefixed_tlv` (and
`impl_writeable_tlv_based`) would always serialize all inner fields
of that object using `LengthCalculatingWriter`. This would ignore
any `serialized_length()` overrides by inner fields. Instead, we
override `serialized_length()` on all of the above by calculating
the serialized size using calls to `serialized_length()` on inner
fields.

Further, writes to `LengthCalculatingWriter` should never fail as
its `write` method never returns an error. Thus, any write failures
indicate a bug in an object's write method or in our
object-creation sanity checking. We `.expect()` such write calls
here.

As of this commit, on an Intel 2687W v3, the serialization
benchmarks take:

test routing::network_graph::benches::read_network_graph  ... bench: 2,039,451,296 ns/iter (+/- 4,329,821)
test routing::network_graph::benches::write_network_graph ... bench: 166,685,412 ns/iter (+/- 352,537)
2021-06-01 15:47:01 +00:00
Matt Corallo
c632fffc3d Avoid calling libsecp serialization fns when calculating length
When writing out libsecp256k1 objects during serialization in a
TLV, we potentially calculate the TLV length twice before
performing the actual serialization (once when calculating the
total TLV-stream length and once when calculating the length of the
secp256k1-object-containing TLV). Because the lengths of secp256k1
objects is a constant, we'd ideally like LLVM to entirely optimize
out those calls and simply know the expected length. However,
without cross-language LTO, there is no way for LLVM to verify that
there are no side-effects of the calls to libsecp256k1, leaving
LLVM with no way to optimize them out.

This commit adds a new method to `Writeable` which returns the
length of an object once serialized. It is implemented by default
using `LengthCalculatingWriter` (which LLVM generally optimizes out
for Rust objects) and overrides it for libsecp256k1 objects.

As of this commit, on an Intel 2687W v3, the serialization
benchmarks take:

test routing::network_graph::benches::read_network_graph  ... bench: 2,035,402,164 ns/iter (+/- 1,855,357)
test routing::network_graph::benches::write_network_graph ... bench: 308,235,267 ns/iter (+/- 140,202)
2021-06-01 15:47:01 +00:00
Matt Corallo
615419d525 Drop byte_utils in favor of native to/from_be_bytes methods
Now that our MSRV supports the native methods, we have no need
for the helpers anymore. Because LLVM was already matching our
byte_utils methods as byteswap functions, this should have no
impact on generated (optimzied) code.

This removes most of the byte_utils usage, though some remains to
keep the patch size reasonable.
2021-06-01 15:47:01 +00:00
Matt Corallo
c7113bcd92 Add benchmark of deserializing a NetworkGraph.
NetworkGraph is one of the largest structures we generally
deserialize, so it makes for a good benchmark, even if it isn't the
most complicated one.

As of this commit, on an Intel 2687W v3, these benchmarks take:

test routing::network_graph::benches::read_network_graph  ... bench: 2,101,420,078 ns/iter (+/- 6,649,020)
test routing::network_graph::benches::write_network_graph ... bench: 344,696,835 ns/iter (+/- 229,061)
2021-06-01 15:47:01 +00:00
Matt Corallo
c05347f48a
Merge pull request #892 from TheBlueMatt/2021-04-fix-htlc-ser
Correct Channel outbound HTLC serialization and expand fuzzing coverage
2021-05-31 23:52:22 +00:00
Matt Corallo
25dbd0d7e0 Correct Channel outbound HTLC serialization
Channel serialization should happen "as if
remove_uncommitted_htlcs_and_mark_paused had just been called".

This is true for the most part, but outbound RemoteRemoved HTLCs
were being serialized as normal, even though
`remote_uncommitted_htlcs_and_mark_paused` resets them to
`Committed`.

This led to a bug identified by the `chanmon_consistency_target`
fuzzer wherein, if we receive a update_*_htlc message bug not the
corresponding commitment_signed prior to a serialization roundtrip,
we'd force-close the channel due to the peer "attempting to
fail/claim an HTLC which was already failed/claimed".
2021-05-31 18:20:22 +00:00
Matt Corallo
27c05fdd7f Add new (C-not implementable) tag on EventsProvider
This makes it so that users cannot usefully implement their own
`EventsProvider`, which would require substantial new logic in the
bindings generator (for generic methods). In the case of
`EventsProvider`, because there are no Rust methods which accept an
`EventsProvider` as an argument, this is perfectly OK as the
generated code would be entirely unused anyway.
2021-05-30 17:04:21 +00:00