rust-lightning
15 months agoDerive traits for InvoiceRequest and Invoice
Jeffrey Czyz [Wed, 8 Feb 2023 00:29:08 +0000 (18:29 -0600)]
Derive traits for InvoiceRequest and Invoice

Offer and Refund derive Debug, Clone, and PartialEq. For consistency,
derive these traits for InvoiceRequest and Invoice as well.

15 months agoFuzz test for parsing Refund
Jeffrey Czyz [Fri, 20 Jan 2023 19:01:47 +0000 (13:01 -0600)]
Fuzz test for parsing Refund

A refund is serialized as a TLV stream and encoded in bech32 without a
checksum. Add a fuzz test that parses the unencoded TLV stream and
deserializes the underlying Refund. Then compare the original bytes with
those obtained by re-serializing the Refund.

15 months agoFix RoutingFees::base_msat docs
Jeffrey Czyz [Mon, 6 Feb 2023 03:32:38 +0000 (21:32 -0600)]
Fix RoutingFees::base_msat docs

15 months agoMake BlindedPayInfo fields public
Jeffrey Czyz [Tue, 24 Jan 2023 03:52:11 +0000 (21:52 -0600)]
Make BlindedPayInfo fields public

BlindedPayInfo fields need to be public in order to construct one for
fuzz tests. Typically, they would be constructed from ChannelUpdateInfo
for public channels and ChannelDetails for unannounced channels. For
now, make the fields public so they can be constructed manually.

15 months agoFuzz test for parsing Offer
Jeffrey Czyz [Fri, 20 Jan 2023 18:31:17 +0000 (12:31 -0600)]
Fuzz test for parsing Offer

An offer is serialized as a TLV stream and encoded in bech32 without a
checksum. Add a fuzz test that parses the unencoded TLV stream and
deserializes the underlying Offer. Then compare the original bytes with
those obtained by re-serializing the Offer.

15 months agoMake offers module public
Jeffrey Czyz [Thu, 19 Jan 2023 16:10:38 +0000 (10:10 -0600)]
Make offers module public

This is needed in order to fuzz test BOLT 12 message deserialization.

15 months agoAdd test for requesting invoice from expired offer
Jeffrey Czyz [Tue, 31 Jan 2023 20:34:04 +0000 (14:34 -0600)]
Add test for requesting invoice from expired offer

15 months agoMake separate no-std version for invoice response
Jeffrey Czyz [Tue, 31 Jan 2023 20:35:49 +0000 (14:35 -0600)]
Make separate no-std version for invoice response

Both Refund::respond_with and InvoiceRequest::respond_with take a
created_at since the Unix epoch Duration in no-std. However, this can
cause problems if two downstream dependencies want to use the lightning
crate with different feature flags set. Instead, define
respond_with_no_std versions of each method in addition to a
respond_with version in std.

15 months agoFix BOLT 12 invoice doctests to work with no-std
Jeffrey Czyz [Tue, 31 Jan 2023 18:52:08 +0000 (12:52 -0600)]
Fix BOLT 12 invoice doctests to work with no-std

15 months agoMerge pull request #1961 from TheBlueMatt/2023-01-expose-hist-buckets
Matt Corallo [Tue, 31 Jan 2023 00:38:14 +0000 (00:38 +0000)]
Merge pull request #1961 from TheBlueMatt/2023-01-expose-hist-buckets

Expose historical bucket data via new accessors

15 months agoMerge pull request #1972 from jkczyz/2023-01-bolt12-spec-updates
Matt Corallo [Mon, 30 Jan 2023 23:36:20 +0000 (23:36 +0000)]
Merge pull request #1972 from jkczyz/2023-01-bolt12-spec-updates

BOLT 12 spec updates

15 months agoExpose historical bucket data via new accessors 2023-01-expose-hist-buckets
Matt Corallo [Mon, 16 Jan 2023 23:23:13 +0000 (23:23 +0000)]
Expose historical bucket data via new accessors

Users should be able to view the data we use to score channels, so
this exposes that data in new accessors.

Fixes #1854.

15 months agoCalc decayed buckets to decide if we have valid historical points
Matt Corallo [Mon, 16 Jan 2023 23:18:39 +0000 (23:18 +0000)]
Calc decayed buckets to decide if we have valid historical points

When we're calculating if, once we apply the unupdated decays, the
historical data tracker has enough data to assign a score, we
previously calculated the decayed points while walking the buckets
as we don't use the decayed buckets anyway (to avoid losing
precision). That is fine, except that as written it decayed
individual buckets additional times.

Instead, here we actually calculate the full set of decayed buckets
and use those to decide if we have valid points. This adds some
additional stack space and may in fact be slower, but will be
useful in the next commit and shouldn't be a huge change.

