rust-lightning
3 years agoAdd a lightning-wasm-bindings crate and generation code 2021-01-wasm-bindings
Matt Corallo [Tue, 5 Jan 2021 19:03:44 +0000 (14:03 -0500)]
Add a lightning-wasm-bindings crate and generation code

3 years agof
Matt Corallo [Tue, 5 Jan 2021 19:02:43 +0000 (14:02 -0500)]
f

3 years ago[bindings] Allow manual setting of struct/enum attributes
Matt Corallo [Tue, 5 Jan 2021 19:02:02 +0000 (14:02 -0500)]
[bindings] Allow manual setting of struct/enum attributes

3 years ago[bindings] Allow control of the attributes placed on exported fns
Matt Corallo [Tue, 5 Jan 2021 18:31:09 +0000 (13:31 -0500)]
[bindings] Allow control of the attributes placed on exported fns

We also take this opportunity to remove `#[no_mangle]` on non-pub
functions, instead adding `#[allow(unused)]` where appropriate.

3 years ago[C++ bindings] Update demo app due to removed TupleTempl generics
Matt Corallo [Tue, 5 Jan 2021 02:08:53 +0000 (21:08 -0500)]
[C++ bindings] Update demo app due to removed TupleTempl generics

3 years ago[bindings] Drop some stale code from bindings generic generation
Matt Corallo [Tue, 5 Jan 2021 01:58:58 +0000 (20:58 -0500)]
[bindings] Drop some stale code from bindings generic generation

3 years ago- bindings updates
Matt Corallo [Tue, 5 Jan 2021 02:00:26 +0000 (21:00 -0500)]
- bindings updates

3 years ago[bindings] Tuples!
Matt Corallo [Tue, 5 Jan 2021 01:57:19 +0000 (20:57 -0500)]
[bindings] Tuples!

3 years ago- bindings updates
Matt Corallo [Tue, 5 Jan 2021 00:31:18 +0000 (19:31 -0500)]
- bindings updates

3 years ago[bindings] Move to manual write-out for Vec, too (XXX: with clone whitelist)
Matt Corallo [Tue, 5 Jan 2021 00:26:12 +0000 (19:26 -0500)]
[bindings] Move to manual write-out for Vec, too (XXX: with clone whitelist)

3 years ago- bindings update
Matt Corallo [Mon, 4 Jan 2021 22:33:36 +0000 (17:33 -0500)]
- bindings update

3 years ago[bindings] Concretize Result types without type aliasing
Matt Corallo [Mon, 4 Jan 2021 22:29:25 +0000 (17:29 -0500)]
[bindings] Concretize Result types without type aliasing

While the type aliasing trick works great for cbindgen,
wasm_bindgen doesn't support it and requires fully-concrete types.
In order to better support wasm_bindgen in the future, we do so
here, adding a function which manually writes out almost the exact
thing which was templated previously in concrete form.

As a nice side-effect, we no longer have to allocate and free a u8
for generic parameters which were `()` (though we still do in some
conversion functions, which we can get rid of when we similarly
concretize all generics fully).

3 years agofix?
Matt Corallo [Mon, 4 Jan 2021 17:19:09 +0000 (12:19 -0500)]
fix?

3 years agoUpdate C++ bindings demo to use `ChannelManager` de/serialization
Matt Corallo [Thu, 31 Dec 2020 22:48:55 +0000 (17:48 -0500)]
Update C++ bindings demo to use `ChannelManager` de/serialization

This demonstrates (and tests) the newly-exposed `ChannelManager`
de/serialization functions. Best revewied with -b --color-moved.

3 years ago[C++ bindings demo] Add now-missing std::moves
Matt Corallo [Thu, 31 Dec 2020 21:45:55 +0000 (16:45 -0500)]
[C++ bindings demo] Add now-missing std::moves

3 years ago- C++ bindings updates
Matt Corallo [Mon, 4 Jan 2021 20:56:10 +0000 (15:56 -0500)]
- C++ bindings updates

3 years ago[C++ bindings] Add move-assign operator, require rvalue for move
Matt Corallo [Thu, 31 Dec 2020 20:34:50 +0000 (15:34 -0500)]
[C++ bindings] Add move-assign operator, require rvalue for move

This adds a move-assignment operator (`A& operator=(A&& o)`) to our
C++ wrapper classes as well as requiring an rvalue for the move
auto-convert operator (`operator CStruct()() &&`).

The second makes the C++ wrapper classes much easier to work with
by requiring an explicit `std::move` when the bindings will
automatically move a C++-wrapper object into a C object.

3 years ago- bindings updates
Matt Corallo [Mon, 4 Jan 2021 20:59:27 +0000 (15:59 -0500)]
- bindings updates

3 years ago[bindings] Use references in a few places instead of pointers
Matt Corallo [Thu, 31 Dec 2020 04:27:36 +0000 (23:27 -0500)]
[bindings] Use references in a few places instead of pointers

