rust-lightning
3 years agoFail holding-cell AddHTLCs on Channel deser to match disconnection 2020-11-holding-cell-add-panic
Matt Corallo [Thu, 19 Nov 2020 00:28:09 +0000 (19:28 -0500)]
Fail holding-cell AddHTLCs on Channel deser to match disconnection

As Channel::write says in the comment at the top: "we write out as
if remove_uncommitted_htlcs_and_mark_paused had just been called",
except that we previously deliberately included holding-cell
AddHTLC events in the serialization. On the flip side, in
remove_uncommitted_htlcs_and_mark_paused, we removed pending
AddHTLC events under the assumption that, if we can't forward
something ASAP, its better to fail it back to the origin than to
sit on it for a while.

Given there's likely to be just as large a time-lag between
ser/deserialization as between when a peer dis/reconnects, there
isn't much of a reason for this difference. Worse, we debug_assert
that there are no pending AddHTLC holding cell events when doing a
reconnect, so any tests or fuzzers which deserialized a
ChannelManager with AddHTLC events would panic.

We resolve this by adding logic to fail any holding-cell AddHTLC
events upon deserialization, in part because trying to forward it
before we're sure we have an up-to-date chain is somewhat risky -
the sender may have already gone to chain while our upstream has
not.

3 years agoMerge pull request #611 from valentinewallace/fix-missing-htlc-claim
Matt Corallo [Tue, 17 Nov 2020 02:15:02 +0000 (18:15 -0800)]
Merge pull request #611 from valentinewallace/fix-missing-htlc-claim

Tell ChannelMonitors about HTLCs fulfilled after channel close

3 years agoClaim HTLC output on-chain if preimage is recv'd after force-close
Valentine Wallace [Thu, 5 Nov 2020 21:37:24 +0000 (16:37 -0500)]
Claim HTLC output on-chain if preimage is recv'd after force-close

If we receive a preimage for an outgoing HTLC that solves an output on a
backwards force-closed channel, we need to claim the output on-chain.

Note that this commit also gets rid of the channel monitor redundantly setting
`self.counterparty_payment_script` in `check_spend_counterparty_transaction`.

Co-authored-by: Antoine Riard <ariard@student.42.fr>
Co-authored-by: Valentine Wallace <vwallace@protonmail.com>
3 years agoSplit channelmonitor's broadcast_by_holder_state
Valentine Wallace [Thu, 12 Nov 2020 23:37:47 +0000 (18:37 -0500)]
Split channelmonitor's broadcast_by_holder_state

Now callers will separately retrieve the claim requests/
holder revokable script and the new watched holder outputs.
This will be used in the next commit for times when we
need to get holder claim requests, but don't have access to
the holder commitment transaction.

3 years agoExtend update_monitor logging
Valentine Wallace [Mon, 26 Oct 2020 19:25:40 +0000 (15:25 -0400)]
Extend update_monitor logging

Helpful for debugging. I also included the change in the provide_preimage method
signature which will be used in an upcoming commit, because commit-wise it was
easier to combine the changes.

3 years agoUpdate monitor with preimage after channel close
Valentine Wallace [Fri, 23 Oct 2020 15:55:58 +0000 (11:55 -0400)]
Update monitor with preimage after channel close

If the channel is hitting the chain right as we receive a preimage,
previous to this commit the relevant ChannelMonitor would never
learn of this preimage.

3 years agoAdd prev_channel_outpoint to previous hop data
Valentine Wallace [Thu, 22 Oct 2020 17:32:50 +0000 (13:32 -0400)]
Add prev_channel_outpoint to previous hop data

This will be used in upcoming commits to allow us to update a channel
monitor with a preimage after its channel has closed.

3 years agoMerge pull request #721 from TheBlueMatt/2020-09-649-bindings
Matt Corallo [Thu, 12 Nov 2020 21:22:54 +0000 (13:22 -0800)]
Merge pull request #721 from TheBlueMatt/2020-09-649-bindings

Bindings Updates for #649

3 years agoMerge pull request #745 from ariard/2020-11-getting-started
Matt Corallo [Thu, 12 Nov 2020 17:59:07 +0000 (09:59 -0800)]
Merge pull request #745 from ariard/2020-11-getting-started

Add a Getting Started in CONTRIBUTING.md

3 years agoMerge pull request #746 from valentinewallace/remove-todo
Matt Corallo [Tue, 10 Nov 2020 16:34:19 +0000 (08:34 -0800)]
Merge pull request #746 from valentinewallace/remove-todo

Remove unnecessary todo

3 years agoAdd a Getting Started
Antoine Riard [Mon, 2 Nov 2020 16:06:36 +0000 (11:06 -0500)]
Add a Getting Started

Fix by Steve Lee <moneyball@users.noreply.github.com>

3 years agoRemove unnecessary todo
Valentine Wallace [Fri, 6 Nov 2020 18:30:15 +0000 (13:30 -0500)]
Remove unnecessary todo

The ChannelMonitor already monitors the chain for counterparties
revealing preimages, and will give the HTLCSources back to the
ChannelManager for claiming. Thus it's unnecessary for the ChannelManager
to monitor these HTLCs itself.