15 months agoUpdate docs regarding payment path privacy
Jeffrey Czyz [Wed, 25 Jan 2023 05:43:14 +0000 (23:43 -0600)]
Update docs regarding payment path privacy

15 months agoDisallow offer_metadata in Refund
Jeffrey Czyz [Thu, 19 Jan 2023 00:58:20 +0000 (18:58 -0600)]
Disallow offer_metadata in Refund

The offer_metadata was optional but is redundant with invreq_metadata
(i.e., payer_metadata) for refunds. It is now disallowed in the spec and
was already unsupported by RefundBuilder.

15 months agoAllow quantity in Refund
Jeffrey Czyz [Wed, 18 Jan 2023 23:29:31 +0000 (17:29 -0600)]
Allow quantity in Refund

The spec always allowed this but the reason was unclear. It's useful if
the refund is for an invoice paid for offer where a quantity was given
in the request. The description in the refund would be from the offer,
which may have given a unit for each item. So allowing a quantity makes
it clear how many items the refund is for.

15 months agoSupport explicit quantity_max = 1 in Offer
Jeffrey Czyz [Wed, 18 Jan 2023 22:44:16 +0000 (16:44 -0600)]
Support explicit quantity_max = 1 in Offer

The spec was modified to allow setting offer_quantity_max explicitly to
one. This is to support a use case where more than one item is supported
but only one item is left in the inventory. Introduce a Quantity::One
variant to replace Quantity::Bounded(1) so the later can be used for the
explicit setting.

15 months agoMerge pull request #1985 from Kurtsley/chore-no-std-phantom-invoice
Matt Corallo [Mon, 30 Jan 2023 21:01:51 +0000 (21:01 +0000)]
Merge pull request #1985 from Kurtsley/chore-no-std-phantom-invoice

Remove std::SystemTime from create_phantom_invoice, ref #1978

16 months agoRemove std::SystemTime from create_phantom_invoice, ref #1978
Kurtsley [Wed, 25 Jan 2023 06:40:56 +0000 (00:40 -0600)]
Remove std::SystemTime from create_phantom_invoice, ref #1978

Replace current_timestamp call with no-std duration_from_epoch

16 months agoMerge pull request #1974 from danielgranhao/speed-up-secure-random-byte-gen
Matt Corallo [Thu, 26 Jan 2023 23:13:06 +0000 (23:13 +0000)]
Merge pull request #1974 from danielgranhao/speed-up-secure-random-byte-gen

16 months agoUse `Chacha20` in `get_secure_random_bytes()`
Daniel Granhão [Thu, 26 Jan 2023 10:32:14 +0000 (10:32 +0000)]
Use `Chacha20` in `get_secure_random_bytes()`

16 months agoMerge pull request #1991 from TheBlueMatt/2023-01-fix-comment
Matt Corallo [Thu, 26 Jan 2023 19:51:32 +0000 (19:51 +0000)]
Merge pull request #1991 from TheBlueMatt/2023-01-fix-comment

Remove stale comment in test

16 months agoMerge pull request #1986 from TheBlueMatt/2023-01-monitor-eq
Matt Corallo [Thu, 26 Jan 2023 19:11:49 +0000 (19:11 +0000)]
Merge pull request #1986 from TheBlueMatt/2023-01-monitor-eq

Implement PartialEq for ChannelMonitor

16 months agoRemove stale comment in test 2023-01-fix-comment
Matt Corallo [Thu, 26 Jan 2023 17:39:55 +0000 (17:39 +0000)]
Remove stale comment in test

This should have been done in 7dcbf2cd1c4de29b7c32165ca3d6ac3c47f1
but was not.

16 months agoAdd `get_secure_random_bytes()` benchmark
Daniel Granhão [Wed, 25 Jan 2023 20:55:09 +0000 (20:55 +0000)]
Add `get_secure_random_bytes()` benchmark

16 months agoMerge pull request #1984 from TheBlueMatt/2023-01-test-robust
Matt Corallo [Thu, 26 Jan 2023 04:02:31 +0000 (04:02 +0000)]
Merge pull request #1984 from TheBlueMatt/2023-01-test-robust

Make `test_duplicate_payment_hash_one_failure_one_success` robust

16 months agoRemove the `ChannelMonitor` secp context 2023-01-monitor-eq
Matt Corallo [Thu, 26 Jan 2023 02:21:31 +0000 (02:21 +0000)]
Remove the `ChannelMonitor` secp context

`ChannelMonitor` indirectly already has a context - the
`OnchainTxHandler` has one. This makes it trivial to remove the
existing one, so we do so for a free memory usage reduction.

16 months agoImplement `PartialEq` for `ChannelMonitor`
Matt Corallo [Thu, 26 Jan 2023 02:23:08 +0000 (02:23 +0000)]
Implement `PartialEq` for `ChannelMonitor`

