Commit graph

2736 commits

Author SHA1 Message Date
Valentine Wallace
50c850fdd0
Set update_add blinding point on HTLC forward
Used by the next hop to decode their blinded onion payload.
2023-11-29 17:18:40 -05:00
Valentine Wallace
a2b2fb0ceb
Parameterize Channel's htlc forward method by outbound blinding point
Used in the next commit to set the update_add blinding point on HTLC forward.
2023-11-29 17:18:40 -05:00
Valentine Wallace
21ae9fdd69
Set HTLCPreviousHopData::blinded on intro node forward.
Useful so we know to fail back blinded HTLCs where we are the intro node with
the invalid_onion_blinding error per BOLT 4.

We don't set this field for blinded received HTLCs because we don't support
receiving to multi-hop blinded paths yet, and there's no point in setting it
for HTLCs received to 1-hop blinded paths because per the spec they should fail
back using an unblinded error code.
2023-11-29 17:18:39 -05:00
Valentine Wallace
ae15ba8462
Persist whether an HTLC is blinded in HTLCPreviousHopData.
Useful so we know to fail blinded intro node HTLCs back with an
invalid_onion_blinding error per BOLT 4.

Another variant will be added to the new Blinded enum when we support
receiving/forwarding as a non-intro node.
2023-11-29 17:18:39 -05:00
Valentine Wallace
b64523780b
Store whether a forwarded HTLC is blinded in PendingHTLCRouting
We need to store the inbound blinding point in PendingHTLCRouting in order to
calculate the outbound blinding point.

The new BlindedForward struct will be augmented when we add support for
forwarding as a non-intro node.
2023-11-29 17:18:38 -05:00
Valentine Wallace
1596116fa4
Persist outbound blinding points in Channel
A blinding point is provided in update_add_htlc messages if we are relaying or
receiving a payment within a blinded path, to decrypt the onion routing packet
and the recipient-provided encrypted payload within. Will be used in upcoming
commits.
2023-11-29 17:10:43 -05:00
Valentine Wallace
b70525df28
Parse blinded onion errors in tests only.
So we can make sure they're encoded properly.
2023-11-29 17:10:43 -05:00
Valentine Wallace
7f765a39bc
onion_utils: extract decrypting faiure packet into method
Will be used in the next commit to parse onion errors from blinded paths in
tests only.
2023-11-29 17:10:43 -05:00
Valentine Wallace
1e12bdfb3b
Parse blinding point in UpdateAddHTLC
A blinding point is provided in update_add_htlc messages if we are relaying or
receiving a payment within a blinded path, to decrypt the onion routing packet
and the recipient-provided encrypted payload within. Will be used in upcoming
commits.
2023-11-29 17:10:41 -05:00
valentinewallace
f07f4b90f8
Merge pull request #2739 from Evanfeenstra/channelmanager-utils
move static channelmanager functions into their own file
2023-11-29 15:41:26 -05:00
Wilmer Paulino
c2bbfffb1e
Merge pull request #2721 from TheBlueMatt/2023-11-log-forward-peer
Handle missing case in reestablish local commitment number checks
2023-11-29 10:03:56 -08:00
Arik Sosman
5965fb8375
Gate Taproot-related todos behind cfg flag. 2023-11-28 16:08:10 -08:00
Evan Feenstra
9f4dcd0bd5 move static channelmanager functions into their own file 2023-11-28 12:06:01 -08:00
Arik Sosman
88ce7d6575
Move ECDSA-specific signers into ecdsa.rs
To separate out the logic in the `sign` module, which will start to be
convoluted with multiple signer types, we're splitting out each signer
type into its own submodule, following the taproot.rs example from a
previous commit.
2023-11-27 16:28:55 -08:00
Arik Sosman
de4dd95d29
Reparametrize ChannelSignerType by SignerProvider.
ChannelSignerType is an enum that contains variants of all currently
supported signer types. Given that those signer types are enumerated
as associated types in multiple places, it is prudent to denote one
type as the authority on signer types.

SignerProvider seemed like the best option. Thus, instead of
ChannelSignerType declaring the associated types itself, it simply
uses their definitions from SignerProvider.
2023-11-27 16:27:21 -08:00
Arik Sosman
c6bcf75848
Add TaprootSigner variant to SignerProvider.
Previously, SignerProvider was not laid out to support multiple signer
types. However, with the distinction between ECDSA and Taproot signers,
we now need to account for SignerProviders needing to support both.

This approach does mean that if ever we introduced another signer type
in the future, all implementers of SignerProvider would need to add it
as an associated type, and would also need to write a set of dummy
implementations for any Signer trait they do not wish to support.

