LND v0.19.0-beta: RBF Cooperative Close, Improved Payment Reliability & More

The Lightning Network Daemon (LND) is a complete implementation of a Lightning Network node developed by Lightning Labs.

LND v0.19.0-beta: RBF Cooperative Close, Improved Payment Reliability & More
  • The newest LND release brings upgrades that empower developers with better on-chain management, significantly boost backend scalability for expanding services, and ensure a more seamless and dependable payment experience.
"We are excited to announce the release of LND v0.19.0 beta! This new release focuses on making LND more secure, scalable, and reliable for powering global bitcoin and stablecoin transactions," was announced in a blog post.
  • Some highlights of this release include a Replace-By-Fee Cooperative Close for flexible channel closure fees, migration of invoices to SQL for faster startups, enhanced payment reliability through improved pathfinding, transaction sweeper improvements, the addition of Testnet4 support for stable testing, among other things.
"As always, we are grateful for the ongoing support of our external contributors across development, review, and testing. A total of 51 developers contributed to this release. For the complete list of changes included in this release, check out the full release notes."

What's new

  • New RBF cooperative close flow. It uses RBF to enable either side to increase their fee rate using their own channel funds. Channel peers must support the option_simple_close for this new protocol to work. This new feature can be activated with a new config flag: --protocol.rbf-coop-close.
    • This feature isn't compatible with older LND versions; fee bumping with them uses CPFP. It already works with Eclair v0.12.0 or up, and should work with other implementations as they roll out support for this protocol. The protocol currently does not support Taproot channels and Taproot asset channels.
  • Support for archiving channel backups in a specific folder for future reference. It comes with a new config option, disable-backup-archive (default: false), to control whether previous backups are archived.
  • Support for experimental endorsement signal relay. Deployed experimentally to assist ongoing channel jamming research, it has no impact on routing.
  • Initial support for quiescence. This protocol gadget is required for upcoming Dynamic Commitments and Splicing features.
  • Historical Sync: Fixed a race condition blocking initial sync due to syncer's internal state handling.
  • Max Fee Rate is now respected during cooperative close initiation for both parties, not just the remote party.
  • Lots of other bug fixes.
  • Performance Improvements:
    • Limit outbound gossip traffic bandwidth with --gossip.msg-rate-bytes and --gossip.msg-rate-burst. Set burst to the maximum bytes transmittable without rate limiting, and rate to the ongoing permitted rate.
    • Ability to use ZSTD for log rotation.
    • Remove redundant iteration over a node's persisted channels when updating the graph cache with a new node or node update.
  • Functional Enhancements:
    • Add pagination for wallet transactions.
    • Make MaxWaitNumBlocksFundingConf configurable for faster test timeouts, with a default of 2016 blocks for production.
    • Change sweeper to attempt sweeps if the budget is partially covered, preventing delays and high fees.
    • Validate MPP parameters before payment to avoid path finding loops and timeouts.
  • Functional Updates:
    • Enable log compression with ZSTD using the logging.file.compressor argument.
    • Enhance SCB file with more data for last-resort rescue when a peer is unavailable.
    • Update channel.backup file at shutdown in LND.
    • Introduce chainio subsystem to sync subsystems with the current best block, fixing delays in HTLC sweeping due to block height discrepancies in ChainArbitrator, UtxoSweeper, and TxPublisher. Click here to learn more.
    • Sweeper now uses configured budget values for HTLCs with --sweeper.budget.deadlinehtlcratio and --sweeper.budget.deadlinehtlc.
    • Consider blockbeat dispatcher height when checking if lnd is synced to chain.
    • Allocate restricted slots for peers via --num-restricted-slots.
    • Added support for bitcoin testnet4.
    • Removed x/exp/maps dependency.
    • Add --no-disconnect-on-pong-failure option (default: false) to manage peer disconnection on pong failure or mismatch.
  • RPC Additions and Updates. Some RPCs that previously returned an empty response now provide a short status message to help command line users confirm successful execution or background initiation. The following CLI commands no longer return an empty response ({}):
      • lncli wallet releaseoutput (WalletKit.ReleaseOutput RPC)
      • lncli wallet accounts import-pubkey (WalletKit.ImportPublicKey RPC)
      • lncli wallet labeltx (WalletKit.LabelTransaction RPC)
      • lncli sendcustom (Lightning.SendCustomMessage RPC)
      • lncli connect (Lightning.ConnectPeer RPC)
      • lncli disconnect (Lightning.DisconnectPeer RPC)
      • lncli stop (Lightning.Stop RPC)
      • lncli deletepayments (Lightning.DeleteAllPaymentsResponse RPC)
      • lncli abandonchannel (Lightning.AbandonChannel RPC)
      • lncli restorechanbackup (Lightning.RestoreChannelBackups RPC)
      • lncli verifychanbackup (Lightning.VerifyChanBackup RPC)
    • The ForwardInterceptor's MODIFY option now merges custom range TLVs with existing HTLC records, overwriting conflicting values with API-supplied ones.
    • Make ProofMatureDelta in gossip configurable via --gossip.announcement-conf, defaulting to 6.
    • Add LockedIn boolean field to lnrpc.HTLC to show if an HTLC is locked in by the remote peer.
    • Allow custom lock ID and duration in FundPsbt RPC.
    • Extend lnrpc.RPCMiddlewareRequest to include gRPC metadata pairs from the initial request's context.Context.
    • Updated PendingSweeps to return all registered outputs in the RPC response, regardless of future locktime, enabling planning for upcoming sweeps and custom aggregation logic. Added MaturityHeight field to PendingSweep for absolute locktime value.
    • Add BumpForceCloseFee RPC endpoint, moving lncli functionality to LND for broader accessibility.
    • Enhance walletrpc.FundPsbt with an option to set fees as sat_per_kw for greater precision.
    • Add a new option in walletrpc.FundPsbt to specify the maximum fee-to-output amounts ratio.
    • Sort lnrpc.Invoice.Htlcs by InvoiceHTLC.HtlcIndex in the list invoices RPC response.
    • Set a default 60-second timeout for routerrpc.SendPaymentV2 when timeout_seconds is unset or 0.
    • Include custom_channel_data for custom channels in lnrpc.ClosedChannels response.
  • lncli updates and additions:
    • Allow pre-generated macaroon root key in lncli create and lncli createwatchonly for deterministic macaroon generation.
    • Add --sat_per_kw flag to lncli wallet fundpsbt for precise fee rate specification.
    • Include --max_fee_ratio argument in lncli wallet fundpsbt to set maximum fee-to-output amounts ratio.
    • Enhance lncli listchannels and lncli closedchannels output with human-readable short channel ID and BOLT02 channel ID; rename chan_id to scid for accuracy.
    • Initiate cooperative close flow in coop close case even with active HTLCs, disabling the channel for new HTLCs and starting the flow when no HTLCs remain.
    • Introduce macaroon constraint for IP range-based access restriction, expanding beyond specific IP allow/deny.
    • Added a command to load mission control data from lncli querymc, with a skip_confirmation flag for scripting support.
    • Correct an inaccurate error message previously shown when LND is built without a specific RPC service, but the CLI includes it. Instead of indicating the wallet is encrypted, the error now specifies the missing RPC server.
    • Improved the listchaintxns command with better input validation, enhanced error handling, added tests, and updated documentation.