It turns out `#[derive(PartialEq)]` will automatically bound the
`PartialEq` implementation by any bounds on the struct also being
`PartialEq`. This means to use an auto-derived `ChannelMonitor`
`PartialEq` the `EcdsaSigner` used must also be `PartialEq`, but
for the use-cases we have today for a `ChannelMonitor` `PartialEq`
it doesn't really matter - we use it internally in tests and
downstream users wanted similar test-only usage.

Fixes #1912.

16 months agoMerge pull request #1916 from valentinewallace/2022-11-chanman-payment-retries
valentinewallace [Thu, 26 Jan 2023 02:09:13 +0000 (21:09 -0500)]
Merge pull request #1916 from valentinewallace/2022-11-chanman-payment-retries

`ChannelManager` Payment Retries

16 months agoMake `test_duplicate_payment_hash_one_failure_one_success` robust 2023-01-test-robust
Matt Corallo [Wed, 25 Jan 2023 02:56:13 +0000 (02:56 +0000)]
Make `test_duplicate_payment_hash_one_failure_one_success` robust

`test_duplicate_payment_hash_one_failure_one_success` currently
fails if the "wrong" HTLC is picked to be claimed. Given the HTLCs
are identical, there's no way to figure out which we should claim.
The test instead relies on a magic value - the first one is the
right one....unless we change our CSPRNG implementation. When we
try to do so, the test randomly fails.

Here we change one HTLC to a lower amount so we can figure out
which transaction to broadcast to make the test robust against
CSPRNG changes.

16 months agoImplement `PartialEq`/`Eq` for `Event`s
Matt Corallo [Thu, 26 Jan 2023 01:51:43 +0000 (01:51 +0000)]
Implement `PartialEq`/`Eq` for `Event`s

16 months agoMerge pull request #1948 from alecchendev/custom-fail-back-err
Matt Corallo [Wed, 25 Jan 2023 23:24:49 +0000 (23:24 +0000)]
Merge pull request #1948 from alecchendev/custom-fail-back-err

Allow specifying an error when failing back HTLC

16 months agoMerge pull request #1799 from TheBlueMatt/2022-10-heap-nerdsnipe
Matt Corallo [Wed, 25 Jan 2023 23:19:13 +0000 (23:19 +0000)]
Merge pull request #1799 from TheBlueMatt/2022-10-heap-nerdsnipe

Router Optimizations

16 months agoAdd test_fail_htlc_backwards_with_reason
Alec Chen [Tue, 17 Jan 2023 04:50:58 +0000 (22:50 -0600)]
Add test_fail_htlc_backwards_with_reason

Add a test for newly added function failing back a basic payment
and ensuring the intended failure code and data are sent back
to the peer.

16 months agoAdd FailureCode enum and ChannelManager::fail_htlc_backwards_with_reason
Alec Chen [Wed, 25 Jan 2023 18:27:59 +0000 (12:27 -0600)]
Add FailureCode enum and ChannelManager::fail_htlc_backwards_with_reason

FailureCode is used to specify which error code and data to send
to peers when failing back an HTLC.

ChannelManager::fail_htlc_backwards_with_reason
allows a user to specify the error code and
corresponding data to send to peers when failing back an HTLC.
This function is mentioned in Event::PaymentClaimable docs.
ChannelManager::get_htlc_fail_reason_from_failure_code was also
added to assist with this function.

16 months agoDisambiguate send_payment_internal from pay_internal
Valentine Wallace [Tue, 24 Jan 2023 03:45:59 +0000 (22:45 -0500)]
Disambiguate send_payment_internal from pay_internal

16 months agoPayment retries: copy tests from InvoicePayer
Valentine Wallace [Wed, 4 Jan 2023 23:32:12 +0000 (18:32 -0500)]
Payment retries: copy tests from InvoicePayer

As part of migrating payment retries from InvoicePayer to ChannelManager,
several tests don't need a rewrite and can be pretty much copied and pasted.

16 months agoTest ChannelManager automatic retries
Valentine Wallace [Mon, 19 Dec 2022 05:38:54 +0000 (00:38 -0500)]
Test ChannelManager automatic retries

16 months agoSupport sending payments with a retry strategy in ChannelManager
Valentine Wallace [Mon, 19 Dec 2022 05:19:47 +0000 (00:19 -0500)]
Support sending payments with a retry strategy in ChannelManager

16 months agoRetry HTLCs in process_pending_htlc_forwards
Valentine Wallace [Sat, 7 Jan 2023 00:39:40 +0000 (19:39 -0500)]
Retry HTLCs in process_pending_htlc_forwards

16 months agoRemove AllPathsFailed outbounds at send_payment_internal callsites instead
Valentine Wallace [Mon, 19 Dec 2022 04:29:45 +0000 (23:29 -0500)]
Remove AllPathsFailed outbounds at send_payment_internal callsites instead