Previously, references and pointers ended up identical in C, so
there was little reason to differentiate. With the addition of
nullability annotations, there is a (very slight) reason to prefer
references, so use them in a few places where its a trivial change.

3 years ago- bindings updates
Matt Corallo [Mon, 4 Jan 2021 20:59:11 +0000 (15:59 -0500)]
- bindings updates

3 years ago[bindings] Use new non-null annotation feature in cbindgen
Matt Corallo [Thu, 31 Dec 2020 03:09:26 +0000 (22:09 -0500)]
[bindings] Use new non-null annotation feature in cbindgen

This adds a new annotation for objects we take by reference in the
C header indicating the pointers must not be null. We have to
disable some warning clang now dumps that we haven't annotated all
pointers, as cbindgen is not yet able to add a nullable annotation.

3 years ago- bindings updates
Matt Corallo [Thu, 31 Dec 2020 16:42:14 +0000 (11:42 -0500)]
- bindings updates

3 years ago[bindings] Don't require trait impl for-structs to have no generics
Matt Corallo [Thu, 31 Dec 2020 16:14:22 +0000 (11:14 -0500)]
[bindings] Don't require trait impl for-structs to have no generics

This (finally) exposes `ChannelManager`/`ChannelMonitor` _write
methods, which were (needlessly) excluded as the structs themselves
have generic parameters. Sadly, we also now need to parse
`(C-not exported)` doc comments on impl blocks as we otherwise try
to expose _write methods for `&Vec<RouteHop>`, which doesn't work
(and isn't particularly interesting for users anyway). We add such
doc comments there.

3 years ago- bindings update
Matt Corallo [Mon, 4 Jan 2021 19:29:05 +0000 (14:29 -0500)]
- bindings update

3 years ago[bindings] Implement ReadableArgs mapping, try impl mapping for ()s
Matt Corallo [Thu, 31 Dec 2020 00:47:32 +0000 (19:47 -0500)]
[bindings] Implement ReadableArgs mapping, try impl mapping for ()s

This is most of the code to expose `ChannelManager`/`ChannelMonitor`
deserialization in our C bindings, using the new infrastructure to
map types in `maybe_convert_trait_impl` and passing generics in
from the callsites.

We also call `maybe_convert_trait_impl` for tuple types, as the
`ChannelManager`/`ChannelMonitor` deserialization returns a
`(BlockHash, T)` to indicate the block hash at which users need to
start resyncing the chain.

The final step to expose them is in the next commit.

3 years ago[bindings] Allow `write_rust_type` to handle leading-colon paths
Matt Corallo [Thu, 31 Dec 2020 00:46:39 +0000 (19:46 -0500)]
[bindings] Allow `write_rust_type` to handle leading-colon paths

It just stubs out to `write_rust_path` in this case anyway, which
handles leading-colons just fine, so no need to panic on them.

3 years ago- bindings updates
Matt Corallo [Mon, 4 Jan 2021 19:23:49 +0000 (14:23 -0500)]
- bindings updates

3 years ago[bindings] Use common conv in `_write` impls, drop type restrictions
Matt Corallo [Wed, 30 Dec 2020 22:50:43 +0000 (17:50 -0500)]
[bindings] Use common conv in `_write` impls, drop type restrictions

This expands the manual implementation logic for `*_write` and
`*_read` methods to most types, converting the `*_write` path to
the common type-conversion logic to ensure it works.

Note that `*_write_void` is still only implemented for has-inner
types, as its unclear what the `void*` would point to for others.

3 years ago- bindings updates
Matt Corallo [Mon, 4 Jan 2021 19:23:16 +0000 (14:23 -0500)]
- bindings updates

3 years ago[bindings] Convert manual `_read` implementations to return Results
Matt Corallo [Wed, 30 Dec 2020 22:30:59 +0000 (17:30 -0500)]
[bindings] Convert manual `_read` implementations to return Results

Previously, manual `*_read` implementations were only defined for
types with inner fields, which were set to NULL to indicate read
errors. This prevents exposing `*_read` for several other types,
including tuples (which are needed for `ChannelManager`/
`ChannelMonitors`) and enums (which includes `Event`s, though users
likely never need to call that directly). Further, this means we
don't expose the actual error enum (which is likely no big deal,
but is still nice).

Here, we instead create the `Result<Object, DecodeError>` type and
then pass it through the normal type conversion functions, giving
us access to any types which we can convert normally.

3 years ago[bindings] Pipe errors back from write_template_constructor
Matt Corallo [Wed, 30 Dec 2020 20:25:02 +0000 (15:25 -0500)]
[bindings] Pipe errors back from write_template_constructor

