LDK v0.0.124: 'Papercutting Feature Requests'
LDK/rust-lightning is a highly performant and flexible implementation of the Lightning Network protocol.
- "LDK 0.0.124 is up on crates.io! Releases in other languages should follow over the coming day(s)," announced Matt Corallo.
- This release features a new crate structure, a ton of features that various users requested, a pile of BOLT 12 improvements, faster route-finding, and a handful of small-moderate bugfixes.
- In total, this release features 312 files changed, 29853 insertions, 15480 deletions in 549 commits since 0.0.123 from 26 authors.
What's new
API Updates
rust-bitcoinhas been updated to 0.32. The newbitcoin-iocrate is now used for all IO traits, irrespective of the features set on LDK crates. LDK crates no longer automatically force features on dependent crates where possible, allowing differentstd/no-stdsettings between LDK and rust-bitcoin crates (e.g. to disablestdon LDK to ensure system time is not accessed while usingbitcoin-io'sstdfeature). (#3063, #3239, #3249).- A new
lightning_typescrate was added which contains various top-level types. Using types fromlightning::ln::featuresorPayment{Hash,Preimage,Secret}fromlightning::lnorlightning::ln::typesis now deprecated. The new crate is re-exported aslightning::types(#3234, #3253). lightningnow depends onlightning-invoice, rather than the other way around. Thelightning_invoice::paymentmodule has moved tolightning::ln::bolt11_paymentandlightning_invoice::utilstolightning::ln::invoice_utils(#3234).- Event handlers may now return errors, causing most events to be replayed immediately without blocking the background processor. See documentation on individual
Events for more information on replay (#2995). ChannelDetails::balance_msatis deprecated in favor ofChainMonitor::get_claimable_balancesand theBalance, which now contains substantially more details and more accurately calculates a node-wide balance whenBalance::claimable_amount_satoshisare summed (#3212, #3247).ConfirmationTargethas two new variants - aMaximumFeeEstimatewhich can help to avoid spurious force-closes by ensuring we always accept feerates up to this value from peers as sane and aUrgentOnChainSweep, replacingOnChainSweepand only being used when the on-chain sweep is urgent (#3268).- All
ChannelMonitors are no longer persisted after each block connection, instead spreading them out over a handful of blocks to reduce load spikes. Note that this will increase the incidence ofChannelMonitors that have different best blocks on startup, requiring some additional chain replay (but only on someChannelMonitors) on startup forListenusers (#2966). - A new format for Rapid Gossip Sync data is now supported which contains additional node metadata and is more extensible (#3098).
ChannelManager::send_payment_with_routeis now deprecated in favor of the much easier to useChannelmanager::send_payment. Those who wish to manually select the route such payments go over should do so by matching thepayment_idpassed tosend_paymentinRouter::find_route_with_id(#3224)lightning-transaction-syncnow takes mostConfirms as a genericDeref. You may need an explicitas &(dyn Confirm)to update existing code (#3101).- HTLCs will now be forwarded over any channel with a peer, rather than only the specific channel requested by the payment sender (#3127).
Event::PaymentFailedis now used in place ofEvent::InvoiceRequestFailed, holding anOptionfor the payment hash, which will beNonewhen no invoice has been received (#3192).ChannelManagernow supports intercepting and manually payingBolt12Invoices, seeUserConfig::manually_handle_bolt12_invoices(#3078).logger::Records now contain aPaymentHash(#2930).ChainMonitorno longer uses an opaqueMonitorUpdateId, opting to reuse theChannelMonitorUpdate::update_idinstead. Note that you no longer have to callChainMonitor::channel_monitor_updatedforChannelMonitorUpdateStatus::InProgressupdates to a monitor that were started without aChannelMonitorUpdate(#2957).NodeAnnouncementInfois now an enum holding either a gossip message or the important fields, reducing the memory usage ofNetworkGraph(#3072).- Onion message handlers now include a message context, which allows for blinded path authentication (#3085, #3202).
ChannelManagernow supports funding with only a txid and output index, seeChannelManager::unsafe_manual_funding_transaction_generated(#3024).- BOLT 12 invoice requests now go out over, and accept responses over, multiple paths (#3087).
OnionMessengernow supports intercepting and re-forwarding onion messages for peers that are offline at the time of receipt when constructed withnew_with_offline_peer_interception(#2973).- Onion message handling trait methods now generally take a
Responderwhich can be used to create aResponseInstructionto better control how responses are sent. TheResponseInstructioncan also be converted toMessageSendInstructionswhich can be passed toOnionMessenger'ssend_onion_messageto respond asynchronously (#2907, #2996, #3263). OnionMessenger::process_pending_events_asyncwas added (#3060).- Blinded paths used for BOLT 12
Offer/Refunds are now compact when they expire relatively soon, making them somewhat smaller (#3011, #3080). ChannelManager::force_close_*now take a err msg to send to peers (#2889).ChannelDetails::is_publichas been renamed tois_announcedandChannelHandshakeConfig::announced_channeltoannounce_for_forwardingto address various misconceptions about the purpose of announcement (#3257).BlindedPaths are now split intoBlindedMessagePaths andBlindedPaymentPaths andadvance_path_by_oneadded to each (#3182).BlindedPaymentPathnow includes theBlindedPayInfo(#3245).- BOLT 12
Offer/Refundbuilders no longer require a description, instead allowing it to be set on the builder itself (#3018). - The
{Inbound,Outbound}HTLCState{,Details}andChannelDetailsstructs have moved to theln::channel_statemodule (#3089). Event::OpenChannelRequestnow containsparamsandis_announced(#3019).- Peers are no longer disconnected when we force-close a channel (#3088).
- BOLT12
OfferandRefundnow implementReadable(#2965). RecipientOnionFieldsis now included inEvent::PaymentClaimed(#3084).ClosureReason::HolderForceClosed::broadcasted_latest_txnwas added (#3107).EcdsaChannelSignerno longer needs to beWriteableand the supertraitWriteableEcdsaChannelSignerhas been removed (#3059).CustomMessageHandler::peer_{,dis}connectedwere added (#3105).lightning_invoice::Description::as_inner()was added (#3203).- Splice-related wire messages have been updated to the latest spec (#3129).
Bug Fixes
channel_updatemessages are no longer extracted from failed payments and applied to the network graph viaEvent::PaymentPathFailed, preventing a node along the path from identifying the sender of a payment (#3083).- In order to prevent senders from identifying the recipient of a BOLT 12 offer that included a blinded path, cryptographic information from blinded paths are now included in the invoice request verification (#3085, #3139, #3242).
- Routes are now length-limited based on the actual onion contents rather than a fixed value. This ensures no routes are generated that are unpayable when sending HTLCs with custom TLVs, blinded paths, or metadata (#3026, #3156).
- Unannounced LDK nodes (or ones without a network graph) will now include unannounced peers as introduction points in blinded paths. This addresses issues where test networks were not usable for BOLT 12 due to failures to find paths over private channels to LDK nodes. It will also enable creating BOLT 12 offers for nodes with no local network graph (#3132).
- If a channel partner fails to update the feerate on a channel for some time and prevailing network feerates increase, LDK will now force-close automatically to avoid being unable to claim our funds on-chain. In order to reduce false-positives, it does so by comparing the channel's fee against the minimum
ConfirmationTarget::MinAllowed{,Non}AnchorChannelRemoteFeewe've seen over the past day (and do not force-close if we haven't been running for a full day, #3037). MonitorUpdatingPersisterdid not readChannelMonitorUpdates when archiving aChannelMonitor, causing the archivedChannelMonitorto be missing some updates. Those updates were not removed from theKVStoreand monitors being archived should have no pending updates as they were persisted on each new block for some time before archiving (#3276).CoinSelections selected for commitment transactions which did not contain a change output no longer result in broadcasting a non-standard transaction nor in under-paying the target feerate (#3285). Note that such a transaction would fail to propagate and LDK would have continued to bump the fee until a differentCoinSelectionis used which did contain a change output.invoice_errors from BOLT 12 recipients now fail payments (#3085, #3192).- Fixed a bug which may lead to a missing
Event::ChannelClosedand missingErrormessages for peers when a bogus funding transaction is provided for a batch channel open (#3029). - Fixed an overflow in
RawBolt11Invoice::amount_pico_btc()reachable viaBolt11Invoice::amount_milli_satoshis(), resulting in a debug panic or bogus value for invoices with invalid values (#3032). - In incredibly rare circumstances, when using the beta asynchronous persistence, it is possible that the preimage for an MPP claim could fail to be persisted in the
ChannelMonitorfor one or more MPP parts, resulting in only some of the payment's value being claimed (#3120). - A rare race was fixed which could lead to
ChannelMonitorUpdates appearing after a fullChannelMonitorpersistence that already contained the same update. This could have caused a panic on startup for users of theMonitorUpdatingPersisterin rare cases after a crash (#3196). - Background Processor is now woken from
ChainMonitorwhen new blocks appear, reducing the worst-case latency to see anEvent::SpendableOutputs(#3033). OnionMessenger::get_update_futurewas added, allowing it to wake the background processor to ensureEvents are processed quickly (#3194).CoinSelections overpaying the target feerate by more than 1% no longer leads to a debug assertion (#3285).
Backwards Compatibility
- BOLT 12
Offers created in prior versions are still valid but are at risk of deanonymization attacks allowing identification of the recipient node (#3139) - BOLT 12 outbound payments in state
RecentPaymentDetails::AwaitingInvoicewill eventually time out after upgrade to 0.0.124 as any received invoice will be considered invalid (#3139). - BOLT 12
Refunds created in prior version with non-emptyRefund::pathsare considered invalid byChannelManager. Any attempts to claim them will be ignored.Refunds without blinded paths are unaffected (#3139). - The format written by
impl_writeable_tlv_based_enum[_upgradable]for tuple variants has changed, only impacting LDK-external use of the macros (#3160). - An
Event::PaymentFailedwithout a payment hash will deserialize to a payment hash of all-0s when downgrading (#3192). Event::PaymentFailedreasons may be mapped to similar reasons that were available in previous versions on downgrade (#3192).
Performance Improvements
- Route-finding is 11-23% faster (#3103, #3104, #2803, #3188, on an Intel Xeon Silver 4116 (Skylake)).
lightning-block-syncnow much better avoids lock contention during parallel requests for block data, speeding up gossip sync from multiple peers (#3197).
Node Compatibility
- 0.0.123 contained a workaround for CLN v24.02 requiring the
gossip_queriesfeature for all peers. Since an updated CLN has now shipped which does not require this, the workaround has been reverted (#3172). - LDK now supports BOLT 12 Offers without an explicit signing public key, allowing it to pay more compact offers generated by other nodes (#3017).
- LDK now supports BOLT 12 Offers without descriptions when no amount is present (#3018).
- A bug was fixed which might have led to LDK spuriously rejecting
channel_updates that use as-yet-undefined flag bits (#3144).