This makes it easier to retry payments if all paths fail on initial send, in
in which case we'll want to hold off on removing the pending payment

16 months agoGenerate PendingHTLCsForwardable upon retryable payment
Valentine Wallace [Fri, 6 Jan 2023 23:39:51 +0000 (18:39 -0500)]
Generate PendingHTLCsForwardable upon retryable payment

16 months agoDecode onion fail outside of outbound_payments lock
Valentine Wallace [Tue, 24 Jan 2023 19:26:57 +0000 (14:26 -0500)]
Decode onion fail outside of outbound_payments lock

It's not ideal to do all this computation while the lock is held. We also want
to decode the failure *before* taking the lock, so we can store the failed scid
in the relevant outbound for retry in the next commit(s).

16 months agoStore retry data in PendingOutboundPayment::Retryable
Valentine Wallace [Sun, 18 Dec 2022 23:22:56 +0000 (18:22 -0500)]
Store retry data in PendingOutboundPayment::Retryable

Used in upcoming commit(s) to automatically retry HTLCs in ChannelManager

16 months agoClean up `compute_fees` and add a saturating variant 2022-10-heap-nerdsnipe
Matt Corallo [Wed, 25 Jan 2023 17:42:20 +0000 (17:42 +0000)]
Clean up `compute_fees` and add a saturating variant

Often when we call `compute_fees` we really just want it to
saturate and we deal with `u64::max_value` later. In that case,
we're much better off doing the saturating in the `compute_fees` as
it can use CMOVs rather than branching at each step and then
`unwrap_or`ing at the callsite.

16 months agoAdd a fuzzer to check that `IndexedMap` is equivalent to `BTreeMap`
Matt Corallo [Thu, 19 Jan 2023 20:24:22 +0000 (20:24 +0000)]
Add a fuzzer to check that `IndexedMap` is equivalent to `BTreeMap`

16 months agoSwap `IndexedMap` implementation for a `HashMap`+B-Tree
Matt Corallo [Thu, 19 Jan 2023 17:59:10 +0000 (17:59 +0000)]
Swap `IndexedMap` implementation for a `HashMap`+B-Tree

Our network graph has to be iterable in a deterministic order and
with the ability to iterate over a specific range. Thus,
historically, we've used a `BTreeMap` to do the iteration. This is
fine, except our map needs to also provide high performance lookups
in order to make route-finding fast. Sadly, `BTreeMap`s are quite
slow due to the branching penalty.

Here we replace the implementation of our `IndexedMap` with a
`HashMap` to store the elements itself and a `BTreeSet` to store
the keys set in sorted order for iteration.

As of this commit on the same hardware as the above few commits,
the benchmark results are:

```
test routing::router::benches::generate_mpp_routes_with_probabilistic_scorer ... bench: 109,544,993 ns/iter (+/- 27,553,574)
test routing::router::benches::generate_mpp_routes_with_zero_penalty_scorer  ... bench:  81,164,590 ns/iter (+/- 55,422,930)
test routing::router::benches::generate_routes_with_probabilistic_scorer     ... bench:  34,726,569 ns/iter (+/- 9,646,345)
test routing::router::benches::generate_routes_with_zero_penalty_scorer      ... bench:  22,772,355 ns/iter (+/- 9,574,418)
```

16 months agoAdd a new `IndexedMap` type and use it in network graph storage
Matt Corallo [Tue, 25 Oct 2022 03:50:07 +0000 (03:50 +0000)]
Add a new `IndexedMap` type and use it in network graph storage

Our network graph has to be iterable in a deterministic order and
with the ability to iterate over a specific range. Thus,
historically, we've used a `BTreeMap` to do the iteration. This is
fine, except our map needs to also provide high performance lookups
in order to make route-finding fast. Sadly, `BTreeMap`s are quite
slow due to the branching penalty.

Here we replace the `BTreeMap`s in the scorer with a dummy wrapper.
In the next commit the internals thereof will be replaced with a
`HashMap`-based implementation.

16 months agoDrop A* implementation in the router for simple Dijkstra's
Matt Corallo [Tue, 25 Oct 2022 03:15:03 +0000 (03:15 +0000)]
Drop A* implementation in the router for simple Dijkstra's

As evidenced by the previous commit, it appears our A* router
does worse than a more naive approach. This isn't super surpsising,
as the A* heuristic calculation requires a map lookup, which is
relatively expensive.

```
test routing::router::benches::generate_mpp_routes_with_probabilistic_scorer ... bench: 169,991,943 ns/iter (+/- 30,838,048)
test routing::router::benches::generate_mpp_routes_with_zero_penalty_scorer  ... bench: 122,144,987 ns/iter (+/- 61,708,911)
test routing::router::benches::generate_routes_with_probabilistic_scorer     ... bench:  48,546,068 ns/iter (+/- 10,379,642)
test routing::router::benches::generate_routes_with_zero_penalty_scorer      ... bench:  32,898,557 ns/iter (+/- 14,157,641)
```

