• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

lightningnetwork / lnd / 17832014233

18 Sep 2025 02:30PM UTC coverage: 57.196% (-9.4%) from 66.637%
17832014233

Pull #10133

github

web-flow
Merge 3e12b2767 into b34fc964b
Pull Request #10133: Add `XFindBaseLocalChanAlias` RPC

20 of 34 new or added lines in 4 files covered. (58.82%)

28528 existing lines in 459 files now uncovered.

99371 of 173739 relevant lines covered (57.2%)

1.78 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

46.01
/graph/db/addr.go
1
package graphdb
2

3
import (
4
        "encoding/binary"
5
        "errors"
6
        "fmt"
7
        "io"
8
        "net"
9

10
        "github.com/lightningnetwork/lnd/lnwire"
11
        "github.com/lightningnetwork/lnd/tor"
12
)
13

14
// addressType specifies the network protocol and version that should be used
15
// when connecting to a node at a particular address.
16
type addressType uint8
17

18
const (
19
        // tcp4Addr denotes an IPv4 TCP address.
20
        tcp4Addr addressType = 0
21

22
        // tcp6Addr denotes an IPv6 TCP address.
23
        tcp6Addr addressType = 1
24

25
        // v2OnionAddr denotes a version 2 Tor onion service address.
26
        v2OnionAddr addressType = 2
27

28
        // v3OnionAddr denotes a version 3 Tor (prop224) onion service address.
29
        v3OnionAddr addressType = 3
30

31
        // opaqueAddrs denotes an address (or a set of addresses) that LND was
32
        // not able to parse since LND is not yet aware of the address type.
33
        opaqueAddrs addressType = 4
34

35
        // dnsAddr denotes a DNS address type.
36
        dnsAddr addressType = 5
37
)
38

39
// encodeDNSAddr encodes a DNS address.
UNCOV
40
func encodeDNSAddr(w io.Writer, addr *lnwire.DNSAddress) error {
×
UNCOV
41
        if _, err := w.Write([]byte{byte(dnsAddr)}); err != nil {
×
42
                return err
×
43
        }
×
44

45
        // Write the length of the hostname.
UNCOV
46
        hostLen := len(addr.Hostname)
×
UNCOV
47
        if _, err := w.Write([]byte{byte(hostLen)}); err != nil {
×
48
                return err
×
49
        }
×
50

UNCOV
51
        if _, err := w.Write([]byte(addr.Hostname)); err != nil {
×
52
                return err
×
53
        }
×
54

UNCOV
55
        var port [2]byte
×
UNCOV
56
        byteOrder.PutUint16(port[:], addr.Port)
×
UNCOV
57
        if _, err := w.Write(port[:]); err != nil {
×
58
                return err
×
59
        }
×
60

UNCOV
61
        return nil
×
62
}
63

64
// encodeTCPAddr serializes a TCP address into its compact raw bytes
65
// representation.
66
func encodeTCPAddr(w io.Writer, addr *net.TCPAddr) error {
3✔
67
        var (
3✔
68
                addrType byte
3✔
69
                ip       []byte
3✔
70
        )
3✔
71

3✔
72
        if addr.IP.To4() != nil {
6✔
73
                addrType = byte(tcp4Addr)
3✔
74
                ip = addr.IP.To4()
3✔
75
        } else {
6✔
76
                addrType = byte(tcp6Addr)
3✔
77
                ip = addr.IP.To16()
3✔
78
        }
3✔
79

80
        if ip == nil {
3✔
UNCOV
81
                return fmt.Errorf("unable to encode IP %v", addr.IP)
×
UNCOV
82
        }
×
83

84
        if _, err := w.Write([]byte{addrType}); err != nil {
3✔
85
                return err
×
86
        }
×
87

88
        if _, err := w.Write(ip); err != nil {
3✔
89
                return err
×
90
        }
×
91

92
        var port [2]byte
3✔
93
        byteOrder.PutUint16(port[:], uint16(addr.Port))
3✔
94
        if _, err := w.Write(port[:]); err != nil {
3✔
95
                return err
×
96
        }
×
97

98
        return nil
3✔
99
}
100