We can fail to resolve a part of a tuple, resulting in a panic in
write_template_constructor even if we're calling
`understood_c_type` with the intent of figuring out whether we can
print a type at all. Instead, we should pipe errors back and let
`understood_c_type` return false as a result.

3 years ago[bindings] Update C++ demo for new NetGraphMsgHandler::new() params
Matt Corallo [Fri, 1 Jan 2021 01:37:27 +0000 (20:37 -0500)]
[bindings] Update C++ demo for new NetGraphMsgHandler::new() params

3 years ago[bindings] Allow unused fns that the bindings can call but don't
Matt Corallo [Mon, 4 Jan 2021 20:25:23 +0000 (15:25 -0500)]
[bindings] Allow unused fns that the bindings can call but don't

We no longer have any public `Option<Signatures>` in our code, and
thus get warnings that the two functions which support it are
unused. Instead of removing support for them (which we may need in
the future), we add `#[allow(unused)]`.

3 years ago- bindings diff
Matt Corallo [Fri, 1 Jan 2021 01:31:43 +0000 (20:31 -0500)]
- bindings diff

3 years ago[bindings] Drop useless `#[no_mangle]` from `pub type` definitions
Matt Corallo [Wed, 30 Dec 2020 20:14:42 +0000 (15:14 -0500)]
[bindings] Drop useless `#[no_mangle]` from `pub type` definitions

Newer rustc complains that "attribute should be applied to a function or
static"

3 years ago- bindings diff
Matt Corallo [Mon, 4 Jan 2021 19:19:39 +0000 (14:19 -0500)]
- bindings diff

3 years ago[bindings] Be explicit with take_ptr calls
Matt Corallo [Wed, 25 Nov 2020 18:25:18 +0000 (13:25 -0500)]
[bindings] Be explicit with take_ptr calls

If you try to call take_ptr on a pointer to an object which
implements Deref, rustc hits the deref recursion limit.

To avoid this, we can explicitly tell rustc that we want to treat
the pointer as a pointer and call take_ptr on it directly.

3 years ago- bindings diff
Matt Corallo [Mon, 4 Jan 2021 20:55:29 +0000 (15:55 -0500)]
- bindings diff

3 years ago[bindings] Separate take_ptr and take_inner
Matt Corallo [Wed, 25 Nov 2020 18:20:15 +0000 (13:20 -0500)]
[bindings] Separate take_ptr and take_inner

It is confusing to have two utility methods on different classes
of types which do two different, but related, things with the same
name.

3 years ago- bindings diff
Matt Corallo [Wed, 25 Nov 2020 18:26:53 +0000 (13:26 -0500)]
- bindings diff

3 years ago[bindings] Support exposing `bitcoin::OutPoint`s as our common type
Matt Corallo [Mon, 4 Jan 2021 20:12:37 +0000 (15:12 -0500)]
[bindings] Support exposing `bitcoin::OutPoint`s as our common type

3 years ago[bindings] Figure out in-file structs and enums before processing
Matt Corallo [Mon, 4 Jan 2021 20:52:18 +0000 (15:52 -0500)]
[bindings] Figure out in-file structs and enums before processing

Previously, types which were declared and used in the same file
would fail if the use was before the declaration. This makes sense
in a few cases where a "parent" class returns a reference to a
"child" class and there's no reason we shouldn't support it.

This change adds a second pass to our file processing which gathers
the structs and enums whicha re declared in the file and adds them
to the type resolver first, before doing the real conversion.

3 years ago[bindings] Don't export new functions with unexportable types
Matt Corallo [Mon, 4 Jan 2021 19:15:36 +0000 (14:15 -0500)]
[bindings] Don't export new functions with unexportable types

`CommitmentTransaction::new_with_auxiliary_htlc_data()` includes a
unbounded generic parameter which we can't concretize and it's of
limited immediate use for users in any case. We should eventually
add a non-generic version which uses `()` for the generic but that
can come later.

`CommitmentTransaction::htlcs()` returns a reference to a Vec,
which we cannot currently map. It should, however, be exposed to
users, so in the future we'll need to have a duplication function
which returns Vec of references or a cloned Vec.

3 years ago[bindings] Expose secp256k1::Message as ThirtyTwoBytes
Matt Corallo [Mon, 4 Jan 2021 19:13:59 +0000 (14:13 -0500)]
[bindings] Expose secp256k1::Message as ThirtyTwoBytes

3 years ago[bindings] Add support for mapping Write as a supertrait
Matt Corallo [Wed, 25 Nov 2020 17:22:31 +0000 (12:22 -0500)]
[bindings] Add support for mapping Write as a supertrait

3 years ago[bindings] Handle MessageSendEventsProvider impl blocks in a util fn
Matt Corallo [Wed, 25 Nov 2020 17:22:03 +0000 (12:22 -0500)]
[bindings] Handle MessageSendEventsProvider impl blocks in a util fn