16 months agoMerge pull request #1983 from valentinewallace/2022-01-update-contributingmd
Matt Corallo [Wed, 25 Jan 2023 01:59:52 +0000 (01:59 +0000)]
Merge pull request #1983 from valentinewallace/2022-01-update-contributingmd

16 months agoMerge pull request #1878 from dunxen/2022-11-config-minfinalcltvexpiry
Matt Corallo [Tue, 24 Jan 2023 22:35:55 +0000 (22:35 +0000)]
Merge pull request #1878 from dunxen/2022-11-config-minfinalcltvexpiry

Allow configurable `min_final_cltv_expiry_delta`

16 months agocontributing.md: fix link and link to CoC
Valentine Wallace [Tue, 24 Jan 2023 22:33:14 +0000 (17:33 -0500)]
contributing.md: fix link and link to CoC

16 months agoMerge pull request #1967 from arik-so/2023-01-rename-signer-traits
Arik [Tue, 24 Jan 2023 21:20:26 +0000 (13:20 -0800)]
Merge pull request #1967 from arik-so/2023-01-rename-signer-traits

Split out `EcdsaChannelSigner` method from `BaseSign`, and rename it to `ChannelSigner`

16 months agoParameterize add_new_pending_payment with retry strategy and route params
Valentine Wallace [Sun, 18 Dec 2022 22:13:47 +0000 (17:13 -0500)]
Parameterize add_new_pending_payment with retry strategy and route params

16 months agoCopy Retry from invoice module to outbound_payment module
Valentine Wallace [Sun, 18 Dec 2022 22:02:17 +0000 (17:02 -0500)]
Copy Retry from invoice module to outbound_payment module

Also configure it such that in std tests, it will use SinceEpoch instead of
Instant so time can be manually advanced.

16 months agoAdd new payment type and metadata bytes
Duncan Dean [Thu, 24 Nov 2022 20:31:16 +0000 (22:31 +0200)]
Add new payment type and metadata bytes

Adds two new payment `Method`s for identifying payments with custom
`min_final_cltv_expiry_delta` as payments with LDK or user payment
hashes.

The `min_final_cltv_expiry_delta` value is packed into the first 2
bytes of the expiry timestamp in the payment secret metadata.

16 months agoAdd `min_final_cltv_expiry` parameter to invoice utils
Duncan Dean [Mon, 21 Nov 2022 12:53:52 +0000 (14:53 +0200)]
Add `min_final_cltv_expiry` parameter to invoice utils

All utility functions for invoice construction will now also accept an
Option<>al `min_final_cltv_expiry_delta` which is useful for things like
swaps etc. The `min_final_cltv_expiry_delta` will default back to
`MIN_FINAL_CLTV_EXPIRY_DELTA` if `None` is provided.

16 months agoAdd `_delta` suffix to `min_final_cltv_expiry`
Duncan Dean [Tue, 29 Nov 2022 10:47:00 +0000 (12:47 +0200)]
Add `_delta` suffix to `min_final_cltv_expiry`

This matches the spec and helps avoid any confusion around
naming. We're also then consistent with `cltv_expiry` in an HTLC being
the actual block height value for the CLTV and not a delta.

16 months agoMake `Channel` and `ChannelManager` less particular about their `Signer` type.
Arik Sosman [Fri, 20 Jan 2023 00:41:15 +0000 (16:41 -0800)]
Make `Channel` and `ChannelManager` less particular about their `Signer` type.

16 months agoRename `Sign` to `WriteableEcdsaChannelSigner`.
Arik Sosman [Thu, 19 Jan 2023 23:51:38 +0000 (15:51 -0800)]
Rename `Sign` to `WriteableEcdsaChannelSigner`.

16 months agoSeparate channel-type-agnostic methods into `ChannelSigner` trait.
Arik Sosman [Wed, 18 Jan 2023 04:33:54 +0000 (20:33 -0800)]
Separate channel-type-agnostic methods into `ChannelSigner` trait.

16 months agoRename `BaseSign` to `EcdsaChannelSigner`.
Arik Sosman [Wed, 18 Jan 2023 00:30:32 +0000 (16:30 -0800)]
Rename `BaseSign` to `EcdsaChannelSigner`.

16 months ago`impl Display for NodeId`
Matt Corallo [Mon, 23 Jan 2023 23:33:19 +0000 (23:33 +0000)]
`impl Display for NodeId`

`NodeId` is a public key, there's not much reason to not implement
`Display` for it and only `Debug`.

