Commit graph

2671 commits

Author SHA1 Message Date
Willem Van Lint
ef5be580f5 Remove AvailableBalances::balance_msat
The ChannelMonitor::get_claimable_balances method provides a more
straightforward approach to the balance of a channel, which satisfies
most use cases. The computation of AvailableBalances::balance_msat is
complex and originally had a different purpose that is not applicable
anymore.
2023-08-15 11:42:00 -07:00
Valentine Wallace
6144e30c0e
Wrap process_onion_failure comments at 100chars
And fix an its vs it's grammar
2023-08-14 14:12:10 -04:00
Valentine Wallace
9f5e574b0b
Clean up process_onion_failure
Get rid of a bunch of indentation and be more idiomatic.
2023-08-14 14:12:09 -04:00
Duncan Dean
eda6e9d0ec
Send error message to peer if we drop an unfunded channel on timeout 2023-08-14 16:22:33 +02:00
Chris Waterson
01847277b9 Wait to create a channel until after accepting.
Create a new table in 'peer_state' to maintain unaccepted inbound
channels; i.e., a channel for which we've received an 'open_channel'
message but that user code has not yet confirmed for acceptance. When
user code accepts the channel (e.g. via 'accept_inbound_channel'),
create the channel object and as before.

Currently, the 'open_channel' message eagerly creates an
InboundV1Channel object before determining if the channel should be
accepted. Because this happens /before/ the channel has been assigned
a user identity (which happens in the handler for OpenChannelRequest),
the channel is assigned a random user identity. As part of the
creation process, the channel's cryptographic material is initialized,
which then uses this randomly generated value for the user's channel
identity e.g. in SignerProvider::generate_channel_keys_id.

By delaying the creation of the InboundV1Channel until /after/ the
channel has been accepted, we ensure that we defer cryptographic
initialization until we have given the user the opportunity to assign
an identity to the channel.
2023-08-13 19:40:17 -07:00
Matt Corallo
131560e08f
Merge pull request #2387 from vladimirfomene/add_extra_fields_to_ChannelClosed_event
Add counterparty_node_id & channel_capacity to ChannelClosed event
2023-08-10 22:43:21 +00:00
Matt Corallo
9e4a35a60d
Merge pull request #2308 from alecchendev/2023-05-custom-htlc-tlvs
Add support for custom HTLC TLVs
2023-08-10 17:26:30 +00:00
Matt Corallo
7e3de70448
Merge pull request #2481 from TheBlueMatt/2023-08-keysend-robust-test
Scope payment preimage in do_test_keysend_payments
2023-08-09 00:40:53 +00:00
Alec Chen
dec3fb316a
Enforce explicit claims on payments with even custom TLVs
Because we don't know which custom TLV type numbers the user is
expecting (and it would be cumbersome for them to tell us), instead of
failing unknown even custom TLVs on deserialization, we accept all
custom TLVs, and pass them to the user to check whether they recognize
them and choose to fail back if they don't. However, a user may not
check for custom TLVs, in which case we should reject any even custom
TLVs as unknown.

This commit makes sure a user must explicitly accept a payment with
even custom TLVs, by (1) making the default
`ChannelManager::claim_funds` fail if the payment had even custom TLVs
and (2) adding a new function
`ChannelManager::claim_funds_with_known_custom_tlvs` that accepts them.

This commit also refactors our custom TLVs test and updates various
documentation to account for this.
2023-08-08 16:16:45 -05:00
Alec Chen
8ff1604647
Add FailureCode::InvalidOnionPayload variant
When a user decodes custom TLVs, if they fail to recognize even type
numbers they should fail back with the correct failure code and fail
data. This new variant adds the proper failure variant for the user to
pass into `ChannelManager::fail_htlc_backwards_with_reason`.