Instead of having manually-written lightning-specific code in a
supertrait walk in the middle of a large function, move it to a
utility function up next to the other manually-written-impl-block
functions.

3 years ago[bindings] Always resolve supertrait types during supertrait walks
Matt Corallo [Wed, 25 Nov 2020 16:59:58 +0000 (11:59 -0500)]
[bindings] Always resolve supertrait types during supertrait walks

This is a rather trivial cleanup to ensure we always have the full
path when we walk supertraits even if the supertrait is specified
with only a single ident.

3 years ago[bindings] Pass GenericTypes through to write_template_generic
Matt Corallo [Wed, 25 Nov 2020 02:52:32 +0000 (21:52 -0500)]
[bindings] Pass GenericTypes through to write_template_generic

With this we support types like `Result<Self::AssociatedType, ()>`.

3 years ago[bindings] Un-special-case returning an associated type
Matt Corallo [Wed, 25 Nov 2020 19:46:21 +0000 (14:46 -0500)]
[bindings] Un-special-case returning an associated type

In the case that we return an associated type to C (ie when
implementing a trait which returns an associated type, we had to
convert the Rust-returned concrete Rust type to the C trait struct),
we had code to manually create the neccessary trait struct at the
return site.

This was special-cased in the method-body-writing function instead
of letting the type conversion logic handle it. As a result, we are
unable to do the same conversion when it appears in a different
context, for example inside of a generic like
`Result<Self::AssocType, ErrorType>`.

To solve this, we do the actual work in a
`impl From<nativeType> for CTraitStruct` implementation and then
call `into()` from within the type conversion logic.

3 years ago[bindings] Replace associated_types HashMaps with common Generics
Matt Corallo [Wed, 25 Nov 2020 02:27:52 +0000 (21:27 -0500)]
[bindings] Replace associated_types HashMaps with common Generics

Instead of handling associated types separately, we can just shove
them into the same generics resolution logic we use for template
types. While we should probably have some precedence logic,
aliasing type names seems like a bad idea anyway so no effort is
made to handle it.

This removes a good chunk of code and, more importantly, tees us up
for supporting `Type<Self::AssociatedType>`-style generics.

3 years ago[bindings] Use consistent imports for MessageSendEvents traits
Matt Corallo [Fri, 1 Jan 2021 01:19:21 +0000 (20:19 -0500)]
[bindings] Use consistent imports for MessageSendEvents traits

Our bindings generator is braindead with respect to the idents
used in a trait definition - it treats them as if they were used
where the trait is being used, instead of where the trait is
defined. Thus, if the idents used in a trait definition are not
also imported the same in the files where the traits are used, we
will claim the idents are bogus.

I spent some time trying to track the TypeResolvers globally
through the entire conversion run so that we could use the original
file's TypeResolver later when using the trait, but it is somewhat
of a lifetime mess. While likely possible, import consistency is
generally the case anyway, so unless it becomes more of an issue in
the future, it likely makes the most sense to just keep imports
consistent.

This commit keeps imports consistent across trait definition files
around `MessageSendEvent` and `MessageSendEventsProvider`.

3 years agostrip binaries in genbindings.sh for better size comparison
Matt Corallo [Thu, 26 Nov 2020 00:59:13 +0000 (19:59 -0500)]
strip binaries in genbindings.sh for better size comparison

3 years agoUse `KeysInterface::read_chan_signer` for all channel keys deser 2020-10-chansigner-no-ser
Matt Corallo [Wed, 25 Nov 2020 21:18:12 +0000 (16:18 -0500)]
Use `KeysInterface::read_chan_signer` for all channel keys deser

This drops any direct calls to a generic `ChannelKeys::read()` and
replaces it with the new `KeysInterface::read_chan_signer()`. Still,
under the hood all of our own `KeysInterface::read_chan_signer()`
implementations simply call out to a `Readable::read()` implemention.

3 years agoExpose test_utils to fuzztarget (in addition to _test_utils feature)
Matt Corallo [Wed, 25 Nov 2020 22:50:38 +0000 (17:50 -0500)]
Expose test_utils to fuzztarget (in addition to _test_utils feature)

3 years agoAdd a new method `read_chan_signer` to `KeysInterface`
Matt Corallo [Wed, 25 Nov 2020 17:23:47 +0000 (12:23 -0500)]
Add a new method `read_chan_signer` to `KeysInterface`

This adds a new method to the general cross-channel `KeysInterface`
which requires it to handle the deserialization of per-channel
signer objects. This allows the deserialization of per-channel
signers to have more context available, which, in the case of the
C bindings, includes the actual KeysInterface information itself.

3 years agoUse Writeable for ChannelMonitor instead of a specific function.
Matt Corallo [Wed, 25 Nov 2020 20:03:19 +0000 (15:03 -0500)]
Use Writeable for ChannelMonitor instead of a specific function.