16 months agoMerge pull request #1926 from jkczyz/2022-12-invoice
Matt Corallo [Mon, 23 Jan 2023 23:18:09 +0000 (23:18 +0000)]
Merge pull request #1926 from jkczyz/2022-12-invoice

BOLT 12 `invoice` encoding and building

16 months agoCopy PaymentAttempts from invoice module to outbound_payment module
Valentine Wallace [Sun, 18 Dec 2022 21:53:57 +0000 (16:53 -0500)]
Copy PaymentAttempts from invoice module to outbound_payment module

16 months agoFix unused_imports warning in no-std tests
Jeffrey Czyz [Thu, 19 Jan 2023 04:14:35 +0000 (22:14 -0600)]
Fix unused_imports warning in no-std tests

16 months agoInvoice parsing tests
Jeffrey Czyz [Mon, 16 Jan 2023 05:59:49 +0000 (23:59 -0600)]
Invoice parsing tests

Tests for checking invoice semantics when parsing invoice bytes as
defined by BOLT 12.

16 months agoInvoice building tests
Jeffrey Czyz [Mon, 16 Jan 2023 04:26:52 +0000 (22:26 -0600)]
Invoice building tests

Tests for checking invoice message semantics when building an invoice as
defined by BOLT 12.

16 months agoExpand invoice module docs and include an example
Jeffrey Czyz [Wed, 18 Jan 2023 15:54:13 +0000 (09:54 -0600)]
Expand invoice module docs and include an example

16 months agoUse SystemTime::now() for Invoice creation time
Jeffrey Czyz [Fri, 13 Jan 2023 05:02:39 +0000 (23:02 -0600)]
Use SystemTime::now() for Invoice creation time

For std builds, Invoice::created_at can be automatically set upon
construction using SystemTime::now() offset by SystemTime::UNIX_EPOCH.
Change InvoiceRequest::respond_with and Refund::respond_with to only
take a created_at parameter in no-std builds.

16 months agoBuilder for creating invoices for refunds
Jeffrey Czyz [Tue, 20 Dec 2022 15:33:11 +0000 (09:33 -0600)]
Builder for creating invoices for refunds

Add a builder for creating invoices for a refund and required fields.
Other settings are optional and duplicative settings will override
previous settings. Building produces a semantically valid `invoice`
message for the refund, which then can be signed with the key associated
with the provided signing pubkey.

16 months agoBuilder for creating invoices for offers
Jeffrey Czyz [Tue, 20 Dec 2022 04:23:39 +0000 (22:23 -0600)]
Builder for creating invoices for offers

Add a builder for creating invoices for an offer from a given request
and required fields. Other settings are optional and duplicative
settings will override previous settings. Building produces a
semantically valid `invoice` message for the offer, which then can be
signed with the key associated with the offer's signing pubkey.

16 months agoInvoice encoding and parsing
Jeffrey Czyz [Mon, 12 Sep 2022 14:30:06 +0000 (09:30 -0500)]
Invoice encoding and parsing

Define an interface for BOLT 12 `invoice` messages. The underlying
format consists of the original bytes and the parsed contents.

The bytes are later needed for serialization. This is because it must
mirror all the `offer` and `invoice_request` TLV records, including
unknown ones, which aren't represented in the contents.

Invoices may be created for an Offer (from an InvoiceRequest) or for a
Refund. The primary difference is how the signing pubkey is given -- by
the writer of the offer or the reader of the refund.

16 months agoUpdate min-inbound-fee values on `NetworkGraph` load
Matt Corallo [Thu, 19 Jan 2023 18:24:30 +0000 (18:24 +0000)]
Update min-inbound-fee values on `NetworkGraph` load

Historically we've had various bugs in keeping the
`lowest_inbound_channel_fees` field in `NodeInfo` up-to-date as we
go. This leaves the A* routing less efficient as it can't prune
hops as aggressively.

In order to get accurate benchmarks, this commit updates the
minimum-inbound-fees field on load. This is not the most efficient
way of doing so, but suffices for fetching benchmarks and will be
removed in the coming commits.

Note that this is *slower* than the non-updating version in the
previous commit. While I haven't dug into this incredibly deeply,
the graph snapshot in use has min-fee info for only 9,618 of
20,818 nodes. Thus, it is my guess that with the graph snapshot
as-is the branch predictor is able to largely remove the A*
heuristic lookups, but with this change it is forced to wait for
A* heuristic map lookups to complete, causing a performance
regression.

```
test routing::router::benches::generate_mpp_routes_with_probabilistic_scorer ... bench: 182,980,059 ns/iter (+/- 32,662,047)
test routing::router::benches::generate_mpp_routes_with_zero_penalty_scorer  ... bench: 151,170,457 ns/iter (+/- 75,351,011)
test routing::router::benches::generate_routes_with_probabilistic_scorer     ... bench:  58,187,277 ns/iter (+/- 11,606,440)
test routing::router::benches::generate_routes_with_zero_penalty_scorer      ... bench:  41,210,193 ns/iter (+/- 18,103,320)
```