See is_resolving_htlc_output:
- if the counterparty broadcasted and then claimed one of the HTLCs we
  offered them, line 2015 is where the ChannelMonitor gives the ChannelManager
  the HTLC source
- if we broadcasted and they claimed an HTLC we offered them, line 2025 is
  where the ChannelMonitor gives the ChannelManager the HTLC source

3 years ago[bindings] update generated code 2020-09-649-bindings
Matt Corallo [Wed, 21 Oct 2020 18:54:30 +0000 (14:54 -0400)]
[bindings] update generated code

3 years agoUpdate demo.cpp for new tuple code
Matt Corallo [Thu, 8 Oct 2020 23:36:51 +0000 (19:36 -0400)]
Update demo.cpp for new tuple code

3 years ago[bindings] Un-Box Tuple mapping
Matt Corallo [Thu, 8 Oct 2020 23:35:50 +0000 (19:35 -0400)]
[bindings] Un-Box Tuple mapping

Because the C++ wrappers require being able to memset(0) the C
structs to skip free(), we'd previously mapped tuples with two
pointer indirections. However, because all other types already
support memset(0)'ing to disable free() logic, we can skip the
pointer indirections and the behavior is still correct.

3 years ago[bindings] Fix typo in opaque struct docs found by Val
Matt Corallo [Wed, 21 Oct 2020 18:44:55 +0000 (14:44 -0400)]
[bindings] Fix typo in opaque struct docs found by Val

3 years ago[bindings] Use the same SipHash keys to make C++ header stable
Matt Corallo [Thu, 8 Oct 2020 18:43:37 +0000 (14:43 -0400)]
[bindings] Use the same SipHash keys to make C++ header stable

3 years ago[bindings] Use enum to describe deref'ing needed for Option<> inners
Matt Corallo [Thu, 8 Oct 2020 18:28:07 +0000 (14:28 -0400)]
[bindings] Use enum to describe deref'ing needed for Option<> inners

3 years agoUpdate bindings to latest upstream code
Matt Corallo [Fri, 2 Oct 2020 02:21:19 +0000 (22:21 -0400)]
Update bindings to latest upstream code

3 years agoDrop the now-unused usizeslice bindings struct
Matt Corallo [Fri, 2 Oct 2020 02:20:48 +0000 (22:20 -0400)]
Drop the now-unused usizeslice bindings struct

3 years agoUpdate bindings demo apps for new code upstream
Matt Corallo [Fri, 2 Oct 2020 02:20:09 +0000 (22:20 -0400)]
Update bindings demo apps for new code upstream

3 years agoMove a struct in bindings up to define it before it is used
Matt Corallo [Fri, 2 Oct 2020 01:34:26 +0000 (21:34 -0400)]
Move a struct in bindings up to define it before it is used

This is a limitations in the bindings crate, but not one that's
going to be fixed right now.

3 years ago[bindings] Drop one static-lifetime restriction and check success
Matt Corallo [Fri, 2 Oct 2020 01:32:39 +0000 (21:32 -0400)]
[bindings] Drop one static-lifetime restriction and check success

In general we should stop enforcing that all lifetimes are static
- we may take references from C and its up to reviewing the diff on
the bindings changes and the user(s) to ensure lifetimes are valid.

Also asserts a success criteria that was missed before.

3 years ago[bindings] Handle type X = Y aliasing in type resolution
Matt Corallo [Fri, 2 Oct 2020 01:28:57 +0000 (21:28 -0400)]
[bindings] Handle type X = Y aliasing in type resolution

For non-generic type aliases which are meant as convinient aliases
for more complex types, we need to store the aliased type (with all
paths made absolute) and use that in type resolution.

The most code by far is just making all the paths in a type absolute
but its not too bad either.

3 years ago[bindings] Handle ::-prefixed paths in a few places
Matt Corallo [Fri, 2 Oct 2020 01:24:32 +0000 (21:24 -0400)]
[bindings] Handle ::-prefixed paths in a few places

3 years ago[bindings] Remove some uneccessary no-multi-ident path restrictions
Matt Corallo [Fri, 2 Oct 2020 01:22:01 +0000 (21:22 -0400)]
[bindings] Remove some uneccessary no-multi-ident path restrictions

3 years ago[bindings] Avoid guessing whether resolved type is a ref in blocks
Matt Corallo [Thu, 1 Oct 2020 22:42:33 +0000 (18:42 -0400)]
[bindings] Avoid guessing whether resolved type is a ref in blocks

In some cases, things which are a Rust Reference (ie slices), we
may still want to map them as a non-reference and need to put a
"mut " in front of the variable name in a function decl. This
worked fine by just checking for the slice case, except that we
are about to add support for type aliases, which no longer match
the naive case.

Instead, we can just have the types module print out the C type and
check if it begins with a '&' to figure out if it is a reference.

3 years ago[bindings] Support mapping slices which contain tuples (with refs)
Matt Corallo [Fri, 25 Sep 2020 17:25:35 +0000 (13:25 -0400)]
[bindings] Support mapping slices which contain tuples (with refs)

