26 KiB
Release Notes
- Release Notes
- Bug Fixes
- New Features
- Improvements
- Technical and Architectural Updates
- Contributors (Alphabetical Order)
Bug Fixes
-
Fix a bug where
sendcoinscommand with--sweepallflag would not show the correct amount. -
Fixed a potential case that when sweeping inputs with locktime, an unexpected lower fee rate is applied.
-
LND will now enforce pong responses from its peers.
-
Fixed a possible unintended RBF attempt when sweeping new inputs with retried ones.
-
Fixed a case where
lndmight panic due to empty witness data found in a transaction. More details can be found here. -
Fixed a case where it's possible a failed payment might be stuck in pending.
-
Ensure that a valid SCID is used when marking a zombie edge as live.
-
Remove sweep transactions of the same exclusive group. When using neutrino as a backend unconfirmed transactions have to be removed from the wallet when a conflicting tx is confirmed. For other backends these unconfirmed transactions are already removed. In addition, a new
walletrpcendpointRemoveTransactionis introduced which let one easily remove unconfirmed transaction manually. -
Fixed a case where
lndmight dip below its channel reserve when HTLCs are added concurrently. A fee buffer (additional balance) is now always kept on the local side ONLY if the channel was opened locally. This is in accordance with the BOLT 02 specification and protects against sharp fee changes because there is always this buffer which can be used to increase the commitment fee, and it also protects against the case where HTLCs are added asynchronously resulting in stuck channels. -
Fixed a watchtower client test flake that prevented new tasks from overflowing to disk.
-
Properly handle un-acked updates for exhausted watchtower sessions.
-
Allow
shutdowns while HTLCs are in-flight. This change fixes an issue where we would force-close channels when receiving ashutdownmessage if there were currently HTLCs on the channel. After this change, the shutdown procedure should be compliant with BOLT2 requirements. -
If HTLCs are in-flight at the same time that a
shutdownis sent and then a re-connect happens before the coop-close is completed we now ensure that we re-init theshutdownexchange. -
The AMP struct in payment hops will now be populated when the AMP TLV is set.
-
Fixed the payload size calculation in our pathfinder because blinded hops introduced new tlv records.
-
Fixed a timestamp precision issue when querying payments and invoices using the start and end date filters.
-
Fixed an issue where
locked_balanceis not updated inWalletBalanceResponsewhen outputs are reserved forOpenChannelby using non-volatile leases instead of volatile locks. -
Fixed a case where
lndmight propose a low fee rate for the channel (when initiator) due to the mempool not having enough data yet or the channel might be drained locally which with the default fee allocation in place will eventually lead to the downsizing to the fee floor (1 sat/vByte) in the worst case. -
Removed some unreachable code.
-
Fixed a function call where arguments were swapped.
-
Fixed a bug in
btcdthat caused an incompatibility withbitcoind v27.0. -
Fixed UTXO selection for the internal channel funding flow (Single and Batch Funding Flow). Now UTXOs which are unconfirmed and originated from the sweeper subsystem are not selected because they bear the risk of being replaced (BIP 125 RBF).
-
Fixed the behaviour of neutrino LND nodes which would lose sync in case they had very unstable peer connection.
New Features
Functional Enhancements
-
Experimental support for inbound routing fees is added. This allows node operators to require senders to pay an inbound fee for forwards and payments. It is recommended to only use negative fees (an inbound "discount") initially to keep the channels open for senders that do not recognize inbound fees.
Send support is implemented as well.
Positive inbound fees can be enabled with the option
accept-positive-inbound-fees. -
A new config value,
sweeper.maxfeerate, is added so users can specify the max allowed fee rate when sweeping on-chain funds. The default value is 1000 sat/vB. Setting this value below 100 sat/vB is not allowed, as low fee rate can cause transactions not confirming in time, which could result in fund loss. Please note that the actual fee rate to be used is determined by the fee estimator used (for instancebitcoind), and this value is a cap on the max allowed value. So it's expected that this cap is rarely hit unless there's mempool congestion. -
Support for pathfinding and payment to blinded paths has been added via the
QueryRoutes(andSendToRouteV2) APIs. This functionality is surfaced inlncli queryrouteswhere the required flags are tagged with(blinded paths). Updates to mission control to handle pathfinding errors for blinded paths are also included. -
A new config value, http-header-timeout, is added so users can specify the amount of time the http server will wait for a request to complete before closing the connection. The default value is 5 seconds.
-
Update watchtowers to be Taproot ready.
-
routerrpc.usestatusinitiatedis introduced to signal that the new payment statusPayment_INITIATEDshould be used for payment-related RPCs. It's recommended to use it to provide granular controls over payments. -
A helper command (
lncli encryptdebugpackage) for collecting and encrypting useful debug information was added. This allows a user to collect the most relevant information about their node with a single command and securely encrypt it to the public key of a developer or support person. That way the person supporting the user with their issue has an eas way to get all the information they usually require without the user needing to publicly give away a lot of privacy-sensitive data. -
When publishing transactions in
lnd, all the transactions will now go through mempool acceptance check before being broadcast. This means when a transaction has failed thetestmempoolacceptcheck bybitcoindorbtcd, the broadcast won't be attempted. This check will be performed if the version of the chain backend supports it - forbitcoindit'sv22.0.0and above, forbtcdit'sv0.24.1and above. Otherwise, the check will be skipped. -
The
coin-selection-strategyconfig option now also applies to channel funding operations and the newPsbtCoinSelectoption of theFundPsbtRPC. -
Environment variables can now be used in
lnd.conffor therpcuserandrpcpassfields to better protect the secrets. -
When computing a minimum fee for transaction construction,
lndnow takes its bitcoin peers'feefiltervalues into account. -
Web fee estimator settings have been moved into a new
feeconfig group. A newfee.urloption has been added within this group that replaces the oldfeeurloption, which is now deprecated. Additionally, two new config values, fee.min-update-timeout and fee.max-update-timeout are added to allow users to specify the minimum and maximum time between fee updates from the web fee estimator. The default values are 5 minutes and 20 minutes respectively. These values are used to prevent the fee estimator from being queried too frequently. This replaces previously hardcoded values that were set to the same values as the new defaults. The previously deprecatedneutrino.feeurloption has been removed. -
Preparatory work for forwarding of blinded routes was added, along with support for forwarding blinded payments and error handling. With this change, LND is now eligible to be selected as part of a blinded route and can forward payments on behalf of nodes that have support for receiving to blinded paths. This upgrade provides a meaningful improvement to the anonymity set and usability of blinded paths in the Lightning Network.
-
Introduced fee bumper to handle bumping the fees of sweeping transactions properly. A README.md is added to explain this new approach.
RPC Additions
-
Deprecated
StatusUnknownfrom the payment's rpc response in its status and added a new status,StatusInitiated, to explicitly report its current state. Before running this new version, please make sure to upgrade your client application to include this new status so it can understand the RPC response properly. -
Adds a new RPC endpoint
GetTransactionto thewalletrpcsub-server to fetch transaction details. -
The new
GetDebugInfoRPC method was added that returns the full runtime configuration of the node as well as the complete log file. The correspondinglncli getdebuginfocommand was also added. -
Add a new flag to the
CloseChannelRPC method that instructs the client to not wait for the closing transaction to be negotiated. This should be used if you don't care about the TXID and don't want the calling code to block while the channel drains the active HTLCs. -
New watchtower client DeactivateTower and TerminateSession commands have been added. The DeactivateTower command can be used to mark a tower as inactive so that its sessions are not loaded on startup and so that the tower is not considered for session negotiation. TerminateSession can be used to mark a specific session as terminal so that that specific is never used again.
-
The
FundPsbtRPC method now has a third option for specifying a template to fund. This new option will instruct the wallet to perform coin selection even if some inputs are already specified in the template (which wasn't the case with the previous options). Also, users have the option to specify whether a new change output should be added or an existing output should be used for the change. And the fee estimation is correct even if no change output is required.
lncli Additions
-
Deprecate
bumpclosefeeforbumpforceclosefeeto accommodate for the fact that only force closing transactions can be bumped to avoid confusion. Moreover, allow to specify a max fee rate range when coop closing a channel. Deprecate bumpclosefee for bumpforceclosefee and addmax_fee_rateoption toclosechannelcmd. -
The
closeallchannelscommand now asks for confirmation before closing all channels. -
Man pages Generate man pages automatically using
lncli generatemanpagecommand for bothlncliandlndcommands when runningmake install-allin the Makefile.
Improvements
Functional Updates
Tlv
- Bool was added to the primitive type of the tlv package.
Misc
-
Added full validation for blinded path payloads to allow fuzzing before LND fully supports blinded payment relay.
-
Allow
healthcheckpackage users to provide custom callbacks which will execute whenever a healthcheck succeeds/fails. -
PublishTransactionnow returns the error types defined inbtcd/rpcclient. -
checkOutboundPeers is added to
chainHealthCheckto make sure chain backendbitcoindandbtcdmaintain a healthy connection to the network by checking the number of outbound peers if they are below 6. -
Add inbound fees to
subscribeChannelGraph. -
Moved the experimental "custom" options to the main protocol config so that they can be used without the dev build flag set.
Logging
-
Add the htlc amount to contract court logs in case of timed-out HTLCs in order to easily spot dust outputs.
-
Add warning logs during startup when deprecated config options are used.
RPC Updates
-
Deprecated
StatusUnknownfrom the payment's rpc response in its status and replaced it withStatusInitiatedto explicitly report its current state. -
Add an option to sign/verify a tagged hash to the
signer.SignMessage/signer.VerifyMessageRPCs. -
sendtoroutewill return an error when it's called using the flag--skip_temp_erron a payment that's not an MPP. This is needed as a temp error is defined as a routing error found in one of an MPP's HTLC attempts. If, however, there's only one HTLC attempt, when it's failed, this payment is considered failed, thus there's no such thing as temp error for a non-MPP. -
Support for MinConf(minimum number of confirmations) has been added to the
WalletBalanceRPC call. -
EstimateRouteFee extends the graph based estimation by a payment probe approach which can lead to more accurate estimates. The new estimation method manually incorporates fees of destinations that lie hidden behind lightning service providers.
-
PendingChannelsnow optionally returns the raw hex of the closing tx inwaiting_close_channels. -
Coin Selection Strategy add coin selection strategy option to the following on-chain RPC calls
EstimateFee,SendMany,SendCoins,BatchOpenChannel,SendOutputs, andFundPsbt. -
BumpFeehas been updated to take advantage of the new budget-based sweeper. The paramforcehas been deprecated and replaced with a new paramimmediate, and a new parambudgetis added to allow specifying max fees when sweeping outputs. In addition,PendingSweephas added new fieldsimmediate,budget, anddeadline_height, the fieldsforce,requested_conf_target, andnext_broadcast_heightare deprecated. -
Delete All Payments RPC adds
all_paymentsoption to theDeleteAllPaymentsRPC. This update ensures that the arguments are provided when callingDeleteAllPaymentsRPC, whether through gRPC or the REST API, due to the destructive nature of the operation. -
When paying an AMP payment request, the
--ampflag is now required to be consistent with the flow when a payment request isn't used.
lncli Updates
-
Documented all available
lnclicommands. This change makes all existinglnclicommands have the appropriate doc tag in the RPC definition to ensure that the autogenerated API documentation properly specifies how to use thelnclicommand. -
Enable multiple outgoing channel ids for the payment command. This change adds the ability to specify multiple outgoing channel ids for the
sendpaymentcommand. -
Use the default LND value in the
buildrouteRPC command for thefinal cltv delta. -
pendingchannelsnow optionally returns the raw hex of the closing tx inwaiting_close_channels. -
The
estimateroutefeesubcommand now gives access to graph based and payment probe fee estimation.
Code Health
-
Remove Litecoin code. With this change, the
Bitcoin.Activeconfig option is now deprecated since Bitcoin is now the only supported chain. Thechainfield in thelnrpc.Chainmessage has also been deprecated for the same reason. -
The payment lifecycle code has been refactored to improve its maintainability. In particular, the complexity involved in the lifecycle loop has been decoupled into logical steps, with each step having its own responsibility, making it easier to reason about the payment flow.
-
Add a watchtower tower client multiplexer to manage tower clients of different types.
-
Introduce CommitmentType and JusticeKit interface to simplify the code.
-
Bump sqlite version to fix a data race.
-
The pending inputs in the sweeper is now stateful to better manage the lifecycle of the inputs.
Breaking Changes
-
Previously when calling
SendCoins,SendMany,OpenChannelandCloseChannelfor coop close, it is allowed to specify both an emptySatPerVbyteandTargetConf, and a default conf target of 6 will be used. This will no longer be allowed in the next release (v0.19.0) and the caller must specify eitherSatPerVbyteorTargetConfso the fee estimator can do a proper fee estimation. For current release, an error will be logged when no values are specified. -
Removed deprecated
neutrino.feeurloption. Please use the newerfee.urloption instead.
Performance Improvements
- Watchtower client DB migration to massively improve the start-up performance of a client.
Technical and Architectural Updates
BOLT Spec Updates
-
Add Dynamic Commitment Wire Types. This change begins the development of Dynamic Commitments allowing for the negotiation of new channel parameters and the upgrading of channel types.
-
Start using the timestamps query option in the
query_channel_rangemessage. This will allow us to know if our peer has a newer update for a channel that we have marked as a zombie. This addition can be switched off using the newprotocol.no-timestamp-query-optionconfig option. -
Update
min_final_cltv_expiry_delta. This only affects external invoices which do not supply themin_final_cltv_expiryparameter. LND has NOT allowed the creation of invoices with a lowermin_final_cltv_expiry_deltavalue than 18 blocks since LND v0.11.0. -
Make Legacy Features Compulsory. This change implements changes codified in bolts#1092 and makes TLV Onions, Static Remote Keys, Gossip Queries, compulsory features for LND's peers. Data Loss Protection has been compulsory for years.
-
Don't Require Gossip Queries This change undoes a portion of what was introduced in #8275 due to a subsequent spec change that meant we shouldn't require it.
Testing
-
Added fuzz tests for onion errors.
-
Fixed stability and compatibility of unit tests with
bitcoind v26.0.
Database
-
Add context to InvoiceDB methods. This change adds a context parameter to all
InvoiceDBmethods which is a pre-requisite for the SQL implementation. -
Refactor InvoiceDB to eliminate the use of
ScanInvoices. -
Update the embedded Postgres version and raise max connections.
-
Refactor UpdateInvoice to make it simpler to adjust code to also support SQL InvoiceDB implementation.
-
InvoiceDB implementation for SQL backends enabling new users to optionally use an experimental native SQL invoices database.
-
Ensure that LND won't start if native SQL is enabled but the channeldb already has any KV invoices stored.
-
Fix a bug when retrying SQL InvoiceDB transactions due to database errors.
-
Consolidate transaction retry logic and isolation settings between
sqldbandkvdbpackages. -
Expanded SweeperStore to also store the fee rate, fees paid, and whether it's published or not for a given sweeping transaction.
Code Health
- Remove database pointers
from
channeldbschema structs.
Contributors (Alphabetical Order)
- Alex Akselrod
- Alex Sears
- Amin Bashiri
- Andras Banki-Horvath
- AtomicInnovation321
- bartoli
- BitcoinerCoderBob
- bitromortac
- bota87
- Bufo
- Calvin Zachman
- Carla Kirk-Cohen
- cristiantroy
- cuinix
- davisv7
- Elle Mouton
- ErikEk
- Eugene Siegel
- Feelancer21
- ffranr
- Hao Wang
- hidewrong
- Jesse de Wit
- João Thallis
- Jonathan Harvey-Buschel
- Joost Jager
- Jordi Montes
- Keagan McClelland
- kilrau
- mani2310
- Marcos Fernandez Perez
- Matt Morehouse
- Michael Rooke
- Mohamed Awnallah
- Olaoluwa Osuntokun
- Oliver Gugger
- Ononiwu Maureen Chiamaka
- Sam Korn
- saubyk
- Simone Ragonesi
- Slyghtning
- tdb3
- Tee8z
- testwill
- Thabokani
- threewebcode
- Tom Kirkpatrick
- Turtle
- twofaktor
- vuittont60
- w3irdrobot
- weiliy
- xiaoxianBoy
- Yong Yu
- zhiqiangxu
- Ziggie