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

lightningnetwork / lnd / 15951470896

29 Jun 2025 04:23AM UTC coverage: 67.594% (-0.01%) from 67.606%
15951470896

Pull #9751

github

web-flow
Merge 599d9b051 into 6290edf14
Pull Request #9751: multi: update Go to 1.23.10 and update some packages

135088 of 199851 relevant lines covered (67.59%)

21909.44 hits per line

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

72.73
/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

36
// encodeTCPAddr serializes a TCP address into its compact raw bytes
37
// representation.
38
func encodeTCPAddr(w io.Writer, addr *net.TCPAddr) error {
2,124✔
39
        var (
2,124✔
40
                addrType byte
2,124✔
41
                ip       []byte
2,124✔
42
        )
2,124✔
43

2,124✔
44
        if addr.IP.To4() != nil {
3,858✔
45
                addrType = byte(tcp4Addr)
1,734✔
46
                ip = addr.IP.To4()
1,734✔
47
        } else {
2,127✔
48
                addrType = byte(tcp6Addr)
393✔
49
                ip = addr.IP.To16()
393✔
50
        }
393✔
51

52
        if ip == nil {
2,128✔
53
                return fmt.Errorf("unable to encode IP %v", addr.IP)
4✔
54
        }
4✔
55

56
        if _, err := w.Write([]byte{addrType}); err != nil {
2,120✔
57
                return err
×
58
        }
×
59

60
        if _, err := w.Write(ip); err != nil {
2,120✔
61
                return err
×
62
        }
×
63

64
        var port [2]byte
2,120✔
65
        byteOrder.PutUint16(port[:], uint16(addr.Port))
2,120✔
66
        if _, err := w.Write(port[:]); err != nil {
2,120✔
67
                return err
×
68
        }
×
69

70
        return nil
2,120✔
71
}
72

73
// encodeOnionAddr serializes an onion address into its compact raw bytes
74
// representation.
75
func encodeOnionAddr(w io.Writer, addr *tor.OnionAddr) error {
212✔
76
        var suffixIndex int
212✔
77
        hostLen := len(addr.OnionService)
212✔
78
        switch hostLen {
212✔
79
        case tor.V2Len:
106✔
80
                if _, err := w.Write([]byte{byte(v2OnionAddr)}); err != nil {
106✔
81
                        return err
×
82
                }
×
83
                suffixIndex = tor.V2Len - tor.OnionSuffixLen
106✔
84
        case tor.V3Len:
108✔
85
                if _, err := w.Write([]byte{byte(v3OnionAddr)}); err != nil {
108✔
86
                        return err
×
87
                }
×
88
                suffixIndex = tor.V3Len - tor.OnionSuffixLen
108✔
89
        default:
1✔
90
                return errors.New("unknown onion service length")
1✔
91
        }
92

93
        suffix := addr.OnionService[suffixIndex:]
211✔
94
        if suffix != tor.OnionSuffix {
212✔
95
                return fmt.Errorf("invalid suffix \"%v\"", suffix)
1✔
96
        }
1✔
97

98
        host, err := tor.Base32Encoding.DecodeString(
210✔
99
                addr.OnionService[:suffixIndex],
210✔
100
        )
210✔
101
        if err != nil {
211✔
102
                return err
1✔
103
        }
1✔
104

105
        // Sanity check the decoded length.
106
        switch {
209✔
107
        case hostLen == tor.V2Len && len(host) != tor.V2DecodedLen:
×
108
                return fmt.Errorf("onion service %v decoded to invalid host %x",
×
109
                        addr.OnionService, host)
×
110

111
        case hostLen == tor.V3Len && len(host) != tor.V3DecodedLen:
×
112
                return fmt.Errorf("onion service %v decoded to invalid host %x",
×
113
                        addr.OnionService, host)
×
114
        }
115

116
        if _, err := w.Write(host); err != nil {
209✔
117
                return err
×
118
        }
×
119

120
        var port [2]byte
209✔
121
        byteOrder.PutUint16(port[:], uint16(addr.Port))
209✔
122
        if _, err := w.Write(port[:]); err != nil {
209✔
123
                return err
×
124
        }
×
125

126
        return nil
209✔
127
}
128

129
// encodeOpaqueAddrs serializes the lnwire.OpaqueAddrs type to a raw set of
130
// bytes that we will persist.
131
func encodeOpaqueAddrs(w io.Writer, addr *lnwire.OpaqueAddrs) error {
2✔
132
        // Write the type byte.
2✔
133
        if _, err := w.Write([]byte{byte(opaqueAddrs)}); err != nil {
2✔
134
                return err
×
135
        }
×
136

137
        // Write the length of the payload.
138
        var l [2]byte
2✔
139
        binary.BigEndian.PutUint16(l[:], uint16(len(addr.Payload)))
2✔
140
        if _, err := w.Write(l[:]); err != nil {
2✔
141
                return err
×
142
        }
×
143

144
        // Write the payload.
145
        _, err := w.Write(addr.Payload)
2✔
146

2✔
147
        return err
2✔
148
}
149