New work upstream puts tuples in slices, which is a very reasonable
thing to expect, however we don't know how to generate conversions
for such objects. Making it more complicated, upstream changes also
include references to things inside such slices, which requires
special handling to avoid creating dangling references.

This adds support for converting such objects, noting that slices
need to be converted first into Vecs which own their underlying
objects and then need to map any reference types into references.

3 years ago[bindings] Give Transaction objects a buffer-is-owned flag.
Matt Corallo [Thu, 24 Sep 2020 23:03:05 +0000 (19:03 -0400)]
[bindings] Give Transaction objects a buffer-is-owned flag.

A lot of our container mapping depends on the `is_owned` flag
which we have for in-crate mapped objects to map references and
non-references into the same container type. Transaction was
mapped to two completely different types (a slice and a Vec type),
which led to a number of edge cases in the bindings generation.
Specifically, I spent a few days trying to map
`[(A, &Transaction)]` properly and came up empty - we map slices
into the same types as Vecs (and rely on the `is_owned` flag to
avoid double-free) and the lack of one for `Transaction` would have
required a special-case in numerous functions.

Instead, we just add a flag in `Transaction` to mirror what we do
for in-crate types and check it before free-ing any underlying
memory.

Note that, sadly, because the c_types objects aren't mapped as a
part of our C++ bindings generation, you have to manually call
`Transaction_free()` even in C++.

3 years agoMerge pull request #681 from valentinewallace/data-persister-refactor
Matt Corallo [Fri, 16 Oct 2020 21:35:33 +0000 (14:35 -0700)]
Merge pull request #681 from valentinewallace/data-persister-refactor

Add ChannelDataPersister trait and point ChainMonitor to it.

3 years agoFix clippy
Valentine Wallace [Tue, 13 Oct 2020 03:24:00 +0000 (23:24 -0400)]
Fix clippy

3 years agoRename ChannelMonitor::write_for_disk --> serialize_for_disk
Valentine Wallace [Mon, 5 Oct 2020 21:39:28 +0000 (17:39 -0400)]
Rename ChannelMonitor::write_for_disk --> serialize_for_disk

This function does not necessarily write to disk, it can serialize to anything
that implements Writer.

3 years agoTest that Persist temp and perm failures behave as expected.
Valentine Wallace [Fri, 2 Oct 2020 23:33:16 +0000 (19:33 -0400)]
Test that Persist temp and perm failures behave as expected.

If a persister returns a temporary failure, the channel monitor should be able
to be put on ice and then revived later. If a persister returns a permanent
failure, the channel should be force closed.

3 years agoAdd a sample module FilesystemPersister.
Valentine Wallace [Wed, 16 Sep 2020 21:46:11 +0000 (17:46 -0400)]
Add a sample module FilesystemPersister.

Intended to be a cross-platform implementation of the
channelmonitor::Persist trait.

This adds a new lightning-persister crate, that uses the
newly exposed lightning crate's test utilities.

Notably, this crate is pretty small right now. However, due to
future plans to add more data persistence (e.g. persisting the
ChannelManager, etc) and a desire to avoid pulling in filesystem
usage into the core lightning package, it is best for it to be
separated out.

Note: Windows necessitates the use of OpenOptions with the `write`
permission enabled to `sync_all` on a newly opened channel's
data file.

3 years agoIntegrate Persist into ChainMonitor.
Valentine Wallace [Tue, 15 Sep 2020 00:50:04 +0000 (20:50 -0400)]
Integrate Persist into ChainMonitor.

- The ChainMonitor should:
  Whenever a new channel is added or updated, these updates
  should be conveyed to the persister and persisted to disk.
  Even if the update errors while it's being applied, the
  updated monitor still needs to be persisted.

3 years agoAdd Persist trait.
Valentine Wallace [Wed, 16 Sep 2020 21:43:33 +0000 (17:43 -0400)]
Add Persist trait.

Implementors of Persist are responsible for persisting new ChannelMonitors
and ChannelMonitor updates to disk/backups.

3 years agoPut test utilities behind a feature flag.
Valentine Wallace [Wed, 16 Sep 2020 21:27:13 +0000 (17:27 -0400)]
Put test utilities behind a feature flag.

The utilities will still be part of cfg(test). The purpose of this
is to enable other crates in the workspace to use the test utilities.

3 years agoMerge pull request #653 from ariard/2020-06-fix-outputs-tracking
Matt Corallo [Thu, 15 Oct 2020 00:45:33 +0000 (17:45 -0700)]
Merge pull request #653 from ariard/2020-06-fix-outputs-tracking

Add outpoint index in watch_outputs to fix tracking

3 years agoAssert on correct registeration of outputs index
Antoine Riard [Fri, 9 Oct 2020 00:59:21 +0000 (20:59 -0400)]
Assert on correct registeration of outputs index

We remove test_no_failure_dust_htlc_local_commitment from our test
framework as this test deliberately throwing junk transaction in
our monitoring parsing code is hitting new assertions.

This test was added in #333, but it sounds as an oversight as the
correctness intention of this test (i.e verifying lack of dust
HTLCs canceling back in case of junk commitment transaction) doesn't
currently break.