16 months agoUpdate the lightning graph snapshot used in benchmarks
Matt Corallo [Thu, 19 Jan 2023 04:41:02 +0000 (04:41 +0000)]
Update the lightning graph snapshot used in benchmarks

The previous copy was more than one and a half years old, the
lightning network has changed a lot since!

As of this commit, performance on my Xeon W-10885M with a
SK hynix Gold P31 storing a BTRFS volume is as follows:

```
test ln::channelmanager::bench::bench_sends                                  ... bench:   5,896,492 ns/iter (+/- 512,421)
test routing::gossip::benches::read_network_graph                            ... bench: 1,645,740,604 ns/iter (+/- 47,611,514)
test routing::gossip::benches::write_network_graph                           ... bench: 234,870,775 ns/iter (+/- 8,301,775)
test routing::router::benches::generate_mpp_routes_with_probabilistic_scorer ... bench: 166,155,032 ns/iter (+/- 30,206,162)
test routing::router::benches::generate_mpp_routes_with_zero_penalty_scorer  ... bench: 136,843,661 ns/iter (+/- 67,111,218)
test routing::router::benches::generate_routes_with_probabilistic_scorer     ... bench:  52,954,598 ns/iter (+/- 11,360,547)
test routing::router::benches::generate_routes_with_zero_penalty_scorer      ... bench:  37,598,126 ns/iter (+/- 17,262,519)
test bench::bench_sends                                                      ... bench:  37,760,922 ns/iter (+/- 5,179,123)
test bench::bench_reading_full_graph_from_file                               ... bench:      25,615 ns/iter (+/- 1,149)
```

16 months agoMerge pull request #1951 from wpaulino/remove-get-node-secret
Matt Corallo [Thu, 19 Jan 2023 03:49:15 +0000 (03:49 +0000)]
Merge pull request #1951 from wpaulino/remove-get-node-secret

16 months agoMerge pull request #1964 from TheBlueMatt/2023-01-no-debug-panics
Arik [Thu, 19 Jan 2023 01:41:54 +0000 (17:41 -0800)]
Merge pull request #1964 from TheBlueMatt/2023-01-no-debug-panics

Use test/_test_utils to enable single-threaded debug assertions

16 months agoRemove NodeSigner::get_node_secret
Wilmer Paulino [Wed, 18 Jan 2023 21:43:32 +0000 (13:43 -0800)]
Remove NodeSigner::get_node_secret

Secrets should not be exposed in-memory at the interface level as it
would be impossible the implement it against a hardware security
module/secure element.

16 months agoUse NodeSigner::ecdh to compute SharedSecrets
Wilmer Paulino [Wed, 18 Jan 2023 21:41:27 +0000 (13:41 -0800)]
Use NodeSigner::ecdh to compute SharedSecrets

16 months agoSign gossip messages with NodeSigner
Wilmer Paulino [Wed, 18 Jan 2023 21:03:20 +0000 (13:03 -0800)]
Sign gossip messages with NodeSigner

16 months agoAdd NodeSigner::sign_gossip_message
Wilmer Paulino [Wed, 18 Jan 2023 21:03:06 +0000 (13:03 -0800)]
Add NodeSigner::sign_gossip_message

Adds signing capability to NodeSigner for all gossip messages that
require a node signature.

16 months agoMerge pull request #1860 from wpaulino/open-channel-anchors-support
Matt Corallo [Thu, 19 Jan 2023 01:00:44 +0000 (01:00 +0000)]
Merge pull request #1860 from wpaulino/open-channel-anchors-support

Support opening anchor channels and test end-to-end unilateral close

16 months agoRemove unused NodeSigner implementations in tests
Wilmer Paulino [Wed, 18 Jan 2023 20:28:42 +0000 (12:28 -0800)]
Remove unused NodeSigner implementations in tests

These implementations have every method panic, so assuming that the test
suite passes, these implementations are never used.

16 months agoAlways set `_test_utils` when building lightning for some tests
Matt Corallo [Tue, 17 Jan 2023 23:39:41 +0000 (23:39 +0000)]
Always set `_test_utils` when building lightning for some tests

This ensures that we hit additional assertions which are intended
to always be run in tests.

16 months agoAdd test yielding anchor-related events
Wilmer Paulino [Thu, 25 Aug 2022 20:39:46 +0000 (13:39 -0700)]
Add test yielding anchor-related events

16 months agoAdd mine_transactions test util
Wilmer Paulino [Thu, 25 Aug 2022 20:39:09 +0000 (13:39 -0700)]
Add mine_transactions test util