There's no reason to have ChannelMonitor::write_for_disk instead of
just using the Writeable trait anymore. Previously, it was used to
differentiate with `write_for_watchtower`, but support for
watchtower-mode ChannelMonitors was never completed and the partial
bits were removed long ago.

This has the nice benefit of hitting the custom Writeable codepaths
in C bindings instead of trying to hit trait-generics paths.

3 years agoUniversally Require Writeable for ChannelKeys
Matt Corallo [Wed, 25 Nov 2020 17:23:37 +0000 (12:23 -0500)]
Universally Require Writeable for ChannelKeys

It doesn't make sense to ever build a lightning node which doesn't
ever write ChannelMonitors to disk, so having a ChannelKeys object
which doesn't implement Writeable is nonsense.

Here we require Writeable for all ChannelKeys objects, simplifying
code generation for C bindings somewhat.

3 years agoCache fields instead of storing a ChannelKeys in ChannelMonitor
Matt Corallo [Fri, 30 Oct 2020 21:25:15 +0000 (17:25 -0400)]
Cache fields instead of storing a ChannelKeys in ChannelMonitor

We only actually use two of the fields in ChannelKeys inside a
ChannelMonitor - the holder revocation_basepoint and the
derivation parameters. Both are relatively small, so there isn't
a lot of reason to hold a full copy of the ChannelKeys (with most
of the interaction with it being inside the OnchainTxHandler).

Further, this will avoid calling read on a `ChannelKeys` twice,
which is a somewhat strange API quirk.

3 years agoMerge pull request #742 from lightning-signer/tx-phase2
Matt Corallo [Mon, 4 Jan 2021 17:11:11 +0000 (09:11 -0800)]
Merge pull request #742 from lightning-signer/tx-phase2

Introduce CommitmentTransactionInfo

3 years agoUse new get_commitment_transaction_number_obscure_factor utility function
Devrandom [Wed, 30 Dec 2020 03:26:49 +0000 (19:26 -0800)]
Use new get_commitment_transaction_number_obscure_factor utility function

3 years agoIntroduce CommitmentTransaction, ChannelTransactionParameters
Devrandom [Thu, 15 Oct 2020 11:45:18 +0000 (13:45 +0200)]
Introduce CommitmentTransaction, ChannelTransactionParameters

CommitmentTransaction maintains the per-commitment transaction fields needed to construct the associated bitcoin transactions (commitment, HTLC).  It replaces passing around of Bitcoin transactions.  The ChannelKeys API is modified accordingly.

By regenerating the transaction when implementing a validating external signer, this allows a higher level of assurance that all relevant aspects of the transactions were checked for policy violations.

ChannelTransactionParameters replaces passing around of individual per-channel fields that are needed to construct Bitcoin transactions.

Eliminate ChannelStaticData in favor of ChannelTransactionParameters.

Use counterparty txid instead of tx in channelmonitor update.

3 years agoUnwrap unneeded macros
Devrandom [Mon, 19 Oct 2020 08:27:18 +0000 (10:27 +0200)]
Unwrap unneeded macros

3 years agoMerge pull request #736 from bmancini55/gossip_queries
Matt Corallo [Tue, 15 Dec 2020 19:17:11 +0000 (11:17 -0800)]
Merge pull request #736 from bmancini55/gossip_queries

Initiate gossip_queries

3 years agoFix comment for sync_routing_table
bmancini55 [Tue, 15 Dec 2020 18:48:14 +0000 (13:48 -0500)]
Fix comment for sync_routing_table

Corrects the comment for sync_routing_table in RoutingMessageHandler to
be less prescriptive about the implementor's actions.

3 years agoRemove should_request_full_sync from RoutingMessageHandler
bmancini55 [Wed, 9 Dec 2020 20:06:54 +0000 (15:06 -0500)]
Remove should_request_full_sync from RoutingMessageHandler

This method was used to set the initial_routing_sync flag when sending
an outbound Init message to a peer. Since we are now relying on
gossip_queries instead of initial_routing_sync, synchronization can be
fully encapsulate into RoutingMessageHandler via sync_routing_table.

This commit removes should_request_full_sync from the trait
RoutingMessageHandler. The implementation is still used in
NetGraphMsgHandler and has been converted into a private method instead
of a trait function.

3 years agoChange routing table sync to use gossip_queries
bmancini55 [Thu, 3 Dec 2020 17:48:40 +0000 (12:48 -0500)]
Change routing table sync to use gossip_queries

This commit changes outbound routing table sync to use gossip_queries
instead of the effectively deprecated initial_routing_sync feature.

This change removes setting of initial_routing_sync in our outbound Init
message. Instead we now call sync_routing_table after receiving an Init
message from a peer. If the peer supports gossip_queries and
should_request_full_sync returns true, we initiate a full gossip_queries
sync.