For the time being, the TaprootSigner associated type is cfg-gated.
2023-11-27 16:27:21 -08:00
Arik Sosman
27b9794bed
Rename SignerProvider's Signer to EcdsaSigner. 2023-11-27 16:27:20 -08:00
Matt Corallo
ac3fd98ec1 Handle missing case in reestablish local commitment number checks
If we're behind exactly one commitment (which we've revoked), we'd
previously force-close the channel, guaranteeing we'll lose funds
as the counterparty has our latest local commitment state's
revocation secret.

While this shouldn't happen because users should never lose data,
sometimes issues happen, and we should ensure we always panic.

Further, `test_data_loss_protect` is updated to test this case.
2023-11-27 23:59:12 +00:00
Matt Corallo
f24830719a Clean up error messages and conditionals in reestablish handling
When we reestablish there are generally always 4 conditions for
both local and remote commitment transactions:
 * we're stale and have possibly lost data
 * we're ahead and the peer has lost data
 * we're caught up
 * we're nearly caught up and need to retransmit one update.

In especially the local commitment case we had a mess of different
comparisons, which is improved here. Further, the error messages
are clarified and include more information.
2023-11-27 23:59:12 +00:00
Wilmer Paulino
146a291f15
Merge pull request #2744 from rmalonson/destinationscript
Add channel_keys_id as param in get_destination_script to support gen…
2023-11-27 12:20:19 -08:00
Matt Corallo
74078c4bef
Merge pull request #2675 from yellowred/delayed_payment_key_types
Implement struct wrappers for Payment, DelayedPayment, HTLC and Revocation channel keys
2023-11-27 18:57:37 +00:00
Rachel Malonson
7f0fd868ad Add channel_keys_id as param in get_destination_script
This enables implementers to generate a different destination script for each channel.
2023-11-27 10:42:01 -08:00
olegkubrakov
935a716cc6 Implement struct wrappers for channel key types to avoid confusion.
Currently all channel keys and their basepoints exist uniformly as
`PublicKey` type, which not only makes in harder for a developer to
distinguish those entities, but also does not engage the language
type system to check if the correct key is being used in any
particular function.

Having struct wrappers around keys also enables more nuanced
semantics allowing to express Lightning Protocol rules in language.
For example, the code allows to derive `HtlcKey` from
`HtlcBasepoint` and not from `PaymentBasepoint`.

This change is transparent for channel monitors that will use the
internal public key of a wrapper.

Payment, DelayedPayment, HTLC and Revocation basepoints and their
derived keys are now wrapped into a specific struct that make it
distinguishable for the Rust type system. Functions that require a
specific key or basepoint should not use generic Public Key, but
require a specific key wrapper struct to engage Rust type
verification system and make it more clear for developers which
key is used.
2023-11-27 17:52:12 +00:00
Matt Corallo
fa0d015d1f
Merge pull request #2685 from tnull/2022-12-add-electrum-sync
Add electrum support to `lightning-transaction-sync`
2023-11-27 17:10:00 +00:00
Elias Rohrer
a0183d7ef1
Merge pull request #2741 from shaavan/issue-2215
Explicitly reject routes that double-back
2023-11-27 13:13:08 +01:00
shaavan
a06d15826f Add test for PathParameterError introduced in previous commit
- Also modify the unwrap_send_err!() macro to handle the
  PathParameterError
2023-11-24 18:51:56 +05:30
Elias Rohrer
c8ff32197a
Return confirmation height via Confirm::get_relevant_txids
We previously included the block hash, but it's also useful to include
the height under which we expect the respective transaction to be
confirmed.
2023-11-23 09:30:56 +01:00
Wilmer Paulino
ad56847a6b
Remove nightly warnings 2023-11-22 15:58:01 -08:00
Wilmer Paulino
ec928d55b4
Bump rust-bitcoin to v0.30.2 2023-11-22 15:58:01 -08:00
shaavan
9bd1cc7660 Explicitly reject routes that double-back
- If a path within a route passes through the same channelID twice,
  that shows the path is looped and will be rejected by nodes.
- Add a check to explicitly reject such payment before trying to send
  them.