Note that the enum discriminants were removed because when adding a
struct variant we can no longer make use of the discriminant through
casting like we previously did, and instead have to manually define the
associated failure code anyway.
2023-08-08 16:16:44 -05:00
Alec Chen
e84fb067aa
Drop non-matching custom TLVs when receiving MPP
Upon receiving multiple payment parts with custom TLVs, we fail payments
if they have any non-matching or missing even TLVs, and otherwise just
drop non-matching TLVs if they're odd.
2023-08-08 16:16:43 -05:00
Alec Chen
0a2dbdf247
Handle receiving custom HTLC TLVs
This completes basic receiver-side support for custom TLVs and adds
functional testing for sending and receiving.
2023-08-08 16:16:38 -05:00
Alec Chen
f560320b5f
De/serialize custom TLVs on {Inbound,Outbound}OnionPayload
When serialized, the TLVs in `OutboundOnionPayload`, unlike a normal
TLV stream, are prefixed with the length of the stream. To allow a user
to add arbitrary custom TLVs, we aren't able to communicate to our
serialization macros exactly which fields to expect, so this commit
adds new macro variants to allow appending an extra set of bytes (and
modifying the prefixed length accordingly).

Because the keysend preimage TLV has a type number in the custom type
range, and a user's TLVs may have type numbers above and/or below
keysend's type number, and because TLV streams must be serialized in
increasing order by type number, this commit also ensures the keysend
TLV is properly sorted/serialized amongst the custom TLVs.
2023-08-08 16:13:19 -05:00
Alec Chen
d2e9cb4bcd
Add custom tlvs to PendingOutboundPayment::Retryable 2023-08-08 15:55:06 -05:00
Alec Chen
039b1c8d10
Allow users to provide custom TLVs through RecipientOnionFields
Custom TLVs allow users to send extra application-specific data with
a payment. These have the additional flexibility compared to
`payment_metadata` that they don't have to reflect recipient generated
data provided in an invoice, in which `payment_metadata` could be
reused.

We ensure provided type numbers are unique, increasing, and within the
experimental range with the `RecipientOnionFields::with_custom_tlvs`
method.

This begins sender-side support for custom TLVs.
2023-08-08 15:55:00 -05:00
Matt Corallo
4b24135738
Merge pull request #2128 from valentinewallace/2023-03-route-blinding-groundwork
Route blinding groundwork
2023-08-08 19:59:05 +00:00
Vladimir Fomene
7cfafc98ba
Add test coverage ChannelClosed event fields 2023-08-08 14:07:16 +03:00
Vladimir Fomene
bd6323e94b
Add counterparty_node_id & channel_capacity to ChannelClosed
The current ChannelClosed event does not let
you know the counterparty during a channel close
event. This change adds the counterparty_node_id
and the channel_capacity to the ChannelClosed event.
This helps users to have more context during a
channel close event. Solves #2343
2023-08-08 13:58:40 +03:00
Matt Corallo
fe6366895a Scope payment preimage in do_test_keysend_payments
b0d4ab8cf8 fixed a nasty bug where
we'd failed to include the payment preimage in keysend onions at
all. Ultimately, this was a test failure - the existing test suite
should which did keysend payments were not structured in a way that
would fail in this case, instead using the same preimage variable
both for sending and receiving.

Here we improve the main keysend test tweaked by b0d4ab8cf8
to make absolutely sure it cannot work if the preimage doesn't come
from the onion. We make the payment preimage on the sending side a
variable inside a scope which only exists for the send call. Once
that scope completes the payment preimage only exists in the
sending `ChannelManager`, which must have put it in the onion in
order for the receiving node to have it.
2023-08-08 04:15:20 +00:00
Alec Chen
b0d4ab8cf8
Send keysend preimage through OutboundPayment::send_payment_internal
Fixes a bug where we wouldn't use the provided keysend preimage when
piping through OutboundPayment::pay_route_internal.