101
// encodeOnionAddr serializes an onion address into its compact raw bytes
102
// representation.
103
func encodeOnionAddr(w io.Writer, addr *tor.OnionAddr) error {
3✔
104
        var suffixIndex int
3✔
105
        hostLen := len(addr.OnionService)
3✔
106
        switch hostLen {
3✔
107
        case tor.V2Len:
3✔
108
                if _, err := w.Write([]byte{byte(v2OnionAddr)}); err != nil {
3✔
109
                        return err
×
110
                }
×
111
                suffixIndex = tor.V2Len - tor.OnionSuffixLen
3✔
112
        case tor.V3Len:
3✔
113
                if _, err := w.Write([]byte{byte(v3OnionAddr)}); err != nil {
3✔
114
                        return err
×
115
                }
×
116
                suffixIndex = tor.V3Len - tor.OnionSuffixLen
3✔
UNCOV
117
        default:
×
UNCOV
118
                return errors.New("unknown onion service length")
×
119
        }
120

121
        suffix := addr.OnionService[suffixIndex:]
3✔
122
        if suffix != tor.OnionSuffix {
3✔
UNCOV
123
                return fmt.Errorf("invalid suffix \"%v\"", suffix)
×
UNCOV
124
        }
×
125

126
        host, err := tor.Base32Encoding.DecodeString(
3✔
127
                addr.OnionService[:suffixIndex],
3✔
128
        )
3✔
129
        if err != nil {
3✔
UNCOV
130
                return err
×
UNCOV
131
        }
×
132

133
        // Sanity check the decoded length.
134
        switch {
3✔
135
        case hostLen == tor.V2Len && len(host) != tor.V2DecodedLen:
×
136
                return fmt.Errorf("onion service %v decoded to invalid host %x",
×
137
                        addr.OnionService, host)
×
138

139
        case hostLen == tor.V3Len && len(host) != tor.V3DecodedLen:
×
140
                return fmt.Errorf("onion service %v decoded to invalid host %x",
×
141
                        addr.OnionService, host)
×
142
        }
143

144
        if _, err := w.Write(host); err != nil {
3✔
145
                return err
×
146
        }
×
147

148
        var port [2]byte
3✔
149
        byteOrder.PutUint16(port[:], uint16(addr.Port))
3✔
150
        if _, err := w.Write(port[:]); err != nil {
3✔
151
                return err
×
152
        }
×
153

154
        return nil
3✔
155
}
156

157
// encodeOpaqueAddrs serializes the lnwire.OpaqueAddrs type to a raw set of
158
// bytes that we will persist.
UNCOV
159
func encodeOpaqueAddrs(w io.Writer, addr *lnwire.OpaqueAddrs) error {
×
UNCOV
160
        // Write the type byte.
×
UNCOV
161
        if _, err := w.Write([]byte{byte(opaqueAddrs)}); err != nil {
×
162
                return err
×
163
        }
×
164

165
        // Write the length of the payload.
UNCOV
166
        var l [2]byte
×
UNCOV
167
        binary.BigEndian.PutUint16(l[:], uint16(len(addr.Payload)))
×
UNCOV
168
        if _, err := w.Write(l[:]); err != nil {
×
169
                return err
×
170
        }
×
171

172
        // Write the payload.
UNCOV
173
        _, err := w.Write(addr.Payload)
×
UNCOV
174

×
UNCOV
175
        return err
×
176
}
177