2023-11-22 18:34:44 +05:30
Matt Corallo
870a0f14ba
Merge pull request #2700 from Evanfeenstra/pub-htlc-routing
peel_payment_onion static fn in channelmanager
2023-11-16 17:02:05 +00:00
Evan Feenstra
192fe05147 InboundOnionErr fields public 2023-11-15 13:08:56 -08:00
Elias Rohrer
fb670c8faa
Merge pull request #2696 from TheBlueMatt/2023-10-no-chan-feerate-upper-bound
Drop non-anchor channel fee upper bound limit entirely
2023-11-15 10:25:06 +01:00
Evan Feenstra
378885d8db remove obsolete comment 2023-11-14 11:56:31 -08:00
Evan Feenstra
4b5db8c3ce peel_payment_onion static fn in channelmanager 2023-11-14 11:54:23 -08:00
Matt Corallo
5d187f65b9
Merge pull request #2529 from TheBlueMatt/2023-08-shutdown-remove-early-sign
Don't send init `closing_signed` too early after final HTLC removal
2023-11-14 19:09:46 +00:00
Matt Corallo
185fbc1765
Merge pull request #2726 from shaavan/issue2712
Log the error, when trying to forward the intercepted HTLC, but the channel is not found
2023-11-14 17:57:19 +00:00
shaavan
dce514e912 Log the error, when trying to forward the intercepted HTLC, but the
channel is not found
2023-11-14 15:11:09 +05:30
Elias Rohrer
04b16e74d5
Merge pull request #2716 from TheBlueMatt/2023-11-hash-if-eq
`derive(Hash)` for P2P messages
2023-11-14 08:50:38 +01:00
Matt Corallo
26c00ad751 derive(Hash) for P2P messages
In other languages (Java and C#, notably), overriding `Eq` without
overriding `Hash` can lead to surprising or broken behavior. Even
in Rust, its usually the case that you actually want both. Here we
add missing `Hash` derivations for P2P messages, to at least
address the first pile of warnings the C# compiler dumps.
2023-11-14 00:40:30 +00:00
Matt Corallo
eb23c1e43b Rely on const generic big arrays for PartialEq in msgs
Implementation of standard traits on arrays longer than 32 elements
was shipped in rustc 1.47, which is below our MSRV of 1.48 and we
can use to remove some unnecessary manual implementation of
`PartialEq` on `OnionPacket`.
2023-11-14 00:40:30 +00:00
Matt Corallo
c852ce6139
Merge pull request #2544 from optout21/splicing-msgs0
Add Splicing (and Quiescence) wire message definitions
2023-11-13 22:38:51 +00:00
Matt Corallo
103180df8f
Merge pull request #2708 from TheBlueMatt/2023-11-less-graph-memory-frag
Reduce common allocations across the codebase
2023-11-13 16:45:26 +00:00
Matt Corallo
d5a0eb4270
Merge pull request #2715 from valentinewallace/2023-11-skimmed-fees
Complete underpaying HTLCs support
2023-11-12 20:27:25 +00:00
Matt Corallo
98544772e2
Merge pull request #2722 from benthecarman/dust-overflow
Fix potential cases where max_dust_htlc_exposure_msat overflows
2023-11-12 17:03:09 +00:00
Matt Corallo
70b18663f4 Don't send init closing_signed too early after final HTLC removal
If we remove an HTLC (or fee update), commit, and receive our
counterparty's `revoke_and_ack`, we remove all knowledge of said
HTLC (or fee update). However, the latest local commitment
transaction that we can broadcast still contains the HTLC (or old
fee), thus we are not eligible for initiating the `closing_signed`
negotiation if we're shutting down and are generally expecting a
counterparty `commitment_signed` immediately.

Because we don't have any tracking of these updates in the `Channel`
(only the `ChannelMonitor` is aware of the HTLC being in our latest
local commitment transaction), we'd previously send a
`closing_signed` too early, causing LDK<->LDK channels with an HTLC
pending towards the channel initiator at the time of `shutdown` to
always fail to cooperatively close.

To fix this race, we add an additional unpersisted bool to
`Channel` and use that to gate sending the initial `closing_signed`.
2023-11-11 20:24:58 +00:00
Matt Corallo
d30d599a2f Drop non-anchor channel fee upper bound limit entirely
Quite a while ago we added checks for the total current dust
exposure on a channel to explicitly limit dust inflation attacks.
When we did this, we kept the existing upper bound on the channel's
feerate in place. However, these two things are redundant - the
point of the feerate upper bound is to prevent dust inflation, and
it does so in a crude way that can cause spurious force-closures.

Here we simply drop the upper bound entirely, relying on the dust
inflation limit to prevent dust inflation instead.
2023-11-11 17:32:31 +00:00
Matt Corallo
7a951b1bf7 Stop writing signer data as a part of channels
This breaks backwards compatibility with versions of LDK prior to
0.0.113 as they expect to always read signer data.

This also substantially reduces allocations during `ChannelManager`
serialization, as we currently don't pre-allocate the `Vec` that
the signer gets written in to. We could alternatively pre-allocate
that `Vec`, but we've been set up to skip the write entirely for a
while, and 0.0.113 was released nearly a year ago. Users
downgrading to LDK 0.0.112 and before at this point should not be
expected.
2023-11-09 22:28:08 +00:00
Matt Corallo
969085bf1e Avoid re-allocating to encrypt gossip messages when forwarding
When we forward gossip messages, we store them in a separate buffer
before we encrypt them (and commit to the order in which they'll
appear on the wire). Rather than storing that buffer encoded with
no headroom, requiring re-allocating to add the message length and
two MAC blocks, we here add the headroom prior to pushing it into
the gossip buffer, avoiding an allocation.
2023-11-09 22:28:08 +00:00
benthecarman
55da9c434e
Fix potential cases where max_dust_htlc_exposure_msat overflows 2023-11-09 14:51:44 -06:00