150
// DeserializeAddr reads the serialized raw representation of an address and
151
// deserializes it into the actual address. This allows us to avoid address
152
// resolution within the channeldb package.
153
func DeserializeAddr(r io.Reader) (net.Addr, error) {
11,303✔
154
        var addrType [1]byte
11,303✔
155
        if _, err := r.Read(addrType[:]); err != nil {
11,303✔
156
                return nil, err
×
157
        }
×
158

159
        var address net.Addr
11,303✔
160
        switch addressType(addrType[0]) {
11,303✔
161
        case tcp4Addr:
4,528✔
162
                var ip [4]byte
4,528✔
163
                if _, err := r.Read(ip[:]); err != nil {
4,528✔
164
                        return nil, err
×
165
                }
×
166

167
                var port [2]byte
4,528✔
168
                if _, err := r.Read(port[:]); err != nil {
4,528✔
169
                        return nil, err
×
170
                }
×
171

172
                address = &net.TCPAddr{
4,528✔
173
                        IP:   net.IP(ip[:]),
4,528✔
174
                        Port: int(binary.BigEndian.Uint16(port[:])),
4,528✔
175
                }
4,528✔
176

177
        case tcp6Addr:
6,567✔
178
                var ip [16]byte
6,567✔
179
                if _, err := r.Read(ip[:]); err != nil {
6,567✔
180
                        return nil, err
×
181
                }
×
182

183
                var port [2]byte
6,567✔
184
                if _, err := r.Read(port[:]); err != nil {
6,567✔
185
                        return nil, err
×
186
                }
×
187

188
                address = &net.TCPAddr{
6,567✔
189
                        IP:   net.IP(ip[:]),
6,567✔
190
                        Port: int(binary.BigEndian.Uint16(port[:])),
6,567✔
191
                }
6,567✔
192

193
        case v2OnionAddr:
107✔
194
                var h [tor.V2DecodedLen]byte
107✔
195
                if _, err := r.Read(h[:]); err != nil {
107✔
196
                        return nil, err
×
197
                }
×
198

199
                var p [2]byte
107✔
200
                if _, err := r.Read(p[:]); err != nil {
107✔
201
                        return nil, err
×
202
                }
×
203

204
                onionService := tor.Base32Encoding.EncodeToString(h[:])
107✔
205
                onionService += tor.OnionSuffix
107✔
206
                port := int(binary.BigEndian.Uint16(p[:]))
107✔
207

107✔
208
                address = &tor.OnionAddr{
107✔
209
                        OnionService: onionService,
107✔
210
                        Port:         port,
107✔
211
                }
107✔
212

213
        case v3OnionAddr:
107✔
214
                var h [tor.V3DecodedLen]byte
107✔
215
                if _, err := r.Read(h[:]); err != nil {
107✔
216
                        return nil, err
×
217
                }
×
218

219
                var p [2]byte
107✔
220
                if _, err := r.Read(p[:]); err != nil {
107✔
221
                        return nil, err
×
222
                }
×
223

224
                onionService := tor.Base32Encoding.EncodeToString(h[:])
107✔
225
                onionService += tor.OnionSuffix
107✔
226
                port := int(binary.BigEndian.Uint16(p[:]))
107✔
227

107✔
228
                address = &tor.OnionAddr{
107✔
229
                        OnionService: onionService,
107✔
230
                        Port:         port,
107✔
231
                }
107✔
232

233
        case opaqueAddrs:
3✔
234
                // Read the length of the payload.
3✔
235
                var l [2]byte
3✔
236
                if _, err := r.Read(l[:]); err != nil {
3✔
237
                        return nil, err
×
238
                }
×
239

240
                // Read the payload.
241
                payload := make([]byte, binary.BigEndian.Uint16(l[:]))
3✔
242
                if _, err := r.Read(payload); err != nil {
3✔
243
                        return nil, err
×
244
                }
×
245

246
                address = &lnwire.OpaqueAddrs{
3✔
247
                        Payload: payload,
3✔
248
                }
3✔
249

250
        default:
×
251
                return nil, ErrUnknownAddressType
×
252
        }
253

254
        return address, nil
11,303✔
255
}
256

257
// SerializeAddr serializes an address into its raw bytes representation so that
258
// it can be deserialized without requiring address resolution.
259
func SerializeAddr(w io.Writer, address net.Addr) error {
2,336✔
260
        switch addr := address.(type) {
2,336✔
261
        case *net.TCPAddr:
2,124✔
262
                return encodeTCPAddr(w, addr)
2,124✔
263
        case *tor.OnionAddr:
212✔
264
                return encodeOnionAddr(w, addr)
212✔
265
        case *lnwire.OpaqueAddrs:
2✔
266
                return encodeOpaqueAddrs(w, addr)
2✔
267
        default:
1✔
268
                return ErrUnknownAddressType
1✔
269
        }
270
}
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