Also simplifies and refactors existing keysend tests to make sure this
gets hit.
2023-08-04 22:05:13 -05:00
Alec Chen
b7d0357a8a
Move keysend tests to payment_tests.rs 2023-08-04 19:17:29 -05:00
Valentine Wallace
c9d3544314
Remove unnecessary vecs in channel.rs 2023-08-02 12:54:44 -07:00
Valentine Wallace
67868aec72
Replace OnionHopData with OutboundPayload for outbound onions
Follows on from the previous commit, see its message
2023-08-02 12:54:41 -07:00
Valentine Wallace
02a6d895a5
Receive payment onions as new InboundPayload instead of OnionHopData
To support route blinding, we want to split OnionHopData into two separate
structs, one for inbound onions and one for outbound onions. This is because
blinded payloads change the fields present in the onion hop data struct based
on whether we're sending vs receiving (outbound onions include encrypted blobs,
inbound onions can decrypt those blobs and contain the decrypted fields
themselves).

In upcoming commits, we'll add variants for blinded payloads to the new
InboundPayload enum.
2023-08-02 12:54:34 -07:00
Valentine Wallace
0c37488ff4
Remove outdated documentation of a panic 2023-08-02 12:54:34 -07:00
Valentine Wallace
9473f1cb5f
Remove indentation in payment receive util
This also set us up for supporting receiving blinded onion payloads.
2023-08-02 12:54:31 -07:00
Matt Corallo
0607ed766a
Merge pull request #2460 from TheBlueMatt/2023-07-claimable-clarify
Rename `Balance::claimable_amount_satoshis` to have a unique name
2023-07-31 17:47:33 +00:00
Matt Corallo
56fba35422
Merge pull request #2465 from alecchendev/2023-07-flip-keysend-feature-bit
Flip keysend feature bit on
2023-07-31 17:46:57 +00:00
Alec Chen
7ee90a5dc6 Flip keysend feature bit in node features 2023-07-30 21:18:43 -05:00
Matt Corallo
830220393f Drop claimable from Balance::claimable_amount_satoshis fields
In Java/TypeScript, we map enums as a base class and each variant
as a class which extends the base. In Java/TypeScript, functions
and fields share the same namespace, which means we cannot have
functions on an enum which have the same name as any fields in any
enum variants.

`Balance`'s `claimable_amount_satoshis` method aliases with fields
in each variant, and thus ultimately doesn't compile in TypeScript.

Because `Balance::claimable_amount_satoshis` has the same name as
the fields, it's also a bit confusing, as it doesn't return the
field for each variant, but sometimes returns zero if we're not
sure we can claim the balance.

Instead, we rename the fields in each enum variant to simply
`amount_satoshis`, to avoid implying that we can definitely claim
the balance.
2023-07-30 02:24:16 +00:00
Valentine Wallace
ece4db67fe
Struct-ify reconnect_nodes test util args
Makes it easier to add new arguments without a ton of resulting test changes.
Useful for route blinding testing because we need to check for malformed HTLCs,
which is not currently supported by reconnect_nodes. It also makes it easier to
tell what is being checked in relevant tests.
2023-07-27 16:00:28 -07:00
Allan Douglas R. de Oliveira
a15d0b5c2e Docs improvements for channel 2023-07-25 22:52:21 +00:00
Matt Corallo
c383f06538
Merge pull request #2370 from valentinewallace/2023-06-send-along-path-args
Update `send_payment_along_path` to take its args as struct
2023-07-24 22:43:58 +00:00
Matt Corallo
e13ff10c63
Merge pull request #2431 from arik-so/2023-07-public-excess-data 2023-07-24 03:52:27 +00:00
Matt Corallo
d7e3320c03
Merge pull request #2439 from tnull/2023-05-fix-0conf-sigs-racing-confirms
Avoid panic when 0conf channel's ann. sigs race on-chain confirmation
2023-07-21 19:37:28 +00:00
Elias Rohrer
adcac97ebc
Avoid unwraping in get_announcement_sigs
While this is currently not reachable, it's still cleaner to
avoid the `unwrap` and return `None` if `short_channel_id` hasn't been
set yet.
2023-07-21 09:54:28 +02:00
Elias Rohrer
82fdf0f62d
Avoid panic when 0conf channel's ann. sigs race on-chain confirmation
A channel's `short_channel_id` is currently only set when the funding
transaction is confirmed via `transactions_confirmed`, which might be
well after the channel initally becomes usable, e.g., in the 0conf case.

