Skip to content

Commit 889adb1

Browse files
TheBlueMatttnull
authored andcommitted
Merge pull request #3530 from TheBlueMatt/2025-01-0.1-relnotes
Add draft 0.1 release notes
2 parents 2c5a1f6 + 5d1b6e0 commit 889adb1

18 files changed

+383
-323
lines changed

CHANGELOG.md

+174
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,177 @@
1+
# 0.1 - Jan XXX, 2025 - XXX
2+
3+
## API Updates
4+
* The `lightning-liquidity` crate has been moved into the `rust-lightning`
5+
git tree, enabling support for both sides of the LSPS channel open
6+
negotiation protocols (#3436).
7+
* Since its last alpha release, `lightning-liquidity` has also gained support
8+
for acting as an LSPS1 client (#3436).
9+
* This release includes support for BIP 353 Human Readable Names resolution.
10+
With the `dnssec` feature enabled, simply call `ChannelManager`'s
11+
`pay_for_offer_from_human_readable_name` with a list of lightning nodes that
12+
have the `dns_resolver` feature flag set (e.g. those running LDK with the
13+
new `lightning_dns_resolver::OMDomainResolver` set up to resolve DNS queries
14+
for others) and a Human Readable Name (#3346, #3179, #3283).
15+
* Asynchronous `ChannelMonitorUpdate` persistence (i.e. the use of
16+
`ChannelMonitorUpdateStatus::InProgress`) is now considered beta-quality.
17+
There are no known issues with it, though the likelihood of unknown issues
18+
is high (#3414).
19+
* `ChannelManager`'s `send_payment_with_route` and `send_spontaneous_payment`
20+
were removed. Use `send_payment` and `send_spontaneous_payment_with_retry`
21+
(now renamed `send_spontaneous_payment`) instead (#3430).
22+
* `ChannelMonitor`s no longer need to be re-persisted after deserializing the
23+
`ChannelManager` before beginning normal operation. As such,
24+
`ChannelManagerReadArgs::channel_monitors` no longer requires mutable
25+
references (#3322). See the Backwards Compatibility section for more info.
26+
* Additional information is now stored in `ChannelMonitorUpdate`s which may
27+
increase the average size of `ChannelMonitorUpdate`s when claiming inbound
28+
payments substantially. The expected maximum size of `ChannelMonitorUpdate`s
29+
shouldn't change materially (#3322).
30+
* Redundant `Event::PaymentClaimed`s will be generated more frequently on
31+
startup compared to previous versions.
32+
`Event::PaymentClaim{able,ed}::payment_id` has been added to allow for more
33+
robust handling of redundant events on payments with duplicate
34+
`PaymentHash`es (#3303, #3322).
35+
* `ChannelMonitorUpdate::update_id`s no longer have a magic value (of
36+
`u64::MAX`) for updates after a channel has been closed. They are now
37+
always monotonically increasing (#3355).
38+
* The MSRV of `lightning-transaction-sync` has been increased to rustc 1.75 due
39+
to its HTTP client dependencies (#3528).
40+
* The default `ProbabilisticScoringFeeParameters` values now recommend specific
41+
ratios between different penalties, and default penalties now allow for
42+
higher fees in order to reduce payment latency (#3495).
43+
* On-chain state resolution now more aggressively batches claims into single
44+
transactions, reducing on-chain fee costs when resolving multiple HTLCs for a
45+
single channel force-closure. This also reduces the on-chain reserve
46+
requirements for nodes using anchor channels (#3340).
47+
* A `MigratableKVStore` trait was added (and implemented for
48+
`FilesystemStore`), enabling easy migration between `KVStore`s (#3481).
49+
* `InvoiceRequest::amount_msats` now returns the `offer`-implied amount if a
50+
Bitcoin-denominated amount was set in the `offer` and no amount was set
51+
directly in the `invoice_request` (#3535).
52+
* `Event::OpenChannelRequest::push_msat` has been replaced with an enum in
53+
preparation for the dual-funding protocol coming in a future release (#3137).
54+
* `GossipVerifier` now requires a `P2PGossipSync` which holds a reference to
55+
the `GossipVerifier` via an `Arc` (#3432).
56+
* The `max_level_*` features were removed as the performance gain compared to
57+
doing the limiting at runtime was negligible (#3431).
58+
* `ChannelManager::create_bolt11_invoice` was added, deprecating the
59+
`lightning::ln::invoice_utils` module (#3389).
60+
* The `bech32` dependency has been upgraded to 0.11 across crates (#3270).
61+
* Support for creating BOLT 12 `invoice_request`s with a static signing key
62+
rather than an ephemeral one has been removed (#3264).
63+
* The `Router` trait no longer extends the `MessageRouter` trait, creating an
64+
extra argument to `ChannelManager` construction (#3326).
65+
* The deprecated `AvailableBalances::balance_msat` has been removed in favor of
66+
`ChannelMonitor::get_claimable_balances` (#3243).
67+
* Deprecated re-exports of `Payment{Hash,Preimage,Secret}` and `features` were
68+
removed (#3359).
69+
* `bolt11_payment::*_from_zero_amount_invoice` methods were renamed
70+
`*_from_variable_amount_invoice` (#3397)
71+
* Offer `signing_pubkey` (and related struct names) have been renamed
72+
`issuer_signing_pubkey` (#3218).
73+
* `Event::PaymentForwarded::{prev,next}_node_id` were added (#3458).
74+
* `Event::ChannelClosed::last_local_balance_msat` was added (#3235).
75+
* `RoutingMessageHandler::handle_*` now all have a `node_id` argument (#3291).
76+
* `lightning::util::persist::MonitorName` has been exposed (#3376).
77+
* `ProbabilisticScorer::live_estimated_payment_success_probability` was added
78+
(#3420)
79+
* `EcdsaChannelSigner::sign_splicing_funding_input` was added to support an
80+
eventual splicing feature (#3316).
81+
* `{Payment,Offer}Id` now support lowercase-hex formatting (#3377).
82+
83+
## Bug Fixes
84+
* Fixed a rare case where a BOLT 12 payment may be made duplicatively if the
85+
node crashes while processing a BOLT 12 `invoice` message (#3313).
86+
* Fixed a bug where a malicious sender could cause a payment `Event` to be
87+
generated with an `OfferId` using a payment with a lower amount than the
88+
corresponding BOLT 12 offer would have required. The amount in the
89+
`Event::Payment{Claimable,Claimed}` were still correct (#3435).
90+
* The `ProbabilisticScorer` model and associated default scoring parameters
91+
were tweaked to be more predictive of real-world results (#3368, #3495).
92+
* `ProbabilisticScoringFeeParameters::base_penalty_amount_multiplier_msat` no
93+
longer includes any pending HTLCs we already have through channels in the
94+
graph, avoiding over-penalizing them in comparison to other channels (#3356).
95+
* A `ChannelMonitor` will no longer be archived if a `MonitorEvent` containing
96+
a preimage for another channel is pending. This fixes an issue where a
97+
payment preimage needed for another channel claim is lost if events go
98+
un-processed for 4038 blocks (#3450).
99+
* `std` builds no longer send the full gossip state to peers that do not
100+
request it (#3390).
101+
* `lightning-block-sync` listeners now receive `block_connected` calls, rather
102+
than always receiving `filtered_block_connected` calls (#3354).
103+
* Fixed a bug where some transactions were broadcasted one block before their
104+
locktime made them candidates for inclusion in the mempool (though they would
105+
be automatically re-broadcasted later, #3453).
106+
* `ChainMonitor` now persists `ChannelMonitor`s when their `Balance` set first
107+
goes empty, making `ChannelMonitor` pruning more reliable on nodes that are
108+
only online briefly (e.g. mobile nodes, #3442).
109+
* BOLT 12 invoice requests now better handle intermittent internet connectivity
110+
(e.g. on mobile devices with app interruptions, #3010).
111+
* Broadcast-gossip `MessageSendEvent`s from the `ChannelMessageHandler` are now
112+
delivered to peers even if the peer is behind in processing relayed gossip.
113+
This ensures our own gossip propagates well even if we have very limited
114+
upload bandwidth (#3142).
115+
* Fixed a bug where calling `OutputSweeper::transactions_confirmed` with
116+
transactions from anything but the latest block may have triggered a spurious
117+
assertion in debug mode (#3524).
118+
119+
## Performance Improvements
120+
* LDK now verifies `channel_update` gossip messages without holding a lock,
121+
allowing additional parallelism during gossip sync (#3310).
122+
* LDK now checks if it already has certain gossip messages before verifying the
123+
message signatures, reducing CPU usage during gossip sync after the first
124+
startup (#3305).
125+
126+
## Node Compatibility
127+
* LDK now handles fields in the experimental range of BOLT 12 messages (#3237).
128+
129+
## Backwards Compatibility
130+
* Nodes with pending forwarded HTLCs or unclaimed payments cannot be
131+
upgraded directly from 0.0.123 or earlier to 0.1. Instead, they must
132+
first either resolve all pending HTLCs (including those pending
133+
resolution on-chain), or run 0.0.124 or 0.0.125 and resolve any HTLCs that
134+
were originally forwarded or received running 0.0.123 or earlier (#3355).
135+
* `ChannelMonitor`s not being re-persisted after deserializing the
136+
`ChannelManager` only applies to upgraded nodes *after* a startup with the
137+
old semantics completes at least once. In other words, you must deserialize
138+
the `ChannelManager` with an upgraded LDK, persist the `ChannelMonitor`s as
139+
you would on pre-0.1 versions of LDK, then continue to normal startup once,
140+
and for startups thereafter you can take advantage of the new semantics
141+
avoiding redundant persistence on startup (#3322).
142+
* Pending inbound payments paying a BOLT 12 `invoice` issued prior to upgrade
143+
to LDK 0.1 will fail. Issued BOLT 12 `offer`s remain payable (#3435).
144+
* `UserConfig::accept_mpp_keysend` was removed, thus the presence of pending
145+
inbound MPP keysend payments will prevent downgrade to LDK 0.0.115 and
146+
earlier (#3439).
147+
* Inbound payments initialized using the removed
148+
`ChannelManager::create_inbound_payment{,_for_hash}_legacy` API will no
149+
longer be accepted by LDK 0.1 (#3383).
150+
* Downgrading to prior versions of LDK after using `ChannelManager`'s
151+
`unsafe_manual_funding_transaction_generated` may cause `ChannelManager`
152+
deserialization to fail (#3259).
153+
* `ChannelDetails` serialized with LDK 0.1+ read with versions prior to 0.1
154+
will have `balance_msat` equal to `next_outbound_htlc_limit_msat` (#3243).
155+
156+
## Security
157+
0.1 fixes a funds-theft vulnerability when paying BOLT 12 offers as well as a
158+
funds-lockup denial-of-service issue for anchor channels.
159+
* When paying a BOLT 12 offer, if the recipient responds to our
160+
`invoice_request` with an `invoice` which had an amount different from the
161+
amount we intended to pay (either from the `offer` or the `amount_msats`
162+
passed to `ChannelManager::pay_for_offer`), LDK would pay the amount from the
163+
`invoice`. As a result, a malicious recipient could cause us to overpay the
164+
amount we intended to pay (#3535).
165+
* Fixed a bug where a counterparty can cause funds of ours to be locked up
166+
by broadcasting a revoked commitment transaction and following HTLC
167+
transactions in specific formats when using an anchor channel. The funds can
168+
be recovered by upgrading to 0.1 and replaying the counterparty's broadcasted
169+
transactions (using `Confirm::transactions_confirmed`) (#3537). Thanks to
170+
Matt Morehouse for reporting and fixing this issue.
171+
* Various denial-of-service issues in the formerly-alpha `lightning-liquidity`
172+
crate have been addressed (#3436, #3493).
173+
174+
1175
# 0.0.125 - Oct 14, 2024 - "Delayed Beta Testing"
2176

3177
## Bug Fixes

lightning-liquidity/src/lsps0/client.rs

+1
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ where
4949
/// specifcation](https://github.com/BitcoinAndLightningLayerSpecs/lsp/tree/main/LSPS0#lsps-specification-support-query)
5050
/// for more information.
5151
pub fn list_protocols(&self, counterparty_node_id: &PublicKey) {
52+
let _msg_queue_notifier = self.pending_messages.notifier();
5253
let msg = LSPS0Message::Request(
5354
utils::generate_request_id(&self.entropy_source),
5455
LSPS0Request::ListProtocols(ListProtocolsRequest {}),

lightning-liquidity/src/lsps0/service.rs

+1
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ impl LSPS0ServiceHandler {
3939
fn handle_request(
4040
&self, request_id: RequestId, request: LSPS0Request, counterparty_node_id: &PublicKey,
4141
) -> Result<(), lightning::ln::msgs::LightningError> {
42+
let _msg_queue_notifier = self.pending_messages.notifier();
4243
match request {
4344
LSPS0Request::ListProtocols(_) => {
4445
let msg = LSPS0Message::Response(

lightning-liquidity/src/lsps1/client.rs

+24-35
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@ where
8484
///
8585
/// [`SupportedOptionsReady`]: crate::lsps1::event::LSPS1ClientEvent::SupportedOptionsReady
8686
pub fn request_supported_options(&self, counterparty_node_id: PublicKey) -> RequestId {
87+
let _msg_queue_notifier = self.pending_messages.notifier();
8788
let request_id = crate::utils::generate_request_id(&self.entropy_source);
8889
{
8990
let mut outer_state_lock = self.per_peer_state.write().unwrap();
@@ -191,25 +192,19 @@ where
191192
&self, counterparty_node_id: &PublicKey, order: OrderParameters,
192193
refund_onchain_address: Option<Address>,
193194
) -> RequestId {
194-
let (request_id, request_msg) = {
195-
let mut outer_state_lock = self.per_peer_state.write().unwrap();
196-
let inner_state_lock = outer_state_lock
197-
.entry(*counterparty_node_id)
198-
.or_insert(Mutex::new(PeerState::default()));
199-
let mut peer_state_lock = inner_state_lock.lock().unwrap();
200-
201-
let request_id = crate::utils::generate_request_id(&self.entropy_source);
202-
let request =
203-
LSPS1Request::CreateOrder(CreateOrderRequest { order, refund_onchain_address });
204-
let msg = LSPS1Message::Request(request_id.clone(), request).into();
205-
peer_state_lock.pending_create_order_requests.insert(request_id.clone());
195+
let _msg_queue_notifier = self.pending_messages.notifier();
196+
let mut outer_state_lock = self.per_peer_state.write().unwrap();
197+
let inner_state_lock = outer_state_lock
198+
.entry(*counterparty_node_id)
199+
.or_insert(Mutex::new(PeerState::default()));
200+
let mut peer_state_lock = inner_state_lock.lock().unwrap();
206201

207-
(request_id, Some(msg))
208-
};
209-
210-
if let Some(msg) = request_msg {
211-
self.pending_messages.enqueue(&counterparty_node_id, msg);
212-
}
202+
let request_id = crate::utils::generate_request_id(&self.entropy_source);
203+
let request =
204+
LSPS1Request::CreateOrder(CreateOrderRequest { order, refund_onchain_address });
205+
let msg = LSPS1Message::Request(request_id.clone(), request).into();
206+
self.pending_messages.enqueue(&counterparty_node_id, msg);
207+
peer_state_lock.pending_create_order_requests.insert(request_id.clone());
213208

214209
request_id
215210
}
@@ -310,25 +305,19 @@ where
310305
pub fn check_order_status(
311306
&self, counterparty_node_id: &PublicKey, order_id: OrderId,
312307
) -> RequestId {
313-
let (request_id, request_msg) = {
314-
let mut outer_state_lock = self.per_peer_state.write().unwrap();
315-
let inner_state_lock = outer_state_lock
316-
.entry(*counterparty_node_id)
317-
.or_insert(Mutex::new(PeerState::default()));
318-
let mut peer_state_lock = inner_state_lock.lock().unwrap();
319-
320-
let request_id = crate::utils::generate_request_id(&self.entropy_source);
321-
peer_state_lock.pending_get_order_requests.insert(request_id.clone());
308+
let _msg_queue_notifier = self.pending_messages.notifier();
309+
let mut outer_state_lock = self.per_peer_state.write().unwrap();
310+
let inner_state_lock = outer_state_lock
311+
.entry(*counterparty_node_id)
312+
.or_insert(Mutex::new(PeerState::default()));
313+
let mut peer_state_lock = inner_state_lock.lock().unwrap();
322314

323-
let request = LSPS1Request::GetOrder(GetOrderRequest { order_id: order_id.clone() });
324-
let msg = LSPS1Message::Request(request_id.clone(), request).into();
325-
326-
(request_id, Some(msg))
327-
};
315+
let request_id = crate::utils::generate_request_id(&self.entropy_source);
316+
peer_state_lock.pending_get_order_requests.insert(request_id.clone());
328317

329-
if let Some(msg) = request_msg {
330-
self.pending_messages.enqueue(&counterparty_node_id, msg);
331-
}
318+
let request = LSPS1Request::GetOrder(GetOrderRequest { order_id: order_id.clone() });
319+
let msg = LSPS1Message::Request(request_id.clone(), request).into();
320+
self.pending_messages.enqueue(&counterparty_node_id, msg);
332321

333322
request_id
334323
}

lightning-liquidity/src/lsps2/client.rs

+2
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,7 @@ where
111111
pub fn request_opening_params(
112112
&self, counterparty_node_id: PublicKey, token: Option<String>,
113113
) -> RequestId {
114+
let _msg_queue_notifier = self.pending_messages.notifier();
114115
let request_id = crate::utils::generate_request_id(&self.entropy_source);
115116

116117
{
@@ -151,6 +152,7 @@ where
151152
&self, counterparty_node_id: PublicKey, payment_size_msat: Option<u64>,
152153
opening_fee_params: OpeningFeeParams,
153154
) -> Result<RequestId, APIError> {
155+
let _msg_queue_notifier = self.pending_messages.notifier();
154156
let request_id = crate::utils::generate_request_id(&self.entropy_source);
155157

156158
{

0 commit comments

Comments
 (0)