diff --git a/chanbackup/backup_test.go b/chanbackup/backup_test.go
index 46ccf4c24..d36fa385b 100644
--- a/chanbackup/backup_test.go
+++ b/chanbackup/backup_test.go
@@ -156,6 +156,8 @@ func TestFetchStaticChanBackups(t *testing.T) {
chanSource.chans[randomChan2.FundingOutpoint] = randomChan2
chanSource.addAddrsForNode(randomChan1.IdentityPub, []net.Addr{addr1})
chanSource.addAddrsForNode(randomChan2.IdentityPub, []net.Addr{addr2})
+ chanSource.addAddrsForNode(randomChan2.IdentityPub, []net.Addr{addr3})
+ chanSource.addAddrsForNode(randomChan2.IdentityPub, []net.Addr{addr4})
// With the channel source populated, we'll now attempt to create a set
// of backups for all the channels. This should succeed, as all items
diff --git a/chanbackup/multi_test.go b/chanbackup/multi_test.go
index a296f914e..3350c773c 100644
--- a/chanbackup/multi_test.go
+++ b/chanbackup/multi_test.go
@@ -22,7 +22,9 @@ func TestMultiPackUnpack(t *testing.T) {
t.Fatalf("unable to gen channel: %v", err)
}
- single := NewSingle(channel, []net.Addr{addr1, addr2})
+ single := NewSingle(
+ channel, []net.Addr{addr1, addr2, addr3, addr4},
+ )
originalSingles = append(originalSingles, single)
multi.StaticBackups = append(multi.StaticBackups, single)
diff --git a/chanbackup/single_test.go b/chanbackup/single_test.go
index 0fe402926..b3c7471a3 100644
--- a/chanbackup/single_test.go
+++ b/chanbackup/single_test.go
@@ -18,6 +18,7 @@ import (
"github.com/lightningnetwork/lnd/lnencrypt"
"github.com/lightningnetwork/lnd/lnwire"
"github.com/lightningnetwork/lnd/shachain"
+ "github.com/lightningnetwork/lnd/tor"
"github.com/stretchr/testify/require"
)
@@ -36,6 +37,15 @@ var (
addr1, _ = net.ResolveTCPAddr("tcp", "10.0.0.2:9000")
addr2, _ = net.ResolveTCPAddr("tcp", "10.0.0.3:9000")
+ addr3 = &tor.OnionAddr{
+ OnionService: "3g2upl4pq6kufc4m.onion",
+ Port: 9735,
+ }
+ addr4 = &lnwire.OpaqueAddrs{
+ // The first byte must be an address type we are not yet aware
+ // of for it to be a valid OpaqueAddrs.
+ Payload: []byte{math.MaxUint8, 1, 2, 3, 4},
+ }
)
func assertSingleEqual(t *testing.T, a, b Single) {
@@ -309,7 +319,9 @@ func TestSinglePackUnpack(t *testing.T) {
channel, err := genRandomOpenChannelShell()
require.NoError(t, err, "unable to gen open channel")
- singleChanBackup := NewSingle(channel, []net.Addr{addr1, addr2})
+ singleChanBackup := NewSingle(
+ channel, []net.Addr{addr1, addr2, addr3, addr4},
+ )
keyRing := &lnencrypt.MockKeyRing{}
@@ -634,7 +646,9 @@ func TestSingleUnconfirmedChannel(t *testing.T) {
channel.ShortChannelID.BlockHeight = 0
channel.FundingBroadcastHeight = fundingBroadcastHeight
- singleChanBackup := NewSingle(channel, []net.Addr{addr1, addr2})
+ singleChanBackup := NewSingle(
+ channel, []net.Addr{addr1, addr2, addr3, addr4},
+ )
keyRing := &lnencrypt.MockKeyRing{}
// Pack it and then unpack it again to make sure everything is written
diff --git a/docs/release-notes/release-notes-0.19.1.md b/docs/release-notes/release-notes-0.19.1.md
new file mode 100644
index 000000000..dd3557db8
--- /dev/null
+++ b/docs/release-notes/release-notes-0.19.1.md
@@ -0,0 +1,80 @@
+# Release Notes
+- [Bug Fixes](#bug-fixes)
+- [New Features](#new-features)
+ - [Functional Enhancements](#functional-enhancements)
+ - [RPC Additions](#rpc-additions)
+ - [lncli Additions](#lncli-additions)
+- [Improvements](#improvements)
+ - [Functional Updates](#functional-updates)
+ - [RPC Updates](#rpc-updates)
+ - [lncli Updates](#lncli-updates)
+ - [Breaking Changes](#breaking-changes)
+ - [Performance Improvements](#performance-improvements)
+ - [Deprecations](#deprecations)
+- [Technical and Architectural Updates](#technical-and-architectural-updates)
+ - [BOLT Spec Updates](#bolt-spec-updates)
+ - [Testing](#testing)
+ - [Database](#database)
+ - [Code Health](#code-health)
+ - [Tooling and Documentation](#tooling-and-documentation)
+
+# Bug Fixes
+
+* [Fix a serialisation bug](https://github.com/lightningnetwork/lnd/pull/9856)
+ that would occur when an attempt was made to write a backup file for a channel
+ peer that has advertised an address that we do not yet know how to parse.
+
+# New Features
+
+## Functional Enhancements
+
+## RPC Additions
+
+## lncli Additions
+
+# Improvements
+## Functional Updates
+
+## RPC Updates
+
+## lncli Updates
+
+## Code Health
+
+## 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`](https://lightning.engineering/api-docs/api/lnd/lightning/send-to-route/index.html)
[`routerrpc.SendToRoute`](https://lightning.engineering/api-docs/api/lnd/router/send-to-route/) | ❌ (No direct REST equivalent) | — | — | [`routerrpc.SendToRouteV2`](https://lightning.engineering/api-docs/api/lnd/router/send-to-route-v2/) |
+| [`lnrpc.SendPayment`](https://lightning.engineering/api-docs/api/lnd/lightning/send-payment/)
[`routerrpc.SendPayment`](https://lightning.engineering/api-docs/api/lnd/router/send-payment/) | ✅ | `POST` | `/v1/channels/transaction-stream` | [`routerrpc.SendPaymentV2`](https://lightning.engineering/api-docs/api/lnd/router/send-payment-v2/index.html) |
+| [`lnrpc.SendToRouteSync`](https://lightning.engineering/api-docs/api/lnd/lightning/send-to-route-sync/index.html) | ✅ | `POST` | `/v1/channels/transactions/route` | [`routerrpc.SendToRouteV2`](https://lightning.engineering/api-docs/api/lnd/router/send-to-route-v2/) |
+| [`lnrpc.SendPaymentSync`](https://lightning.engineering/api-docs/api/lnd/lightning/send-payment-sync/index.html) | ✅ | `POST` | `/v1/channels/transactions` | [`routerrpc.SendPaymentV2`](https://lightning.engineering/api-docs/api/lnd/router/send-payment-v2/index.html) |
+| [`router.TrackPayment`](https://lightning.engineering/api-docs/api/lnd/router/track-payment/index.html) | ❌ (No direct REST equivalent) | — | — | [`routerrpc.TrackPaymentV2`](https://lightning.engineering/api-docs/api/lnd/router/track-payment-v2/) |
+
+🚨 **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`](https://lightning.engineering/api-docs/api/lnd/router/send-to-route-v2/) | ✅ | `POST` | `/v2/router/route/send` |
+| [`routerrpc.SendPaymentV2`](https://lightning.engineering/api-docs/api/lnd/router/send-payment-v2/index.html) | ✅ | `POST` | `/v2/router/send` |
+| [`routerrpc.TrackPaymentV2`](https://lightning.engineering/api-docs/api/lnd/router/track-payment-v2/) | ✅ | `GET` | `/v2/router/track/{payment_hash}` |
+
+# Technical and Architectural Updates
+## BOLT Spec Updates
+
+## Testing
+
+## Database
+
+## Code Health
+
+## Tooling and Documentation
+
+# Contributors (Alphabetical Order)
+
+* Elle Mouton
diff --git a/lnwire/lnwire.go b/lnwire/lnwire.go
index 4d2b814e5..fa43d25bf 100644
--- a/lnwire/lnwire.go
+++ b/lnwire/lnwire.go
@@ -339,76 +339,17 @@ func WriteElement(w *bytes.Buffer, element interface{}) error {
}
case *net.TCPAddr:
- if e == nil {
- return fmt.Errorf("cannot write nil TCPAddr")
- }
-
- if e.IP.To4() != nil {
- var descriptor [1]byte
- descriptor[0] = uint8(tcp4Addr)
- if _, err := w.Write(descriptor[:]); err != nil {
- return err
- }
-
- var ip [4]byte
- copy(ip[:], e.IP.To4())
- if _, err := w.Write(ip[:]); err != nil {
- return err
- }
- } else {
- var descriptor [1]byte
- descriptor[0] = uint8(tcp6Addr)
- if _, err := w.Write(descriptor[:]); err != nil {
- return err
- }
- var ip [16]byte
- copy(ip[:], e.IP.To16())
- if _, err := w.Write(ip[:]); err != nil {
- return err
- }
- }
- var port [2]byte
- binary.BigEndian.PutUint16(port[:], uint16(e.Port))
- if _, err := w.Write(port[:]); err != nil {
+ if err := WriteTCPAddr(w, e); err != nil {
return err
}
case *tor.OnionAddr:
- if e == nil {
- return errors.New("cannot write nil onion address")
- }
-
- var suffixIndex int
- switch len(e.OnionService) {
- case tor.V2Len:
- descriptor := []byte{byte(v2OnionAddr)}
- if _, err := w.Write(descriptor); err != nil {
- return err
- }
- suffixIndex = tor.V2Len - tor.OnionSuffixLen
- case tor.V3Len:
- descriptor := []byte{byte(v3OnionAddr)}
- if _, err := w.Write(descriptor); err != nil {
- return err
- }
- suffixIndex = tor.V3Len - tor.OnionSuffixLen
- default:
- return errors.New("unknown onion service length")
- }
-
- host, err := tor.Base32Encoding.DecodeString(
- e.OnionService[:suffixIndex],
- )
- if err != nil {
- return err
- }
- if _, err := w.Write(host); err != nil {
+ if err := WriteOnionAddr(w, e); err != nil {
return err
}
- var port [2]byte
- binary.BigEndian.PutUint16(port[:], uint16(e.Port))
- if _, err := w.Write(port[:]); err != nil {
+ case *OpaqueAddrs:
+ if err := WriteOpaqueAddrs(w, e); err != nil {
return err
}