16 months agoSupport negotiating anchors throughout channel open
Wilmer Paulino [Thu, 4 Aug 2022 20:22:59 +0000 (13:22 -0700)]
Support negotiating anchors throughout channel open

16 months agoEncoding for TLV stream without signature records
Jeffrey Czyz [Thu, 22 Dec 2022 15:33:41 +0000 (09:33 -0600)]
Encoding for TLV stream without signature records

When using bytes from an InvoiceRequest to constructing bytes for an
Invoice, any signature TLV records in the bytes must be excluded. Define
a wrapper for encoding such pre-serialized bytes in this manner. This
will allow the forthcoming InvoiceBuilder to construct bytes for an
Invoice properly.

16 months agoDefine TlvStream::skip_signatures
Jeffrey Czyz [Thu, 22 Dec 2022 15:10:21 +0000 (09:10 -0600)]
Define TlvStream::skip_signatures

Provide a helper for skipping signature TLV records from a TLV stream.
This prevents needing to duplicate the check for signature TLV records
when writing a TLV stream without signatures in an upcoming commit.

16 months agoDrop AsRef<[u8]> implementation for TlvRecord
Jeffrey Czyz [Thu, 22 Dec 2022 15:04:48 +0000 (09:04 -0600)]
Drop AsRef<[u8]> implementation for TlvRecord

Explicitly using TlvRecord::record_bytes makes reading the code more
obvious than hiding which bytes are used in AsRef<[u8]>::as_ref.

16 months agoMerge pull request #1956 from TheBlueMatt/2023-01-ser-cleanups
Matt Corallo [Wed, 18 Jan 2023 21:31:07 +0000 (21:31 +0000)]
Merge pull request #1956 from TheBlueMatt/2023-01-ser-cleanups

Trivial Serialization Tweaks

16 months agoMerge pull request #1968 from lexe-tech/max/net-tokio-no-arc
Jeffrey Czyz [Wed, 18 Jan 2023 16:26:39 +0000 (10:26 -0600)]
Merge pull request #1968 from lexe-tech/max/net-tokio-no-arc

lightning-net-tokio: Don't require `Arc<PeerManager>`

16 months agolightning-net-tokio: Don't require `Arc<PeerManager>`
Max Fang [Wed, 18 Jan 2023 04:37:10 +0000 (20:37 -0800)]
lightning-net-tokio: Don't require `Arc<PeerManager>`

16 months agoMerge pull request #1962 from TheBlueMatt/2023-01-bp-no-std
Matt Corallo [Tue, 17 Jan 2023 23:48:48 +0000 (23:48 +0000)]
Merge pull request #1962 from TheBlueMatt/2023-01-bp-no-std

Use the user-provided `SleepFuture` for interval checks in `background-processor`

16 months agoUse `test`/`_test_utils` to enable single-threaded debug assertions 2023-01-no-debug-panics
Matt Corallo [Tue, 17 Jan 2023 23:40:44 +0000 (23:40 +0000)]
Use `test`/`_test_utils` to enable single-threaded debug assertions

We have a number of debug assertions which are expected to never
fire when running in a single thread. This is just fine in tests,
and gives us good coverage of our lockorder requirements, but is
not-irregularly surprising to users, who may run with their own
debug assertions in test environments.

Instead, we gate these checks by the `cfg(test)` setting as well as
the `_test_utils` feature, ensuring they run in our own tests, but
not downstream tests.

16 months agoAlways set `_test_utils` when building lightning for some tests
Matt Corallo [Tue, 17 Jan 2023 23:39:41 +0000 (23:39 +0000)]
Always set `_test_utils` when building lightning for some tests

This ensures that we hit additional assertions which are intended
to always be run in tests.

16 months agoMerge pull request #1960 from tnull/2023-01-deref-router-in-invoicepayer
Matt Corallo [Tue, 17 Jan 2023 23:21:22 +0000 (23:21 +0000)]
Merge pull request #1960 from tnull/2023-01-deref-router-in-invoicepayer

Make `InvoicePayer`'s `Router` `Deref`

16 months agoMerge pull request #1957 from TheBlueMatt/2022-01-mon-ref-lockorder
Matt Corallo [Tue, 17 Jan 2023 23:09:05 +0000 (23:09 +0000)]
Merge pull request #1957 from TheBlueMatt/2022-01-mon-ref-lockorder

Pass MonitorUpdates by ref and tweak manager lockorder

16 months agoDefine option_anchors_zero_fee_htlc_tx feature bit
Wilmer Paulino [Tue, 2 Aug 2022 21:48:38 +0000 (14:48 -0700)]
Define option_anchors_zero_fee_htlc_tx feature bit

16 months agoFix stale reference to BaseSign::ready_channel
Wilmer Paulino [Mon, 12 Dec 2022 23:43:40 +0000 (15:43 -0800)]
Fix stale reference to BaseSign::ready_channel