16 KiB
Release Notes
Bug Fixes
-
Fixed potential update inconsistencies in node announcements by creating a shallow copy before modifications. This ensures the original announcement remains unchanged until the new one is fully signed and validated.
-
Fixed shutdown deadlock when we fail starting up LND before we startup the chanbackup sub-server.
-
Fixed BOLT-11 invoice parsing behavior: now errors are returned when receiving empty route hints or a non-UTF-8-encoded description.
-
Fixed an issue where known TLV fields were incorrectly encoded into the
ExtraDatafield of messages in the dynamic commitment set. -
Fixed a case that we may send unnecessary
channel_announcementandnode_announcementmessages when replying to agossip_timestamp_filterquery. -
Fixed a case in the sweeper where some outputs would not be resolved due to an error string mismatch.
-
Fixed a case in the utxonursery (the legacy sweeper) where htlcs with a locktime of 0 would not be swept.
New Features
- Use persisted nodeannouncement settings across restart. Before this change we always go back to the default settings when the node restarts.
-
Added NoOp HTLCs. This allows sending HTLCs to the remote party without shifting the balances of the channel. This is currently only possible to use with custom channels, and only when the appropriate TLV flag is set. This allows for HTLCs carrying metadata to reflect their state on the channel commitment without having to send or receive a certain amount of msats.
-
Added support for P2TR Fallback Addresses in BOLT-11 invoices.
-
A new experimental RPC endpoint XFindBaseLocalChanAlias was added for looking up the base scid for an scid alias. Aliases that were manually created via the
XAddLocalChanAliasesendpoint will get lost on restart.
Functional Enhancements
-
Add
ConfirmationsUntilActiveandConfirmationHeightfield to thePendingChannelsResponse_PendingChannelmessage, providing users with the number of confirmations remaining before a pending channel becomes active and the block height at which the funding transaction was first confirmed. This change also persists the channel's confirmation height in the database once its funding transaction receives one confirmation, allowing tracking of confirmation progress before the channel becomes active. -
RPCs
walletrpc.EstimateFeeandwalletrpc.FundPsbtnow allowconf_target=1. Previously they requiredconf_target >= 2. -
A new AuxComponent was added named AuxChannelNegotiator. This component aids with custom data communication for aux channels, by injecting and handling data in channel related wire messages. See PR for more info.
RPC Additions
-
When querying
ForwardingEventslogs, the response now include the incoming and outgoing htlc indices of the payment circuit. The indices are only available for forwarding events saved after v0.20. -
The
lncli addinvoice --blindcommand now has the option to include a chained channels 1 2 incoming list--blinded_path_incoming_channel_listwhich gives users the control of specifying the channels they prefer to receive the payment on. With the option to specify multiple channels this control can be extended to multiple hops leading to the node. -
The
lnrpc.ForwardingHistoryRPC method now supports filtering byincoming_chan_idsandoutgoing_chan_ids. This allows to retrieve forwarding events for specific channels. -
DescribeGraph,GetNodeInfo,GetChanInfoand the corresponding lncli commands now have flaginclude_auth_proof. With the flag, these APIs add AuthProof (signatures from the channel announcement) to the returned ChannelEdge. -
A new config value
--htlcswitch.quiescencetimeoutis added to allow specifying the max duration the channel can be quiescent. A minimal value of 30s is enforced, and a default value of 60s is used. This value is used to limit the dependent protocols like dynamic commitments by restricting that the operation must finish under this timeout value. Consider using a larger timeout value if you have a slow network. -
The default value for
gossip.msg-rate-byteshas been increased from 100KB to 1MB, andgossip.msg-burst-byteshas been increased from 200KB to 2MB. -
Added
deletecanceledinvoicesRPC to allow the removal of a canceled invoice. Supports deleting a canceled invoice by providing its payment hash. -
A new config
gossip.ban-thresholdis added to allow users to configure the ban score threshold for peers. When a peer's ban score exceeds this value, they will be disconnected and banned. Setting the value to 0 effectively disables banning by setting the threshold to the maximum possible value. -
A new config value
gossip.peer-msg-rate-bytes=102400is introduced to allow limiting the outgoing bandwidth used by each peer when processing gossip-related messages. Note this is different fromgossip.msg-rate-bytes, as this new config controls the bandwidth per peer, whilemsg-rate-bytescontrols the gossip as a whole. This new config prevents a single misbehaving peer from using up all the bandwidth.
lncli Additions
-
lncli sendpaymentandlncli queryroutesnow support the--route_hintsflag to support routing through private channels. -
The
lncli fwdinghistorycommand now supports two new flags:--incoming_chan_idsand--outgoing_chan_ids. These filters allows to query forwarding events for specific channels.
Improvements
Functional Updates
- Graph Store SQL implementation and migration project:
- Introduce an abstract graph store interface.
- Start validating that byte blobs at the end of gossip messages are valid TLV streams.
- Various preparations of the graph code before the SQL implementation is added.
- Only fetch required fields during graph cache population.
- Add graph schemas, queries and CRUD: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
- Add graph SQL migration logic: [1, 2, 3]
RPC Updates
-
Previously the
RoutingPolicywould return the inbound fee record in itsCustomRecordsfield, which is duplicated info as it's already presented in fieldsInboundFeeBaseMsatandInboundFeeRateMilliMsat. This is now fixed, the affected RPCs areSubscribeChannelGraph,GetChanInfo,GetNodeInfoandDescribeGraph. -
Fix a bug where the
GetChanInfowas not returning the correct gRPC status code in the cases where the channel is unknown to the node. The same is done forLookupInvoicefor the case where the DB is kvdb backed and no invoices have yet been added to the database. -
The
FlapCountandLastFlapNshave been changed to track exclusively for peers that have channels with us.
lncli Updates
- Previously, users could only specify one
outgoing_chan_idwhen calling thelncli queryroutesor the QueryRoutes RPC. With this change, multipleoutgoing_chan_idcan be passed during the call.
Code Health
-
Increase itest coverage for payments. Now the payment address is mandatory for the writer and reader of a payment request.
-
Refactored
channelLinkto improve readability and maintainability of the code. -
Introduced a wallet interface to decouple the relationship between
lndandbtcwallet. -
Refactored channel graph update iterators to use Go's
iter.Seq2pattern. TheUpdatesInHorizon,NodeUpdatesInHorizon, andChanUpdatesInHorizonmethods now return lazy iterators instead of materializing all updates in memory at once, improving memory efficiency for large graph operations.
Breaking Changes
Performance Improvements
Deprecations
⚠️ Warning: The following RPCs will be removed in release version 0.21:
| Deprecated RPC Method | REST Equivalent | HTTP Method | Path | Replaced By |
|---|---|---|---|---|
lnrpc.SendToRoute routerrpc.SendToRoute |
❌ (No direct REST equivalent) | — | — | routerrpc.SendToRouteV2 |
lnrpc.SendPayment routerrpc.SendPayment |
✅ | POST |
/v1/channels/transaction-stream |
routerrpc.SendPaymentV2 |
lnrpc.SendToRouteSync |
✅ | POST |
/v1/channels/transactions/route |
routerrpc.SendToRouteV2 |
lnrpc.SendPaymentSync |
✅ | POST |
/v1/channels/transactions |
routerrpc.SendPaymentV2 |
router.TrackPayment |
❌ (No direct REST equivalent) | — | — | routerrpc.TrackPaymentV2 |
🚨 Users are strongly encouraged to transition to the new V2 methods before release 0.21 to ensure compatibility:
| New RPC Method | REST Equivalent | HTTP Method | Path |
|---|---|---|---|
routerrpc.SendToRouteV2 |
✅ | POST |
/v2/router/route/send |
routerrpc.SendPaymentV2 |
✅ | POST |
/v2/router/send |
routerrpc.TrackPaymentV2 |
✅ | GET |
/v2/router/track/{payment_hash} |
-
We are deprecating
OutgoingChanIdin favour ofOutgoingChanIdsin theQueryRoutesRPC. This transition allows us to specify more than one outgoing channel the pathfinder should use when finding a route. -
Support for Tor v2 onion services is deprecated and will be removed in v0.21.0. The
--tor.v2configuration option is now hidden.
Technical and Architectural Updates
BOLT Spec Updates
-
Explicitly define the inbound fee TLV record on the
channel_updatemessage and handle it explicitly throughout the code base instead of extracting it from the TLV stream at various call-sites. -
Don't error out if an invoice's feature vector contain both the required and optional versions of a feature bit. In those cases, just treat the feature as mandatory.
-
Require invoices to include a payment address or blinded paths to comply with updated BOLT 11 specifications before sending payments.
-
LND can now recgonize DNS address type in node announcement msg. This allows users to forward node announcement with valid DNS address types. The validity aligns with Bolt 07 DNS constraints.
Testing
- Previously, automatic peer bootstrapping was disabled for simnet, signet and
regtest networks even if the
--nobootstrapflag was not set. This automatic disabling has now been removed meaning that any test network scripts that rely on bootstrapping being disabled will need to explicitly define the--nobootstrapflag. Bootstrapping will now also be deterministic on local test networks so that bootstrapping behaviour can be tested for.
Database
-
Add missing sql index for settled invoices to increase query speed.
-
Migrate the KV graph store to native SQL. For this migration to take place, the db backend must already be either
postgresorsqliteand the--use-native-sqlflag must be set.
Code Health
Tooling and Documentation
Contributors (Alphabetical Order)
- Abdulkbk
- Boris Nagaev
- Elle Mouton
- Erick Cestari
- Funyug
- Mohamed Awnallah
- Olaoluwa Osuntokun
- Pins
- Torkel Rogstad
- Yong Yu
- Ziggie