3 years ago[bindings] Add support for `Option<T>` where T is a mapped trait
Matt Corallo [Fri, 25 Sep 2020 16:12:03 +0000 (12:12 -0400)]
[bindings] Add support for `Option<T>` where T is a mapped trait

When mapping an `Option<T>` where T is a mapped trait, we need to
move out of the `*mut T`, however the current generation results in
a `*const T` and a conversion that just takes a reference to the
pointed-to object. This is because the only place this code was
previously used was for slices, which *do* need a reference.

Additionally, we need to know how to convert `Option` containers
which do not contain an opaque type.

Sadly, the easiest way to get the desired result is to add another
special case in container mapping, keeping the current behavior for
slices, but moving out of the pointed-to object for other types.

3 years agoIgnore cbindgen version in latest-bindings-in-git check.
Matt Corallo [Fri, 25 Sep 2020 18:13:38 +0000 (14:13 -0400)]
Ignore cbindgen version in latest-bindings-in-git check.

Currently the check_binidngs GitHub CI job always fails when there
is a new cbindgen release because the cbindgen version is in the
generated header file. When the new version doesn't change the
generated header except for the version number, we should ignore
the difference.

3 years ago[bindings] Use == null() instead of is_null() to avoid ambiguity
Matt Corallo [Wed, 23 Sep 2020 01:46:26 +0000 (21:46 -0400)]
[bindings] Use == null() instead of is_null() to avoid ambiguity

When we have a `Trait` wrapped as an `Option<Trait>`, we called
`<*const Trait>.is_null()` which resulted in rustc trying to take
the most braindead option of dereferencing the whole thing and
hitting a recursive dereference since we
`impl Deref<Target=Trait> for Trait` for all our traits.

Instead, we can be explicit and just compare the pointer directly
with `std::ptr::null()` which avoids this.

3 years ago[bindings] Include a GenericTypes context in more places
Matt Corallo [Wed, 16 Sep 2020 21:18:18 +0000 (17:18 -0400)]
[bindings] Include a GenericTypes context in more places

A few places got a None in the previous commit to avoid increasing
the diff size. However, it makes sense to have GenericTypes contexts
there, so we pipe them through the neccessary places.

3 years ago[bindings] Push generic resolution into resolve_path
Matt Corallo [Wed, 16 Sep 2020 01:30:45 +0000 (21:30 -0400)]
[bindings] Push generic resolution into resolve_path

Like the previous commit pushing into maybe_resolve_path, this
makes generic resolution a part of type resolution everywhere.

3 years ago[bindings] Push generic resolution into maybe_resolve_path
Matt Corallo [Tue, 15 Sep 2020 22:49:59 +0000 (18:49 -0400)]
[bindings] Push generic resolution into maybe_resolve_path

This pushes down the logic to check if a given Path is, in fact,
a reference to a generic into the common maybe_resolve_path instead
of doing it redundantly in a few different places. Net loss of LoC.

3 years agoSupport `use ident;` in bindings
Matt Corallo [Tue, 15 Sep 2020 22:28:08 +0000 (18:28 -0400)]
Support `use ident;` in bindings

Somehow we'd never had any cases of it and it requires an extra
(trivial) match arm.

3 years agoAdd README note about key validity assertions at the FFI boundary
Matt Corallo [Mon, 14 Sep 2020 15:33:59 +0000 (11:33 -0400)]
Add README note about key validity assertions at the FFI boundary

3 years agoAdd test_htlc_no_detection
Antoine Riard [Tue, 6 Oct 2020 17:01:58 +0000 (13:01 -0400)]
Add test_htlc_no_detection

This test is a mutation to underscore the detetection logic bug
we had before #653. HTLC value routed is above the remaining
balance, thus inverting HTLC and `to_remote` output. HTLC
will come second and it wouldn't be seen by pre-#653 detection
as we were eneumerate()'ing on a watched outputs vector (Vec<TxOut>)
thus implictly relying on outputs order detection for correct
spending children filtering.

3 years agoAdd transaction index in watched_outputs
Antoine Riard [Wed, 1 Jul 2020 17:49:11 +0000 (13:49 -0400)]
Add transaction index in watched_outputs

Previously, outputs were monitored based on txid and an index yelled
from an enumeration over the returned selected outputs by monitoring
code. This is always have been broken but was only discovered while
introducing anchor outputs as those ones rank always first per BIP69.
We didn't have test cases where a HTLC was bigger than a party balance
on a holder commitment and thus not ranking first.

Next commit introduce test coverage.

3 years agoMerge pull request #738 from TheBlueMatt/2020-10-opt-test
Matt Corallo [Sat, 10 Oct 2020 22:21:11 +0000 (15:21 -0700)]
Merge pull request #738 from TheBlueMatt/2020-10-opt-test

Fix passing -O1 to build from `cargo test`

3 years agoMerge pull request #740 from rloomba/rloomba/trivial-clippy-fixes
Matt Corallo [Fri, 9 Oct 2020 15:29:56 +0000 (08:29 -0700)]
Merge pull request #740 from rloomba/rloomba/trivial-clippy-fixes