3 years agoPass Init message to sync_routing_table method
bmancini55 [Thu, 3 Dec 2020 17:00:36 +0000 (12:00 -0500)]
Pass Init message to sync_routing_table method

This commit modifies sync_routing_table in RoutingMessageHandler to
accept a reference to the Init message received by the peer. This allows
the method to use the Peer's features to drive the operations of the
gossip_queries routing table sync.

3 years agoPass gossip_queries messages to handler via ownership
bmancini55 [Thu, 3 Dec 2020 16:52:54 +0000 (11:52 -0500)]
Pass gossip_queries messages to handler via ownership

This change modifies gossip_queries methods in RoutingMessageHandler to
move the message instead of passing a reference. This allows the message
handler to be more efficient by not requiring a full copy of SCIDs
passed in messages.

3 years agoRefactor gossip_queries sync to be stateless
bmancini55 [Wed, 18 Nov 2020 18:32:55 +0000 (13:32 -0500)]
Refactor gossip_queries sync to be stateless

This commit simplifies the sync process for routing gossip messages. When
a sync is initiated, the process is handled statelessly by immediately
issuing SCID queries as channel range replies are received. This greatly
simplifies the state machine at the cost of fully validating and
conforming to the current spec.

3 years agoAdd genesis block hash to NetworkGraph
bmancini55 [Sun, 29 Nov 2020 20:20:35 +0000 (15:20 -0500)]
Add genesis block hash to NetworkGraph

This changes adds the genesis block hash as a BlockHash to the
NetworkGraph struct. Making the NetworkGraph aware allows the message
handler to validate the chain_hash for received messages. This change
also adds the hash value to the Writeable and Readable methods.

3 years agoImplement gossip_queries sync methods in NetGraphMsgHandler
bmancini55 [Thu, 22 Oct 2020 16:44:53 +0000 (12:44 -0400)]
Implement gossip_queries sync methods in NetGraphMsgHandler

To perform a sync of routing gossip messages with a peer requires a two
step process where we first initiate a channel range query to discover
channels in a block range. Next we request the routing gossip messages
for discovered channels.

This code implements logic in NetGraphMsgHandler for performing these two
tasks while taking into account the specification and variance in
implementation.

3 years agoAdd gossip_queries methods to RoutingMessageHandler trait
bmancini55 [Thu, 22 Oct 2020 14:51:54 +0000 (10:51 -0400)]
Add gossip_queries methods to RoutingMessageHandler trait

Defines message handlers for gossip_queries messages in the RoutingMessageHandler
trait. The MessageSendEventsProvider supertrait is added to RoutingMessageHandler
so that the implementor can use SendMessageEvents to send messages to a
peer at the appropriate time.

The trait methods are stubbed in NetGraphMsgHandler which implements
RoutingMessageHandler and return a "not implemented" error.

3 years agoAdd send message events for gossip_queries
bmancini55 [Thu, 22 Oct 2020 12:47:24 +0000 (08:47 -0400)]
Add send message events for gossip_queries

This change enables initiating gossip queries with a peer using the
SendMessageEvent enum. Specifically we add an event for sending
query_channel_range to discover the existance of channels and an event
for sending query_short_channel_ids to request routing gossip messages
for a set of channels. These events are handled inside the process_events
method of PeerManager which sends the serialized message to the peer.

3 years agoAdd gossip_queries messages to wire decoding
bmancini55 [Wed, 21 Oct 2020 21:20:26 +0000 (17:20 -0400)]
Add gossip_queries messages to wire decoding

To enable gossip_queries message decoding, this commit implements the
wire module's Encoding trait for each message type. It also adds these
messages to the wire module's Message enum and the read function to
enable decoding of a buffer.

3 years agoAdd gossip_queries feature flag
bmancini55 [Wed, 21 Oct 2020 20:31:22 +0000 (16:31 -0400)]
Add gossip_queries feature flag

Support for the gossip_queries feature flag (bits 6/7) is added to the
Features struct. This feature is available in the Init and Node
contexts. The gossip_queries feature is not fully implemented so this
feature is disabled when sent to peers in the Init message.

3 years agoMerge pull request #760 from TheBlueMatt/2020-11-0.0.12
Matt Corallo [Tue, 24 Nov 2020 23:19:11 +0000 (15:19 -0800)]
Merge pull request #760 from TheBlueMatt/2020-11-0.0.12

Bump lightning-net-tokio crate version.

3 years agoBump lightning-net-tokio crate version. 2020-11-0.0.12
Matt Corallo [Tue, 24 Nov 2020 22:55:41 +0000 (17:55 -0500)]
Bump lightning-net-tokio crate version.

3 years agoMerge pull request #759 from TheBlueMatt/2020-11-0.0.12 v0.0.12
Matt Corallo [Tue, 24 Nov 2020 22:14:16 +0000 (14:14 -0800)]
Merge pull request #759 from TheBlueMatt/2020-11-0.0.12