Breaking Change (lncli only): lncli listchannels and closedchannels output updated. chan_id renamed to scid for short channel ID; chan_id now holds actual channel ID (BOLT02). Update scripts to use scid. RPC responses remain unchanged.
  • Code Health:
    • Retry Logic added for watchtower block fetching with max attempts and exponential back-off.
    • Profile Config has been moved to a dedicated group; old settings still work, will be removed later.
    • Structured Logging. Introduced with options to disable stdout/file logging (--logging.console.disable, --logging.file.disable), omit timestamps (--logging.console.no-timestamps, --logging.file.no-timestamps), include call-site (--logging.console.call-site, --logging.file.call-site), and style console logs (--logging.console.style under dev build).
    • Commit hash fingerprint is now added to log lines by default, disable with --logging.no-commit-hash.
"Note that this extra info will currently only appear in a few log lines, but more will be added in future as the structured logging change is propagated throughout LND."

Technical and Architectural Updates

  • BOLT Spec Updates: Added new lnwire messages for the Gossip 1.75 protocol.
  • Testing:
    • Feerate Estimator: LND now uses bitcoind or btcd's estimator in regtest/simnet modes if feeurl is not provided, replacing static estimator.
    • Integration Tests: CI optimized for faster execution; all flakes documented and fixed.
    • Unit Test Fix: Resolved a long-standing flake in chainntnfs/bitcoindnotify package.
    • New CI Step for basic backwards compatibility testing for each PR.
    • Integration Test fix: Corrected a flake leading to a "close of a closed channel" panic.
  • Database:
    • Move Neutrino data storage to postgres when running the backend in postgres mode.
    • Wallet DB: Temporarily reintroduced global lock for Postgres backend.
  • Code Health:
    • Graph DB Code: Moved from channeldb to graph/db package.
    • GoroutineManager API: Removed context from constructor.
    • Protofsm StateMachine: Updated to use new GoroutineManager API and structured logging.
    • Sweeper Refactor: Minor update for code quality; renamed internal state from Failed to Fatal for tracked inputs.
    • Sweeper Monitoring: Unified logic for monitoring input spending to handle missing inputs and recover after restart.
    • Min/Max helpers: Replaced with built-in min/max functions.
    • Map Copying: Refactored to use maps.Copy instead of manual copying.

Check the full release notes here.

Blog Post / Archive
GitHub Repo
Release Notes

Author: EZ
Liked the article?

Sign up for No Bullshit Bitcoin

No Bullshit Bitcoin Is a Bitcoin News Desk Without Ads, Paywalls, or Clickbait.

No spam. Unsubscribe anytime.

Leave a comment

Join 40 000+ fellow Bitcoiners!

Follow us on Nostr