trivial clippy warning fixes

3 years agotrivial changes to fix clippy::write_with_newline warnings
Ryan Loomba [Thu, 8 Oct 2020 22:46:43 +0000 (15:46 -0700)]
trivial changes to fix clippy::write_with_newline warnings

3 years agoMerge pull request #739 from rloomba/rloomba/add-clippy-to-travis
Matt Corallo [Thu, 8 Oct 2020 18:21:00 +0000 (11:21 -0700)]
Merge pull request #739 from rloomba/rloomba/add-clippy-to-travis

Add clippy to Travis integration

3 years agoadd linting to Github CI
Ryan Loomba [Thu, 8 Oct 2020 17:47:49 +0000 (10:47 -0700)]
add linting to Github CI

3 years agoadd clippy to travis integration
Ryan Loomba [Tue, 6 Oct 2020 23:49:06 +0000 (16:49 -0700)]
add clippy to travis integration

3 years agofix all clippy::redundant_field_names warnings
Ryan Loomba [Tue, 6 Oct 2020 23:47:23 +0000 (16:47 -0700)]
fix all clippy::redundant_field_names warnings

3 years agoFix passing -O1 to build from `cargo test` 2020-10-opt-test
Matt Corallo [Mon, 5 Oct 2020 16:47:08 +0000 (12:47 -0400)]
Fix passing -O1 to build from `cargo test`

In 9e03087d6acbc876a5ad1c9b9d8746bf18d5ca86 we started setting
`opt-level` only on profile.test and not profile.dev. When that
commit was authored I tested only that rustc was being called with
opt-level set in its flags, not that the resulted run ran at the
speed I expected. It seems profile.test isn't applied properly to
dependencies or so, resulting in tests running much slower than
they do at profile.dev.opt-level=1.

3 years agoMerge pull request #734 from TheBlueMatt/2020-10-ci-no-git-conf
Matt Corallo [Mon, 5 Oct 2020 17:27:35 +0000 (10:27 -0700)]
Merge pull request #734 from TheBlueMatt/2020-10-ci-no-git-conf

Don't let CI fail to check commits b/c git isn't configured in CI

3 years agoMerge pull request #722 from TheBlueMatt/2020-09-broken-fn
Matt Corallo [Mon, 5 Oct 2020 16:50:08 +0000 (09:50 -0700)]
Merge pull request #722 from TheBlueMatt/2020-09-broken-fn

Drop the redundant/broken `ChannelMonitor::get_monitored_outpoints`

3 years agoDrop now-unused Vec of outpoints in remote-commitment-tx-tracking 2020-09-broken-fn
Matt Corallo [Sun, 27 Sep 2020 22:05:28 +0000 (18:05 -0400)]
Drop now-unused Vec of outpoints in remote-commitment-tx-tracking

This nearly fully reverts 6f08779b0439e7e4367a75f4ee88de093dfb68cb,
removing the extra data storage that it added.

3 years agoDrop the redundant/broken `ChannelMonitor::get_monitored_outpoints`
Matt Corallo [Sun, 27 Sep 2020 21:52:09 +0000 (17:52 -0400)]
Drop the redundant/broken `ChannelMonitor::get_monitored_outpoints`

In review of the final doc changes in #649, I noticed there
appeared to be redundant monitored-outpoints function in
`ChannelMonitor` - `get_monitored_outpoints()` and
`get_outputs_to_watch()`.