Bump version to 0.0.12

3 years agoMerge pull request #758 from TheBlueMatt/2020-11-bindings-fix
Matt Corallo [Tue, 24 Nov 2020 22:07:52 +0000 (14:07 -0800)]
Merge pull request #758 from TheBlueMatt/2020-11-bindings-fix

Split `NetworkGraph` message handling fns into unsigned and signed (+update bindings)

3 years agoUpdate auto-generated bindings with new NetworkGraph API 2020-11-bindings-fix
Matt Corallo [Tue, 24 Nov 2020 18:41:06 +0000 (13:41 -0500)]
Update auto-generated bindings with new NetworkGraph API

3 years agoBump version to 0.0.12
Matt Corallo [Tue, 24 Nov 2020 21:34:33 +0000 (16:34 -0500)]
Bump version to 0.0.12

3 years agoSplit `NetworkGraph` message handling fns into unsigned and signed
Matt Corallo [Tue, 24 Nov 2020 18:38:39 +0000 (13:38 -0500)]
Split `NetworkGraph` message handling fns into unsigned and signed

This takes the now-public `NetworkGraph` message handling functions
and splits them all into two methods - one which takes a required
Secp256k1 context and verifies signatures and one which takes only
the unsigned part of the message and does not take a Secp256k1
context.

This both clarifies the public API as well as simplifies it, all
without duplicating code.

Finally, this adds an assertion in the Router fuzzer to make sure
the constants used for message deserialization are correct.

3 years agoMove UTXO-lookup into pub utility function from RoutingMsgHandler
Matt Corallo [Tue, 24 Nov 2020 17:40:11 +0000 (12:40 -0500)]
Move UTXO-lookup into pub utility function from RoutingMsgHandler

This makes the public utility methods in `NetworkGraph` able to do
UTXO lookups ala `NetworkMsgHandler`'s `RoutingMessageHandler`
implementation, slightly simplifying the public interface.

We also take this opportunity to verify signatures before calling
out to UTXO lookups, under the "do actions in order of
cheapest-to-most-expensive to reduce DoS surface" principle.

3 years agoFinally drop travis entirely.
Matt Corallo [Tue, 24 Nov 2020 16:42:03 +0000 (11:42 -0500)]
Finally drop travis entirely.

It seems travis isn't even bothering to spawn our jobs anymore, and
Github CI has been pretty stable, so just drop Travis entirely.

3 years agoMerge pull request #748 from TheBlueMatt/2020-11-router-fuzzer
Matt Corallo [Tue, 24 Nov 2020 16:36:14 +0000 (08:36 -0800)]
Merge pull request #748 from TheBlueMatt/2020-11-router-fuzzer

Make router_target a bit easier for fuzzers to explore and fix two found bugs

3 years ago[fuzz] Make router_target a bit easier for fuzzers to explore 2020-11-router-fuzzer
Matt Corallo [Thu, 12 Nov 2020 22:19:05 +0000 (17:19 -0500)]
[fuzz] Make router_target a bit easier for fuzzers to explore

It turns out (somewhat obviously) that expecting a fuzzer to
correctly build multiple signatures which verify against multiple
public keys in the same message was a bit too daunting, so we now
skip message signatures in routing messages.

We also take this opportunity to simplify the target itself somewhat,
avoiding reading public keys over and over and instead generating
routes to all the public keys that appeared in messages while running.

3 years agoExpose manual-update methods in NetworkGraph.
Matt Corallo [Thu, 12 Nov 2020 22:16:14 +0000 (17:16 -0500)]
Expose manual-update methods in NetworkGraph.

These functions were created but previously not exported, however
they are useful if we want to skip signature checking when accepting
routing messages (which we really should be doing in the routing
fuzzer).

3 years agoMerge pull request #750 from TheBlueMatt/2020-11-dup-chan-id-crash
Matt Corallo [Mon, 23 Nov 2020 22:28:11 +0000 (14:28 -0800)]
Merge pull request #750 from TheBlueMatt/2020-11-dup-chan-id-crash

Do not generate a channel-closed mon update for never-signed chans

3 years agoDon't create chan-closed mon update for outbound never-signed chans 2020-11-dup-chan-id-crash
Matt Corallo [Mon, 23 Nov 2020 18:34:31 +0000 (13:34 -0500)]
Don't create chan-closed mon update for outbound never-signed chans

Like the previous commit for channel-closed monitor updates for
inbound channels during processing of a funding_created message,
this resolves a more general issue for closing outbound channels
which have sent a funding_created but not yet received a
funding_signed.

This issue was also detected by full_stack_target.

To make similar issues easier to detect in testing and fuzzing, an
additional assertion is added to panic on updates to a channel
monitor before registering it.