178
// DeserializeAddr reads the serialized raw representation of an address and
179
// deserializes it into the actual address. This allows us to avoid address
180
// resolution within the channeldb package.
181
func DeserializeAddr(r io.Reader) (net.Addr, error) {
3✔
182
        var addrType [1]byte
3✔
183
        if _, err := r.Read(addrType[:]); err != nil {
3✔
184
                return nil, err
×
185
        }
×
186

187
        var address net.Addr
3✔
188
        switch addressType(addrType[0]) {
3✔
189
        case tcp4Addr:
3✔
190
                var ip [4]byte
3✔
191
                if _, err := r.Read(ip[:]); err != nil {
3✔
192
                        return nil, err
×
193
                }
×
194

195
                var port [2]byte
3✔
196
                if _, err := r.Read(port[:]); err != nil {
3✔
197
                        return nil, err
×
198
                }
×
199

200
                address = &net.TCPAddr{
3✔
201
                        IP:   net.IP(ip[:]),
3✔
202
                        Port: int(binary.BigEndian.Uint16(port[:])),
3✔
203
                }
3✔
204

205
        case tcp6Addr:
3✔
206
                var ip [16]byte
3✔
207
                if _, err := r.Read(ip[:]); err != nil {
3✔
208
                        return nil, err
×
209
                }
×
210

211
                var port [2]byte
3✔
212
                if _, err := r.Read(port[:]); err != nil {
3✔
213
                        return nil, err
×
214
                }
×
215

216
                address = &net.TCPAddr{
3✔
217
                        IP:   net.IP(ip[:]),
3✔
218
                        Port: int(binary.BigEndian.Uint16(port[:])),
3✔
219
                }
3✔
220

221
        case v2OnionAddr:
3✔
222
                var h [tor.V2DecodedLen]byte
3✔
223
                if _, err := r.Read(h[:]); err != nil {
3✔
224
                        return nil, err
×
225
                }
×
226

227
                var p [2]byte
3✔
228
                if _, err := r.Read(p[:]); err != nil {
3✔
229
                        return nil, err
×
230
                }
×
231

232
                onionService := tor.Base32Encoding.EncodeToString(h[:])
3✔
233
                onionService += tor.OnionSuffix
3✔
234
                port := int(binary.BigEndian.Uint16(p[:]))
3✔
235

3✔
236
                address = &tor.OnionAddr{
3✔
237
                        OnionService: onionService,
3✔
238
                        Port:         port,
3✔
239
                }
3✔
240

241
        case v3OnionAddr:
3✔
242
                var h [tor.V3DecodedLen]byte
3✔
243
                if _, err := r.Read(h[:]); err != nil {
3✔
244
                        return nil, err
×
245
                }
×
246

247
                var p [2]byte
3✔
248
                if _, err := r.Read(p[:]); err != nil {
3✔
249
                        return nil, err
×
250
                }
×
251

252
                onionService := tor.Base32Encoding.EncodeToString(h[:])
3✔
253
                onionService += tor.OnionSuffix
3✔
254
                port := int(binary.BigEndian.Uint16(p[:]))
3✔
255

3✔
256
                address = &tor.OnionAddr{
3✔
257
                        OnionService: onionService,
3✔
258
                        Port:         port,
3✔
259
                }
3✔
260

UNCOV
261
        case dnsAddr:
×
UNCOV
262
                // Read the length of the hostname.
×
UNCOV
263
                var hostLen [1]byte
×
UNCOV
264
                if _, err := r.Read(hostLen[:]); err != nil {
×
265
                        return nil, err
×
266
                }
×
267

268
                // Read the hostname.
UNCOV
269
                hostname := make([]byte, hostLen[0])
×
UNCOV
270
                if _, err := r.Read(hostname); err != nil {
×
271
                        return nil, err
×
272
                }
×
273

274
                // Read the port.
UNCOV
275
                var port [2]byte
×
UNCOV
276
                if _, err := r.Read(port[:]); err != nil {
×
277
                        return nil, err
×
278
                }
×
279

UNCOV
280
                address = &lnwire.DNSAddress{
×
UNCOV
281
                        Hostname: string(hostname),
×
UNCOV
282
                        Port:     binary.BigEndian.Uint16(port[:]),
×
UNCOV
283
                }
×
284

UNCOV
285
        case opaqueAddrs:
×
UNCOV
286
                // Read the length of the payload.
×
UNCOV
287
                var l [2]byte
×
UNCOV
288
                if _, err := r.Read(l[:]); err != nil {
×
289
                        return nil, err
×
290
                }
×
291

292
                // Read the payload.
UNCOV
293
                payload := make([]byte, binary.BigEndian.Uint16(l[:]))
×
UNCOV
294
                if _, err := r.Read(payload); err != nil {
×
295
                        return nil, err
×
296
                }
×
297

UNCOV
298
                address = &lnwire.OpaqueAddrs{
×
UNCOV
299
                        Payload: payload,
×
UNCOV
300
                }
×
301

302
        default:
×
303
                return nil, ErrUnknownAddressType
×
304
        }
305

306
        return address, nil
3✔
307
}
308

309
// SerializeAddr serializes an address into its raw bytes representation so that
310
// it can be deserialized without requiring address resolution.
311
func SerializeAddr(w io.Writer, address net.Addr) error {
3✔
312
        switch addr := address.(type) {
3✔
313
        case *net.TCPAddr:
3✔
314
                return encodeTCPAddr(w, addr)
3✔
315
        case *tor.OnionAddr:
3✔
316
                return encodeOnionAddr(w, addr)
3✔
UNCOV
317
        case *lnwire.OpaqueAddrs:
×
UNCOV
318
                return encodeOpaqueAddrs(w, addr)
×
UNCOV
319
        case *lnwire.DNSAddress:
×
UNCOV
320
                return encodeDNSAddr(w, addr)
×
UNCOV
321
        default:
×
UNCOV
322
                return ErrUnknownAddressType
×
323
        }
324
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc