Commit graph

555 commits

Author SHA1 Message Date
Antoine Riard
824e318be3 Build witness_script for justice tx inside OnchainTxHandler
By moving script generation inside OnchainTxHandler, we may dry-up
further ChannelMonitor in next commits.
2020-05-18 04:44:06 -04:00
Antoine Riard
6512e8a8dd Replace is_htlc in InputMaterial by InputDescriptor
As we cache more and more transaction elements in OnchainTxHandler
we should dry up completly InputMaterial until them being replaced
directly by InputDescriptor
2020-05-18 04:42:09 -04:00
Antoine Riard
275814cc1d Cache remote HTLC inside OnchainTxHandler::RemoteTxCache
As we can't predict if any and which revoked commitment tx is
going to appear onchain we have by design to cache all htlc information
to regenerate htlc script if needed.
2020-05-18 04:39:26 -04:00
Antoine Riard
6b1afcc313 Cache remote basepoint and remote_csv in new OnchainTxHandler::RemoteTxCache
Used in next commits to avoid passing script between ChannelMonitor
and OnchainTxHandler. ChannelMonitor duplicata will be removed
in future commits.
2020-05-18 04:39:26 -04:00
Matt Corallo
8ade071d56 Drop OutPoint::new since the struct is all pub
This makes it easier for our automated bindings generator to
function as it tries to automatically create a ::new if the struct
contains only pub elements who's type is convertible.
2020-05-17 23:24:41 -04:00
Valentine Wallace
222f0cbdd2
PeerManager Logger Arc --> Deref 2020-05-17 13:02:32 -04:00
Valentine Wallace
87126b391b
ChannelManager+Router++ Logger Arc --> Deref
This caused a bunch of cascading changes, including
passing loggers down to Channels in function calls
rather than having each Channel have a pointer to the
ChannelManager's Logger (which was a circular reference).
Other structs that the Channel had passed its Logger to also
had their loggers removed. Other newly unused Loggers were
also removed, especially when keeping them would've caused
a bunch of extra test changes to be necessary, e.g. with
the ChainWatchInterfaceUtil's Logger.
2020-05-17 12:33:43 -04:00
Sourabh Marathe
9c587e5312 Serialize ChannelManager events
Also adds a test for de/serializing events
2020-05-14 17:02:54 -04:00
Matt Corallo
b1c80970e9 Fix some new indentation nits 2020-05-12 14:16:43 -04:00
Matt Corallo
6e1aa6cab5 Fix a few new (and one old) issues in the new channel_update
We need to always set lowest_inbound_channel_fees to None if there
are no channels (and we should ignore the channels which are
disabled for the purpose of lowest-fee calculations). Further, we
cannot unwrap the channel lookups as they may be for channels which
are not related to the channel we are processing an update for.
Finally, we can satisfy borrowck much easier since things are on
self instead of on a MutexGuard.
2020-05-12 14:02:40 -04:00
Matt Corallo
94df32b108 Add assertion since we now have a pub field that is PartialEq
We previously were only able to assert that the route graph
serialization roundtrips were good by comparing the network
messages returned from them, but we can now do better as the graph
is exposed publicly via a simple datastructure that implements
PartialEq.
2020-05-12 14:02:40 -04:00
Matt Corallo
57ac2ec1b6 Add missing comment on why last_update_message is None 2020-05-12 14:02:40 -04:00
Matt Corallo
0e3bf19b66 Move get_addresses to network_graph and drop now-useless log_trace
Because we expose the internals we don't need a method to log
their contents anymore, and get_addresses can now avoid copying as
we expose the RwLock directly
2020-05-12 14:02:40 -04:00
Matt Corallo
5dc724f875 Drop new test Node field introduced in 8ce2223b6952567b28adfcc11c2
8ce2223b6952567b28adfcc11c23c9f19c4c0324 introduced a new field in
the "Node" objects used in our functional tests - the node_id. Its
not a bad idea to cache it, but unless we want to commit and use it
everywhere, we should avoid duplicating data, especially in tests
where we'd rather exercise the underlying code than bypass it.
2020-05-12 14:02:40 -04:00
Gleb Naumenko
07a7e34f89 Improve routing-related documentation 2020-05-12 09:27:12 -04:00
Gleb Naumenko
7ec98e6206 Remove NetGraphMsgHandler serialization 2020-05-12 09:27:11 -04:00
Gleb Naumenko
8467223a5d Make DirectionalChannelInfo optional 2020-05-12 09:27:11 -04:00
Gleb Naumenko
afd4282107 Move node announcement fields into a separate struct 2020-05-12 09:27:11 -04:00
Gleb Naumenko
a7e193241c Expose some network graph methods 2020-05-12 09:27:11 -04:00
Gleb Naumenko
e553d2c2c0 Split routing from getting network messages 2020-05-12 09:27:11 -04:00
Gleb Naumenko
6164a95267 Remove non-bitcoin chain helpers 2020-05-12 09:27:11 -04:00
Gleb Naumenko
5bd7f24634 Move router to a separate module 2020-05-12 09:27:11 -04:00
Matt Corallo
d2520f4908
Merge pull request #539 from TheBlueMatt/2020-03-static-remotekey
Require static_remotekey
2020-05-06 02:07:02 +00:00
Matt Corallo
07db23d102 Rename payment_basepoint/key to simply payment_point/key.
We no longer derive any keys from the payment point, so they aren't
a "base" but simply a point/key.
2020-05-05 21:42:36 -04:00
Matt Corallo
babf0af30b Require option_static_remotekey in channel/channelmonitor.
This simplifies channelmonitor quite nicely (as expected) as we
never have to be concerned with learning data in a DataLossProtect
which is require for us to claim our funds from the latest remote
commitment transaction.
2020-05-05 21:42:36 -04:00
Matt Corallo
22dded737b Add detection of feature_static_remotekey support and print
This adds the ability to check for static_remotekey in appropriate
feature contexts and prints it at connect time. It is still
considered unknown for the purposes of requires_unknown_bits() as
we don't yet implement it.
2020-05-05 21:40:51 -04:00
Valentine Wallace
1b656f4d4a
Make channel reserve variable names less confusing.
Previous to this commit, variables such as their_channel_reserve
referred to the channel reserve that _we_ are required to keep,
(the value is initially set by the remote). Similarly,
variables such as our_channel_reserve referred to the channel
reserve that we require the remote to keep.

Change this to use local_channel_reserve / remote_channel_reserve
to refer to the the channel reserve that the local is required to keep
and the channel reserve that the remote is required to keep, respectively.
2020-05-01 19:35:44 -04:00
Matt Corallo
18981a0024 Check local signtures explicitly in channel tx-generation tests
It appears the local signatures which are specified in the channel
transaction-generation tests were never checked directly (though
they were checked as a part of the overall fully-signed-transaction
tests).

Check them explicitly so that they can be updated for static remote
key.
2020-04-29 14:50:09 -04:00
Matt Corallo
3fb482a8d9 Add additional trace logging in channel signature validation
This makes it easier to amend the full_stack_target
test_no_existing_test_breakage test by always providing the
neccessary data in the log.
2020-04-29 14:50:09 -04:00
Matt Corallo
9098240e34
Merge pull request #590 from jkczyz/2020-04-feature-flags
Features module improvements
2020-04-29 18:49:39 +00:00
Jeffrey Czyz
ee27e8432a Sanity check that known features are not required 2020-04-29 11:11:51 -07:00
Jeffrey Czyz
b1c6499e1c Expand testing of unknown feature bits
Include tests for requires_unknown_bits and supports_unknown_bits when
an unknown even bit, odd bit, or neither is set. Refactor bit clearing
such that tests and production code share the same code path. Fix a
potential spec incompatibility (currently only exposed in testing code)
where trailing zero bytes are not removed after a bit is cleared.
2020-04-29 11:11:51 -07:00
Jeffrey Czyz
4bd2c974a2 Generalize with_known_relevant_init_flags
Converting from InitFeatures to other Features is accomplished using
Features::with_known_relevant_init_flags. Define a more general
to_context method which converts from Features of one Context to
another.

Additionally, ensure the source context only has known flags before
selecting flags for the target context.
2020-04-29 11:11:51 -07:00
Jeffrey Czyz
65ff1bf0be Generalize feature methods to work in any context
Refactoring the features module allowed for making code specific to
certain contexts generalizable. Specifically, KNOWN_FEATURE_MASK
is defined on Context instead of hardcoded in each method
specialization. Thus, such methods are no longer required.
2020-04-29 11:11:51 -07:00
Jeffrey Czyz
9dd2be15e9 Remove duplicate specification of features
Features for a given context are duplicated throughout the features
module. Use a macro for defining a Context and the applicable features
such that features only need to be defined for a Context in one place.
The Context provides bitmasks for selecting known and unknown feature
flags.

BOLT 1 and BOLT 9 refer to features as "known" if a peer understands
them. They also use the term "supported" to mean either optional or
required.

Update the features module to use similar terminology.
- Define contexts in terms of required and optional features rather than
  just supported features
- Define known features as those that are optional or required
- Rename supported() constructor to known()

For completeness, clear_optional_bit for each feature is now called
clear_bits and clears both optional and required bits.
2020-04-29 11:09:23 -07:00
Jeffrey Czyz
77b467c845 Improve features module documentation 2020-04-29 11:09:23 -07:00
Jeffrey Czyz
491bbc56cf Encapsulate feature flag checking and manipulation
Each feature is represented by two bits within Features' flags field.
Working with these flags requires bitwise operations, which can be error
prone. Rather than directly checking and manipulating bits, encapsulate
the bits within each feature trait and provide mechanisms for doing so.

This removes the need to comment on which features correspond to bitwise
expressions since the expressions use feature trait identifiers instead.

With this approach, byte literals and expressions can be evaluated at
compile time still. However, for these cases, knowing which byte within
the flags that a feature corresponds to still must be determined by the
implementor.

Remove the special case where initial_routing_sync has no even bit. Now,
it (bit 2) is considered known by the implementation.
2020-04-29 11:07:47 -07:00
Jeffrey Czyz
07cea6bfed Set initial_routing_sync in InitFeatures
The initial_routing_sync feature is set by peer_handler whenever a full
sync of the network graph is desired. It is not explicitly set when
creating features with InitFeatures::supported().

An upcoming refactor will change supported() to known(), which will
return all features known by the implementation. Thus, the
initial_routing_sync flag will need to be set by default. This commit
makes the behavior change ahead of the refactor.
2020-04-29 11:07:47 -07:00
Dr. Maxim Orlovsky
dde344a51d Adopting (W)PubkeyHash types 2020-04-29 12:37:57 +02:00
Dr. Maxim Orlovsky
27079e04d7 Adopting new bitcoin hash types and crate version 2020-04-29 12:37:46 +02:00
Dr. Maxim Orlovsky
eff8af2110 BDR: Linearizing secp256k1 deps 2020-04-28 16:17:44 +02:00
Dr. Maxim Orlovsky
4909d3cd6a Bitcoin deps refactoring (BDR): Linearizing bitcoin_hash deps 2020-04-28 16:17:42 +02:00
Jeffrey Czyz
c1db30d5be Unset upfront_shutdown_script using bit clearing
The test_upfront_shutdown_script functional test clears this feature
flag. However, the method used to clear the flag is implemented by bit
toggling. Thus, if the flag is not set the method would actually set it.
Implement the method using bit clearing instead.
2020-04-27 23:29:23 -07:00
Matt Corallo
8b18d906bb Bump versions to 0.0.11/net-tokio 0.0.3 2020-04-24 22:10:00 -04:00
Matt Corallo
03316cd141 Remove trivial assertions in LocalCommitmentTransaction fns
We don't need to assert that transaction structure is what we
expect when the transaction is created by a function twenty lines
up in the same file.
2020-04-24 21:23:51 -04:00
Matt Corallo
92c0698865 Remove TODOs from documentation in keysinterface
We should never be exposing our own TODOs to the world.
2020-04-24 21:23:51 -04:00
Matt Corallo
29199fae46 Don't modify LocalCommitmemntTransaction after construction
Instead of adding signatures to LocalCommitmentTransactions, we
instead leave them unsigned and use them to construct signed
Transactions when we want them. This cleans up the guts of
LocalCommitmentTransaction enough that we can, and do, expose its
state to the world, allowing external signers to have a basic
awareness of what they're signing.
2020-04-24 21:23:51 -04:00
Matt Corallo
7159d1546a Batch-sign local HTLC txn with a well-doc'd API, returning sigs
1107ab06c3 introduced an API to have a
ChannelKeys implementer sign HTLC transactions by calling into the
LocalCommitmentTransaction object, which would then store the tx.

This API was incredibly awkward, both because it required an
external signer trust our own internal interfaces, but also because
it didn't allow for any inspection of what was about to be signed.

Further, it signed the HTLC transactions one-by-one in a somewhat
inefficient way, and there isn't a clear way to resolve this (as
the which-HTLC parameter has to refer to something in between the
HTLC's arbitrary index, and its index in the commitment tx, which
has "holes" for the non-HTLC outputs and skips some HTLCs).

We replace it with a new function in ChannelKeys which allows us
to sign all HTLCs in a given commitment transaction (which allows
for a bit more effeciency on the signers' part, as well as
sidesteps the which-HTLC issue). This may also simplify the signer
implementation as we will always want to sign all HTLCs spending a
given commitment transaction at once anyway.

We also de-mut the LocalCommitmentTransaction passed to the
ChanKeys, instead opting to make LocalCommitmentTransaction const
and avoid storing any new HTLC-related data in it.
2020-04-24 21:23:51 -04:00
Matt Corallo
bf74bb625f Return Result<Signature> instead of modifying args in ChannelKeys
This cleans up sign_local_commitment somewhat by returning a
Result<Signaure, ()> over the local commitment transaction instead
of modifying the struct which was passed in.

This is the first step in making LocalCommitmentTransaction a
completely pub struct, using it just to communicate enough
information to the user to allow them to construct a signaure
instead of having it contain a bunch of logic.

This should make it much easier to implement a custom ChannelKeys
by disconnecting the local commitment transaction signing from our
own datastructures.
2020-04-24 21:23:51 -04:00
Matt Corallo
ddd85fb550 Track signing of local txn in channelmonitor and refuse updates
In e46e183084 we began tracking
whether a local commitment transaction had been signed and
broadcast in OnchainTxHandler, refusing to update the local
commitment transaction state in the ChannelMonitor on that basis.

This is fine, except that it doesn't make a lot of sense to store
the full local transaction state in OnchainTxHandler - we should be
providing it the unsigned local transaction at the time we wish to
broadcast and no more (just like we do all other transaction data).
2020-04-24 18:51:29 -04:00