7
7
"io"
8
8
"net"
9
9
10
+ "github.com/lightningnetwork/lnd/lnwire"
10
11
"github.com/lightningnetwork/lnd/tor"
11
12
)
12
13
@@ -26,6 +27,10 @@ const (
26
27
27
28
// v3OnionAddr denotes a version 3 Tor (prop224) onion service address.
28
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
29
34
)
30
35
31
36
// encodeTCPAddr serializes a TCP address into its compact raw bytes
@@ -121,6 +126,27 @@ func encodeOnionAddr(w io.Writer, addr *tor.OnionAddr) error {
121
126
return nil
122
127
}
123
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 {
132
+ // Write the type byte.
133
+ if _ , err := w .Write ([]byte {byte (opaqueAddrs )}); err != nil {
134
+ return err
135
+ }
136
+
137
+ // Write the length of the payload.
138
+ var l [2 ]byte
139
+ binary .BigEndian .PutUint16 (l [:], uint16 (len (addr .Payload )))
140
+ if _ , err := w .Write (l [:]); err != nil {
141
+ return err
142
+ }
143
+
144
+ // Write the payload.
145
+ _ , err := w .Write (addr .Payload )
146
+
147
+ return err
148
+ }
149
+
124
150
// DeserializeAddr reads the serialized raw representation of an address and
125
151
// deserializes it into the actual address. This allows us to avoid address
126
152
// resolution within the channeldb package.
@@ -147,6 +173,7 @@ func DeserializeAddr(r io.Reader) (net.Addr, error) {
147
173
IP : net .IP (ip [:]),
148
174
Port : int (binary .BigEndian .Uint16 (port [:])),
149
175
}
176
+
150
177
case tcp6Addr :
151
178
var ip [16 ]byte
152
179
if _ , err := r .Read (ip [:]); err != nil {
@@ -162,6 +189,7 @@ func DeserializeAddr(r io.Reader) (net.Addr, error) {
162
189
IP : net .IP (ip [:]),
163
190
Port : int (binary .BigEndian .Uint16 (port [:])),
164
191
}
192
+
165
193
case v2OnionAddr :
166
194
var h [tor .V2DecodedLen ]byte
167
195
if _ , err := r .Read (h [:]); err != nil {
@@ -181,6 +209,7 @@ func DeserializeAddr(r io.Reader) (net.Addr, error) {
181
209
OnionService : onionService ,
182
210
Port : port ,
183
211
}
212
+
184
213
case v3OnionAddr :
185
214
var h [tor .V3DecodedLen ]byte
186
215
if _ , err := r .Read (h [:]); err != nil {
@@ -200,6 +229,24 @@ func DeserializeAddr(r io.Reader) (net.Addr, error) {
200
229
OnionService : onionService ,
201
230
Port : port ,
202
231
}
232
+
233
+ case opaqueAddrs :
234
+ // Read the length of the payload.
235
+ var l [2 ]byte
236
+ if _ , err := r .Read (l [:]); err != nil {
237
+ return nil , err
238
+ }
239
+
240
+ // Read the payload.
241
+ payload := make ([]byte , binary .BigEndian .Uint16 (l [:]))
242
+ if _ , err := r .Read (payload ); err != nil {
243
+ return nil , err
244
+ }
245
+
246
+ address = & lnwire.OpaqueAddrs {
247
+ Payload : payload ,
248
+ }
249
+
203
250
default :
204
251
return nil , ErrUnknownAddressType
205
252
}
@@ -215,6 +262,8 @@ func SerializeAddr(w io.Writer, address net.Addr) error {
215
262
return encodeTCPAddr (w , addr )
216
263
case * tor.OnionAddr :
217
264
return encodeOnionAddr (w , addr )
265
+ case * lnwire.OpaqueAddrs :
266
+ return encodeOpaqueAddrs (w , addr )
218
267
default :
219
268
return ErrUnknownAddressType
220
269
}
0 commit comments