Skip to content

Commit 5c324c7

Browse files
authored
Merge pull request #9856 from ellemouton/writeOpaqueAddr
lnwire: add lnwire.OpaqueAddr case in WriteElement for channel back-ups
2 parents dc946ae + 9d54dbc commit 5c324c7

File tree

5 files changed

+105
-66
lines changed

5 files changed

+105
-66
lines changed

chanbackup/backup_test.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,8 @@ func TestFetchStaticChanBackups(t *testing.T) {
156156
chanSource.chans[randomChan2.FundingOutpoint] = randomChan2
157157
chanSource.addAddrsForNode(randomChan1.IdentityPub, []net.Addr{addr1})
158158
chanSource.addAddrsForNode(randomChan2.IdentityPub, []net.Addr{addr2})
159+
chanSource.addAddrsForNode(randomChan2.IdentityPub, []net.Addr{addr3})
160+
chanSource.addAddrsForNode(randomChan2.IdentityPub, []net.Addr{addr4})
159161

160162
// With the channel source populated, we'll now attempt to create a set
161163
// of backups for all the channels. This should succeed, as all items

chanbackup/multi_test.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,9 @@ func TestMultiPackUnpack(t *testing.T) {
2222
t.Fatalf("unable to gen channel: %v", err)
2323
}
2424

25-
single := NewSingle(channel, []net.Addr{addr1, addr2})
25+
single := NewSingle(
26+
channel, []net.Addr{addr1, addr2, addr3, addr4},
27+
)
2628

2729
originalSingles = append(originalSingles, single)
2830
multi.StaticBackups = append(multi.StaticBackups, single)

chanbackup/single_test.go

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import (
1818
"github.com/lightningnetwork/lnd/lnencrypt"
1919
"github.com/lightningnetwork/lnd/lnwire"
2020
"github.com/lightningnetwork/lnd/shachain"
21+
"github.com/lightningnetwork/lnd/tor"
2122
"github.com/stretchr/testify/require"
2223
)
2324

@@ -36,6 +37,15 @@ var (
3637

3738
addr1, _ = net.ResolveTCPAddr("tcp", "10.0.0.2:9000")
3839
addr2, _ = net.ResolveTCPAddr("tcp", "10.0.0.3:9000")
40+
addr3 = &tor.OnionAddr{
41+
OnionService: "3g2upl4pq6kufc4m.onion",
42+
Port: 9735,
43+
}
44+
addr4 = &lnwire.OpaqueAddrs{
45+
// The first byte must be an address type we are not yet aware
46+
// of for it to be a valid OpaqueAddrs.
47+
Payload: []byte{math.MaxUint8, 1, 2, 3, 4},
48+
}
3949
)
4050

4151
func assertSingleEqual(t *testing.T, a, b Single) {
@@ -309,7 +319,9 @@ func TestSinglePackUnpack(t *testing.T) {
309319
channel, err := genRandomOpenChannelShell()
310320
require.NoError(t, err, "unable to gen open channel")
311321

312-
singleChanBackup := NewSingle(channel, []net.Addr{addr1, addr2})
322+
singleChanBackup := NewSingle(
323+
channel, []net.Addr{addr1, addr2, addr3, addr4},
324+
)
313325

314326
keyRing := &lnencrypt.MockKeyRing{}
315327

@@ -634,7 +646,9 @@ func TestSingleUnconfirmedChannel(t *testing.T) {
634646
channel.ShortChannelID.BlockHeight = 0
635647
channel.FundingBroadcastHeight = fundingBroadcastHeight
636648

637-
singleChanBackup := NewSingle(channel, []net.Addr{addr1, addr2})
649+
singleChanBackup := NewSingle(
650+
channel, []net.Addr{addr1, addr2, addr3, addr4},
651+
)
638652
keyRing := &lnencrypt.MockKeyRing{}
639653

640654
// Pack it and then unpack it again to make sure everything is written
Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
# Release Notes
2+
- [Bug Fixes](#bug-fixes)
3+
- [New Features](#new-features)
4+
- [Functional Enhancements](#functional-enhancements)
5+
- [RPC Additions](#rpc-additions)
6+
- [lncli Additions](#lncli-additions)
7+
- [Improvements](#improvements)
8+
- [Functional Updates](#functional-updates)
9+
- [RPC Updates](#rpc-updates)
10+
- [lncli Updates](#lncli-updates)
11+
- [Breaking Changes](#breaking-changes)
12+
- [Performance Improvements](#performance-improvements)
13+
- [Deprecations](#deprecations)
14+
- [Technical and Architectural Updates](#technical-and-architectural-updates)
15+
- [BOLT Spec Updates](#bolt-spec-updates)
16+
- [Testing](#testing)
17+
- [Database](#database)
18+
- [Code Health](#code-health)
19+
- [Tooling and Documentation](#tooling-and-documentation)
20+
21+
# Bug Fixes
22+
23+
* [Fix a serialisation bug](https://github.com/lightningnetwork/lnd/pull/9856)
24+
that would occur when an attempt was made to write a backup file for a channel
25+
peer that has advertised an address that we do not yet know how to parse.
26+
27+
# New Features
28+
29+
## Functional Enhancements
30+
31+
## RPC Additions
32+
33+
## lncli Additions
34+
35+
# Improvements
36+
## Functional Updates
37+
38+
## RPC Updates
39+
40+
## lncli Updates
41+
42+
## Code Health
43+
44+
## Breaking Changes
45+
## Performance Improvements
46+
47+
## Deprecations
48+
49+
### ⚠️ **Warning:** The following RPCs will be removed in release version **0.21**:
50+
51+
| Deprecated RPC Method | REST Equivalent | HTTP Method | Path | Replaced By |
52+
|----------------------|----------------|-------------|------------------------------|------------------|
53+
| [`lnrpc.SendToRoute`](https://lightning.engineering/api-docs/api/lnd/lightning/send-to-route/index.html) <br> [`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/) |
54+
| [`lnrpc.SendPayment`](https://lightning.engineering/api-docs/api/lnd/lightning/send-payment/) <br> [`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) |
55+
| [`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/) |
56+
| [`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) |
57+
| [`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/) |
58+
59+
🚨 **Users are strongly encouraged** to transition to the new **V2 methods** before release **0.21** to ensure compatibility:
60+
61+
| New RPC Method | REST Equivalent | HTTP Method | Path |
62+
|---------------|----------------|-------------|------------------------|
63+
| [`routerrpc.SendToRouteV2`](https://lightning.engineering/api-docs/api/lnd/router/send-to-route-v2/) || `POST` | `/v2/router/route/send` |
64+
| [`routerrpc.SendPaymentV2`](https://lightning.engineering/api-docs/api/lnd/router/send-payment-v2/index.html) || `POST` | `/v2/router/send` |
65+
| [`routerrpc.TrackPaymentV2`](https://lightning.engineering/api-docs/api/lnd/router/track-payment-v2/) || `GET` | `/v2/router/track/{payment_hash}` |
66+
67+
# Technical and Architectural Updates
68+
## BOLT Spec Updates
69+
70+
## Testing
71+
72+
## Database
73+
74+
## Code Health
75+
76+
## Tooling and Documentation
77+
78+
# Contributors (Alphabetical Order)
79+
80+
* Elle Mouton

lnwire/lnwire.go

Lines changed: 4 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -339,76 +339,17 @@ func WriteElement(w *bytes.Buffer, element interface{}) error {
339339
}
340340

341341
case *net.TCPAddr:
342-
if e == nil {
343-
return fmt.Errorf("cannot write nil TCPAddr")
344-
}
345-
346-
if e.IP.To4() != nil {
347-
var descriptor [1]byte
348-
descriptor[0] = uint8(tcp4Addr)
349-
if _, err := w.Write(descriptor[:]); err != nil {
350-
return err
351-
}
352-
353-
var ip [4]byte
354-
copy(ip[:], e.IP.To4())
355-
if _, err := w.Write(ip[:]); err != nil {
356-
return err
357-
}
358-
} else {
359-
var descriptor [1]byte
360-
descriptor[0] = uint8(tcp6Addr)
361-
if _, err := w.Write(descriptor[:]); err != nil {
362-
return err
363-
}
364-
var ip [16]byte
365-
copy(ip[:], e.IP.To16())
366-
if _, err := w.Write(ip[:]); err != nil {
367-
return err
368-
}
369-
}
370-
var port [2]byte
371-
binary.BigEndian.PutUint16(port[:], uint16(e.Port))
372-
if _, err := w.Write(port[:]); err != nil {
342+
if err := WriteTCPAddr(w, e); err != nil {
373343
return err
374344
}
375345

376346
case *tor.OnionAddr:
377-
if e == nil {
378-
return errors.New("cannot write nil onion address")
379-
}
380-
381-
var suffixIndex int
382-
switch len(e.OnionService) {
383-
case tor.V2Len:
384-
descriptor := []byte{byte(v2OnionAddr)}
385-
if _, err := w.Write(descriptor); err != nil {
386-
return err
387-
}
388-
suffixIndex = tor.V2Len - tor.OnionSuffixLen
389-
case tor.V3Len:
390-
descriptor := []byte{byte(v3OnionAddr)}
391-
if _, err := w.Write(descriptor); err != nil {
392-
return err
393-
}
394-
suffixIndex = tor.V3Len - tor.OnionSuffixLen
395-
default:
396-
return errors.New("unknown onion service length")
397-
}
398-
399-
host, err := tor.Base32Encoding.DecodeString(
400-
e.OnionService[:suffixIndex],
401-
)
402-
if err != nil {
403-
return err
404-
}
405-
if _, err := w.Write(host); err != nil {
347+
if err := WriteOnionAddr(w, e); err != nil {
406348
return err
407349
}
408350

409-
var port [2]byte
410-
binary.BigEndian.PutUint16(port[:], uint16(e.Port))
411-
if _, err := w.Write(port[:]); err != nil {
351+
case *OpaqueAddrs:
352+
if err := WriteOpaqueAddrs(w, e); err != nil {
412353
return err
413354
}
414355

0 commit comments

Comments
 (0)