Previously we would panic due to a reachable `unwrap` when receiving a
counterparty's `announcement_signatures` message for a 0conf channel
pending confirmation on-chain.

Here we fix this bug by avoiding unsafe `unwrap`s and just erroring out
and ignoring the announcement_signatures message if the `short_channel_id`
hasn't been set yet.
2023-07-21 09:54:28 +02:00
Matt Corallo
8c61d9d0dc Make requires_unknown_bits_from param type bindings compatible
While bindings should probably be able to figure out that this is
the same type as `Self`, for now we simply swap the type to make
the bindings generator have an easier go of it.
2023-07-20 21:43:52 +00:00
Matt Corallo
a8acbe710e No-export APeerManager in bindings
`APeerManager` will simply be mapped as `PeerManager` in bindings,
as structs are all concretized into a single form.
2023-07-20 21:43:52 +00:00
Matt Corallo
e4c44f3c5b
Merge pull request #2430 from TheBlueMatt/2023-07-116-bindings-part-1
Assorted 0.0.116 Bindings updates
2023-07-20 21:42:44 +00:00
Matt Corallo
d2c20ecc2d Pass InFlightHltcs to the scorer by ownership rather than ref
Given we build `InFlightHtlcs` per route-fetch call, there's no
reason to pass them out by reference rather than simply giving the
user the full object. This also allows them to tweak the in-flight
set before fetching a route.
2023-07-20 19:49:43 +00:00
Arik Sosman
b28769bfd1
Publicize UnsignedChannelAnnouncement's excess_data.
Making the `excess_data` field public significantly
simplifies writing legible unit tests for the
Rapid Gossip Sync Server.
2023-07-20 11:08:27 -07:00
Duncan Dean
50a6d41d26
Close and remove unfunded inbound/outbound channels that are older than an hour
We introduce a `UnfundedChannelContext` which contains a counter for the
current age of an unfunded channel in timer ticks. This age is incremented
for every `ChannelManager::timer_tick_ocurred` and the unfunded channel
is removed if it exceeds `UNFUNDED_CHANNEL_AGE_LIMIT_TICKS`.

The value will not be persisted as unfunded channels themselves are not
persisted.
2023-07-19 19:12:10 +02:00
Duncan Dean
b4d082b833
Remove redundant 'outbound' wording from methods 2023-07-19 19:10:32 +02:00
Duncan Dean
bd297fe39d
Force close pending channels in internal_shutdown 2023-07-19 19:10:30 +02:00
Duncan Dean
a70b1f74ce
Consider all channel maps in update_partial_channel_config 2023-07-19 19:10:29 +02:00
Duncan Dean
c2851ea5d8
Fallback close_channel_internal to force close unfunded channels 2023-07-19 19:10:28 +02:00
Duncan Dean
f27515dbb2
Add missing unfunded channel maps checks in ChannelManager
One of a series of follow-up commits to address some issues found
in PR 2077, where we split channels up into different maps and structs
depending on phase in their life.
2023-07-19 19:10:27 +02:00
Duncan Dean
e9001aa004
Refer to channels busy with funding tx negotiation as "unfunded"
We had some inconsistencies so far in referring to channels such as
`OutboundV1Channel` and `InboundV1Channel` as pending and unfunded.
From here we refer to these kinds of channels only as "unfunded".

This is a slight conflation with the term "unfunded" in the contexts
of denial of service mitigation. There, "unfunded" actually refers to
non-0conf, inbound channels that have not had their funding transaction
confirmed. This might warrant changing that usage to "unconfirmed inbound".
2023-07-19 19:10:26 +02:00
Matt Corallo
baf9731a21
Merge pull request #2415 from wpaulino/update-fee-anchors
Add min mempool estimate for feerate updates on anchor channels
2023-07-17 19:45:51 +00:00