3 years agoDo not generate a channel-closed mon update for never-signed chans
Matt Corallo [Sun, 15 Nov 2020 21:44:09 +0000 (16:44 -0500)]
Do not generate a channel-closed mon update for never-signed chans

The full_stack_target managed to find a bug where, if we receive
a funding_created message which has a channel_id identical to an
existing channel, we'll end up
 (a) having the monitor update for the new channel fail (due to
     duplicate outpoint),
 (b) creating a monitor update for the new channel as we
     force-close it,
 (c) panicing due to the force-close monitor update is applied to
     the original channel and is considered out-of-order.

Obviously we shouldn't be creating a force-close monitor update for
a channel which can never appear on chain, so we do that here and
add a test which previously failed and checks a few
duplicate-channel-id cases.

3 years ago[netgraph] Do not allow capacity_sats * 1000 to overflow-panic
Matt Corallo [Thu, 12 Nov 2020 23:59:06 +0000 (18:59 -0500)]
[netgraph] Do not allow capacity_sats * 1000 to overflow-panic

In updating the router fuzzer, it discovered that a remote peer can
cause us to overflow while multiplying the channel capacity value.
Since the value should never exceed 21 million BTC, we just add a
check for that.

3 years ago[router] Fix + test routing via next/last-hop hints only
Matt Corallo [Thu, 12 Nov 2020 23:57:02 +0000 (18:57 -0500)]
[router] Fix + test routing via next/last-hop hints only

We had code in the router to support sending a payment via a single
hop across channels exclusively provided by the next-/last-hop hints.
However, in updating the fuzzer, I noted that this case not only
didn't work, but paniced in some cases.

Here, we both fix the panic, as well as write a new test which
ensures we don't break support for such routing in the future.

3 years agoMerge pull request #749 from TheBlueMatt/2020-11-bindings-clones
Matt Corallo [Mon, 23 Nov 2020 18:43:09 +0000 (10:43 -0800)]
Merge pull request #749 from TheBlueMatt/2020-11-bindings-clones

Bindings Updates for #681 and more Clones

3 years agoUse CARGO_PROFILE_RELEASE_LTO to fix bindings build on new cargo 2020-11-bindings-clones
Matt Corallo [Mon, 23 Nov 2020 15:20:10 +0000 (10:20 -0500)]
Use CARGO_PROFILE_RELEASE_LTO to fix bindings build on new cargo

Newer versions of cargo broke `cargo rustc -- -Clto` by passing
`-Cembed-bitcode=no` even in `--release`. Its somewhat unclear why
this is still the case on latest cargo given it broke, at least,
compilation of Firefox, as discovered by Val at [1]. We take the
approach they used there, even though they later walked it back [2]
but the issues noted there, especially in [3] don't seem
particularly concerning in our case.

[1] https://bugzilla.mozilla.org/show_bug.cgi?id=1640982
[2] https://bugzilla.mozilla.org/show_bug.cgi?id=1654465
[3] https://bugzilla.mozilla.org/show_bug.cgi?id=1654465#c5

3 years agoUpdate auto-generated bindings
Matt Corallo [Fri, 13 Nov 2020 01:23:17 +0000 (20:23 -0500)]
Update auto-generated bindings

3 years agoUpdate bindings demo for new ChannelMonitor-update API
Matt Corallo [Mon, 23 Nov 2020 16:11:55 +0000 (11:11 -0500)]
Update bindings demo for new ChannelMonitor-update API

3 years ago[bindings] Update eq/clone trait fns to take object, not this_arg
Matt Corallo [Mon, 26 Oct 2020 01:39:58 +0000 (21:39 -0400)]
[bindings] Update eq/clone trait fns to take object, not this_arg

When a trait is required to implement eq/clone (eg in the case of
`SocketDescriptor`), the generated trait struct contains an
eq/clone function which takes a `this_arg` pointer. Since the trait
object can always be read to get the `this_arg` pointer, there is
no loss of generality to pass the trait object itself, and it
provides a bit more flexibility when the trait could be one of
several implementations (which we use in the Java higher-level
bindings).

3 years agoderive(Clone) for several pub simple data structs.
Matt Corallo [Tue, 20 Oct 2020 18:01:22 +0000 (14:01 -0400)]
derive(Clone) for several pub simple data structs.

There is no reason not to and Clone can be useful especially in the
bindings context.

3 years ago[bindings] Expose a _clone fn for every enum
Matt Corallo [Tue, 20 Oct 2020 18:02:12 +0000 (14:02 -0400)]
[bindings] Expose a _clone fn for every enum

This somewhat assumes that every public enum implements clone in
some way, but that is currently the case.

3 years ago[bindings] Expose a _clone fn for every struct that derive(Clone)s
Matt Corallo [Mon, 12 Oct 2020 03:51:22 +0000 (23:51 -0400)]
[bindings] Expose a _clone fn for every struct that derive(Clone)s