In 6f08779b0439e7e4367a75f4ee88de093dfb68cb,
get_monitored_outpoints() was added, with its behavior largely the
same as today's - only returning the set of remote commitment txn
outputs that we've learned about on-chain. This is clearly not
sufficient, and in 73dce207dd0ea6c3ac57af3ebb8b87ee03e82c9e,
`get_outputs_to_watch` was added which was overly cautious to
ensure nothing was missed. Still, the author of 73dce207dd0ea6c3ac5
(me) seemed entirely unaware of the work in 6f08779b0439e7e4367a75f
(also me), despite the function being the literal next function in
the same file. This is presumably because it was assumed that
`get_monitored_outpoints` referred to oupoints for which we should
monitor for spends of (which is true), while `get_outputs_to_watch`
referred to outpouts which we should monitor for the transaction
containing said output (which is not true), or something of that
nature. Specifically, it is the expected behavior that the only
time we care about `Filter::register_tx` is for the funding
transaction (which we aren't aware of the inputs of), but for all
other transactions we register interest on the basis of an outpoint
in the previous transaction (ie via `Filter::register_output`).

Here we drop the broken-on-day-one `get_monitored_outpoints()`
version, but assert in testing that the values which it would return
are all present in `get_outputs_to_watch()`.

3 years agoMerge pull request #716 from TheBlueMatt/2020-09-fee-tests
Matt Corallo [Mon, 5 Oct 2020 16:18:51 +0000 (09:18 -0700)]
Merge pull request #716 from TheBlueMatt/2020-09-fee-tests

(Fix and) Test that txn pay at least a minimum relay fee in functional tests

3 years agoTest that txn pay at least a minimum relay fee in functional tests 2020-09-fee-tests
Matt Corallo [Fri, 18 Sep 2020 22:28:19 +0000 (18:28 -0400)]
Test that txn pay at least a minimum relay fee in functional tests

This also pays a fee on the transactions we generate in response to
SpendableOutputDescriptors in tests.

This fixes the known issues in #630, though we should test for
standardness in other ways as well.

3 years agoFix feerate calculation on closing transactions
Matt Corallo [Fri, 18 Sep 2020 22:26:12 +0000 (18:26 -0400)]
Fix feerate calculation on closing transactions

This resolves a number of bugs around how we calculate feerates on
closing transactions:

 * We previously calculated the weight wrong both by always
   counting two outputs instead of counting the number of outputs
   that actually exist in the closing transaction and by not
   counting the witness redeemscript.
 * We use assertions to check the calculated weight matches what we
   actually build (with debug_assertions for variable-length sigs).
 * As an additional sanity check, we really should check that the
   transaction had at least min-relay-fee when we were the channel
   initator.

3 years agoFix max fee_satoshis constant to be 21 million, not 2.1 million.
Matt Corallo [Fri, 18 Sep 2020 17:05:43 +0000 (13:05 -0400)]
Fix max fee_satoshis constant to be 21 million, not 2.1 million.

Though hopefully we never see a fee of 2.1 million BTC, either...

3 years agoDon't let CI fail to check commits b/c git isn't configured in CI 2020-10-ci-no-git-conf
Matt Corallo [Fri, 2 Oct 2020 20:32:32 +0000 (16:32 -0400)]
Don't let CI fail to check commits b/c git isn't configured in CI

This fixes #733 by just setting a dummy git name/email before
calling `git rebase` in CI.

3 years agoMerge pull request #731 from TheBlueMatt/2020-10-fix-big-lock
Matt Corallo [Fri, 2 Oct 2020 18:53:48 +0000 (11:53 -0700)]
Merge pull request #731 from TheBlueMatt/2020-10-fix-big-lock

Actually hold the total_consistency_lock instead of take-and-drop

3 years agoMerge pull request #730 from TheBlueMatt/2020-09-no-rescan
Matt Corallo [Fri, 2 Oct 2020 18:22:44 +0000 (11:22 -0700)]
Merge pull request #730 from TheBlueMatt/2020-09-no-rescan

Drop last bits of rescan as its too complicated to be worth having

3 years agoActually hold the total_consistency_lock instead of take-and-drop 2020-10-fix-big-lock
Matt Corallo [Fri, 2 Oct 2020 16:51:25 +0000 (12:51 -0400)]
Actually hold the total_consistency_lock instead of take-and-drop

It was noticed (via clippy) by @casey that we were taking and then
immediately dropping the total_consistency_lock because `let _ =`
doesn't actually bind the response to anything. This appears to be
a consequence of wanting `if let Some(_) =` to not hold a ref to
the contained value at all, but is relatively surprising to me.

3 years agoDrop last bits of rescan as its too complicated to be worth having 2020-09-no-rescan
Matt Corallo [Wed, 30 Sep 2020 19:18:29 +0000 (15:18 -0400)]
Drop last bits of rescan as its too complicated to be worth having

Previously, we had a concept of "rescaning" blocks when we detected
a need to monitor for a new set of outputs in future blocks while
connecting a block. In such cases, we'd need to possibly learn about
these new spends later in the *same block*, requiring clients who
filter blocks to get a newly-filtered copy of the same block. While
redoing the chain access API, it became increasingly clear this was
an overly complicated API feature, and it seems likely most clients
will not use it anyway.

Further, any client who *does* filter blocks can simply update their
filtering algorithm to include any descendants of matched
transactions in the filter results, avoiding the need for rescan
support entirely.

Thus, it was decided that we'd move forward without rescan support
in #649, however to avoid significant further changes in the
already-large 649, we decided to fully remove support in a
follow-up.

Here, we remove the API features that existed for rescan and fix
the few tests to not rely on it.

After this commit, we now only ever have one possible version of
block connection transactions, making it possible to be
significantly more confident in our test coverage actually
capturing all realistic scenarios.

3 years agoDrop stale comment about a rescan that doesn't happen in tests
Matt Corallo [Wed, 30 Sep 2020 19:17:33 +0000 (15:17 -0400)]
Drop stale comment about a rescan that doesn't happen in tests

3 years agoMerge pull request #729 from casey/readme
Matt Corallo [Fri, 2 Oct 2020 16:02:15 +0000 (09:02 -0700)]
Merge pull request #729 from casey/readme

Add content to readme

3 years agoFix capitalization Gleb suggested
Matt Corallo [Fri, 2 Oct 2020 15:16:22 +0000 (11:16 -0400)]
Fix capitalization Gleb suggested

3 years agoClarify that lightning-net-tokio does networking only
Casey Rodarmor [Fri, 2 Oct 2020 03:55:31 +0000 (20:55 -0700)]
Clarify that lightning-net-tokio does networking only

3 years agoReword first paragraph and add tagline
Casey Rodarmor [Fri, 2 Oct 2020 03:28:41 +0000 (20:28 -0700)]
Reword first paragraph and add tagline

3 years agoAdd content to readme
Casey Rodarmor [Fri, 2 Oct 2020 02:34:02 +0000 (19:34 -0700)]
Add content to readme

- Change header to "Rust-Lightning"
- Add crate and documentation badges
- Add introductory paragraph
- Move previous intro content under "Status" heading

3 years agoMerge pull request #649 from jkczyz/2020-06-refactor-chain-listener
Matt Corallo [Thu, 1 Oct 2020 18:10:13 +0000 (11:10 -0700)]
Merge pull request #649 from jkczyz/2020-06-refactor-chain-listener

Refactor chain monitoring

3 years agoMerge branch '2020-06-refactor-chain-listener-move-chainmonitor' into 2020-06-refacto...
Jeffrey Czyz [Thu, 1 Oct 2020 16:35:05 +0000 (09:35 -0700)]
Merge branch '2020-06-refactor-chain-listener-move-chainmonitor' into 2020-06-refactor-chain-listener

3 years agoMove ln/channelmonitor.rs to chain/chainmonitor.rs
Jeffrey Czyz [Thu, 1 Oct 2020 15:50:15 +0000 (08:50 -0700)]
Move ln/channelmonitor.rs to chain/chainmonitor.rs

3 years agoMove channelmonitor.rs from ln to chain module
Jeffrey Czyz [Fri, 7 Aug 2020 17:58:15 +0000 (10:58 -0700)]
Move channelmonitor.rs from ln to chain module

Given the chain::Watch interface is defined in terms of ChannelMonitor
and ChannelMonitorUpdateErr, move channelmonitor.rs from the ln module
to the chain module.

3 years agoMerge ChainMonitor impl blocks
Jeffrey Czyz [Thu, 10 Sep 2020 22:59:59 +0000 (15:59 -0700)]
Merge ChainMonitor impl blocks

3 years agoDefine type alias for enumerated transaction data
Jeffrey Czyz [Wed, 9 Sep 2020 19:16:09 +0000 (12:16 -0700)]
Define type alias for enumerated transaction data

Transaction data from a block may be filtered before it is passed to
block_connected functions, which may need the index of each transaction
within the block. Rather than define each function in terms of a slice
of tuples, define a type alias for the slice where it can be documented.

3 years agoReplace WatchEvent usage with get_outputs_to_watch
Jeffrey Czyz [Fri, 7 Aug 2020 22:13:57 +0000 (15:13 -0700)]
Replace WatchEvent usage with get_outputs_to_watch

Outputs to watch are tracked by ChannelMonitor as of
73dce207dd0ea6c3ac57af3ebb8b87ee03e82c9e. Instead of determining new
outputs to watch independently using ChainWatchedUtil, do so by
comparing against outputs already tracked. Thus, ChainWatchedUtil and
WatchEvent are no longer needed.

3 years agoInclude funding TXO in outputs to watch
Jeffrey Czyz [Sat, 29 Aug 2020 23:04:46 +0000 (16:04 -0700)]
Include funding TXO in outputs to watch

The funding TXO was never added to ChannelMonitor's outputs_to_watch in
73dce207dd0ea6c3ac57af3ebb8b87ee03e82c9e. Include it when constructing a
ChannelMonitor.

3 years agoFix architecture diagram arrow directions
Jeffrey Czyz [Mon, 3 Aug 2020 23:55:11 +0000 (16:55 -0700)]
Fix architecture diagram arrow directions

Arrows should signify "calls" or "generates" unless noted.

3 years agoFix architecture diagram line length
Jeffrey Czyz [Mon, 3 Aug 2020 23:51:10 +0000 (16:51 -0700)]
Fix architecture diagram line length

3 years agoReplace WatchEventProvider with chain::Filter
Jeffrey Czyz [Thu, 30 Jul 2020 17:27:41 +0000 (10:27 -0700)]
Replace WatchEventProvider with chain::Filter

WatchEventProvider served as a means for replacing ChainWatchInterface.
However, it requires users to explicitly fetch WatchEvents, even if not
interested in them. Replace WatchEventProvider by chain::Filter, which
is an optional member of ChainMonitor. If set, interesting transactions
and output spends are registered such that blocks containing them can be
retrieved from a chain source in an efficient manner.

This is useful when the chain source is not a full node. For Electrum,
it allows for pre-filtered blocks. For BIP157/158, it serves as a means
to match against compact filters.

3 years agoRemove ChainListener
Jeffrey Czyz [Wed, 29 Jul 2020 20:02:29 +0000 (13:02 -0700)]
Remove ChainListener

BlockNotifier was removed in the previous commit, thus ChainListener is
no longer needed. Instead, anything needing chain events should be
notified directly.

3 years agoRemove BlockNotifier
Jeffrey Czyz [Wed, 29 Jul 2020 01:08:46 +0000 (18:08 -0700)]
Remove BlockNotifier

BlockNotifier is a convenience for handing blocks to listeners. However,
it requires that each listener conforms to the ChainListener interface.
Additionally, there are only two listeners, ChannelManager and
ChainMonitor, the latter of which may not be used when monitoring
channels remotely. Remove BlockNotifier since it doesn't provide much
value and constrains each listener to a specific interface.

3 years agoRemove Key parameter from ChainMonitor
Jeffrey Czyz [Thu, 6 Aug 2020 23:54:13 +0000 (16:54 -0700)]
Remove Key parameter from ChainMonitor

ChainMonitor's template Key parameter was meant to allow supporting
both local monitoring, where Key=OutPoint, and watchtowers, where Key=
(PublicKey, u32). Use OutPoint directly since the watchtower case will
not be supported this way.

3 years agoRename SimpleManyChannelMonitor to ChainMonitor
Jeffrey Czyz [Tue, 21 Jul 2020 05:12:14 +0000 (22:12 -0700)]
Rename SimpleManyChannelMonitor to ChainMonitor

ManyChannelMonitor was renamed chain::Watch in the previous commit. Use
a more concise name for an implementation that monitors the chain for
channel activity. Future work will parameterize the struct to allow for
different varieties of persistence. Thus, users usually will be able to
use ChainMonitor directly rather than implementing a chain::Watch that
wraps it.

3 years agoReplace ManyChannelMonitor with chain::Watch
Jeffrey Czyz [Tue, 21 Jul 2020 00:03:52 +0000 (17:03 -0700)]
Replace ManyChannelMonitor with chain::Watch

Rename ManyChannelMonitor to chain::Watch and move to chain/mod.rs,
where chain-related interfaces live. Update the documentation for
clarity and to conform to rustdoc formatting.

3 years agoRemove ChainWatchInterface
Jeffrey Czyz [Sat, 18 Jul 2020 06:19:15 +0000 (23:19 -0700)]
Remove ChainWatchInterface

The remaining use of ChainWatchInterface was replaced by chain::Access
in the previous commit, and thus it is no longer needed.

3 years agoReplace ChainWatchInterface in NetGraphMsgHandler
Jeffrey Czyz [Sat, 18 Jul 2020 05:08:34 +0000 (22:08 -0700)]
Replace ChainWatchInterface in NetGraphMsgHandler

ChainWatchInterface was intended as an interface for watching rather
than accessing the chain. Remove get_chain_utxo and add chain::Access
trait for this behavior. Wrap it with an Option in NetGraphMsgHandler in
order to simplify the error interface.

3 years agoRemove ChainWatchInterface from channelmonitor.rs
Jeffrey Czyz [Thu, 16 Jul 2020 05:58:38 +0000 (22:58 -0700)]
Remove ChainWatchInterface from channelmonitor.rs

Use of ChainWatchInterface was replaced with WatchEvent in the previous
commit. Remove it from the parameterization of SimpleManyChannelMonitor
since it is no longer needed.

3 years agoReplace use of ChainWatchInterface with WatchEvent
Jeffrey Czyz [Thu, 9 Jul 2020 06:37:13 +0000 (23:37 -0700)]
Replace use of ChainWatchInterface with WatchEvent

SimpleManyChannelMonitor is parameterized by ChainWatchInterface to
signal what transactions and outputs to watch for on chain. The
interface has grown to cover chain access (via get_chain_utxo) and block
block filtering (via filter_block and reentered), which has added
complexity for implementations and user (see ChainWatchInterfaceUtil).

Pull the watch functionality out as a first step to eliminating
ChainWatchInterface entirely.

3 years agoAdd test utilities for {dis}connecting a block
Jeffrey Czyz [Tue, 14 Jul 2020 17:29:11 +0000 (10:29 -0700)]
Add test utilities for {dis}connecting a block

Replace direct uses of BlockNotifier in functional tests with utility
functions. This is in preparation for signaling watch events back via a
refactoring of ManyChannelMonitor and ChainWatchInterface. Those events
will be processed by connect_block.

3 years agoReplace BlockNotifier with Node in test utilities
Jeffrey Czyz [Tue, 14 Jul 2020 17:11:50 +0000 (10:11 -0700)]
Replace BlockNotifier with Node in test utilities

Change confirm_transaction and connect_blocks to take a Node instead of
a BlockNotifier. This is in preparation for signaling watch events back
via a refactoring of ManyChannelMonitor and ChainWatchInterface.

3 years agoSimplify BlockNotifier tests
Jeffrey Czyz [Tue, 16 Jun 2020 22:24:22 +0000 (15:24 -0700)]
Simplify BlockNotifier tests

Use a simple ChainListner implementation rather than large test objects
for testing BlockNotifier.

Remove unregister_single_listener_ref_test since it is redundant with
unregister_single_listener_test.

Remove unnecessary clone() calls.

3 years agoAlign ChannelMonitor interface with ChainListener
Jeffrey Czyz [Fri, 26 Jun 2020 17:43:24 +0000 (10:43 -0700)]
Align ChannelMonitor interface with ChainListener

ChannelMonitor has block_connected and block_disconnected methods called
by <SimpleManyChannelMonitor as ChainListener>. Use similar parameters
in ChannelMonitor such that transformations are not needed and the
interface is more closely aligned with ChainListener.