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

lightningnetwork / lnd / 13586005509

28 Feb 2025 10:14AM UTC coverage: 68.629% (+9.9%) from 58.77%
13586005509

Pull #9521

github

web-flow
Merge 37d3a70a5 into 8532955b3
Pull Request #9521: unit: remove GOACC, use Go 1.20 native coverage functionality

129950 of 189351 relevant lines covered (68.63%)

23726.46 hits per line

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

55.76
/channeldb/codec.go
1
package channeldb
2

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

10
        "github.com/btcsuite/btcd/btcec/v2"
11
        "github.com/btcsuite/btcd/btcutil"
12
        "github.com/btcsuite/btcd/chaincfg/chainhash"
13
        "github.com/btcsuite/btcd/wire"
14
        graphdb "github.com/lightningnetwork/lnd/graph/db"
15
        "github.com/lightningnetwork/lnd/keychain"
16
        "github.com/lightningnetwork/lnd/lnwire"
17
        "github.com/lightningnetwork/lnd/shachain"
18
        "github.com/lightningnetwork/lnd/tlv"
19
)
20

21
// UnknownElementType is an error returned when the codec is unable to encode or
22
// decode a particular type.
23
type UnknownElementType struct {
24
        method  string
25
        element interface{}
26
}
27

28
// NewUnknownElementType creates a new UnknownElementType error from the passed
29
// method name and element.
30
func NewUnknownElementType(method string, el interface{}) UnknownElementType {
×
31
        return UnknownElementType{method: method, element: el}
×
32
}
×
33

34
// Error returns the name of the method that encountered the error, as well as
35
// the type that was unsupported.
36
func (e UnknownElementType) Error() string {
×
37
        return fmt.Sprintf("Unknown type in %s: %T", e.method, e.element)
×
38
}
×
39

40
// WriteElement is a one-stop shop to write the big endian representation of
41
// any element which is to be serialized for storage on disk. The passed
42
// io.Writer should be backed by an appropriately sized byte slice, or be able
43
// to dynamically expand to accommodate additional data.
44
func WriteElement(w io.Writer, element interface{}) error {
1,057,031✔
45
        switch e := element.(type) {
1,057,031✔
46
        case keychain.KeyDescriptor:
33,248✔
47
                if err := binary.Write(w, byteOrder, e.Family); err != nil {
33,248✔
48
                        return err
×
49
                }
×
50
                if err := binary.Write(w, byteOrder, e.Index); err != nil {
33,248✔
51
                        return err
×
52
                }
×
53

54
                if e.PubKey != nil {
66,486✔
55
                        if err := binary.Write(w, byteOrder, true); err != nil {
33,238✔
56
                                return fmt.Errorf("error writing serialized "+
×
57
                                        "element: %w", err)
×
58
                        }
×
59

60
                        return WriteElement(w, e.PubKey)
33,238✔
61
                }
62

63
                return binary.Write(w, byteOrder, false)
10✔
64
        case ChannelType:
3,267✔
65
                var buf [8]byte
3,267✔
66
                if err := tlv.WriteVarInt(w, uint64(e), &buf); err != nil {
3,267✔
67
                        return err
×
68
                }
×
69

70
        case chainhash.Hash:
4,449✔
71
                if _, err := w.Write(e[:]); err != nil {
4,449✔
72
                        return err
×
73
                }
×
74

75
        case wire.OutPoint:
3,517✔
76
                return graphdb.WriteOutpoint(w, &e)
3,517✔
77

78
        case lnwire.ShortChannelID:
4,617✔
79
                if err := binary.Write(w, byteOrder, e.ToUint64()); err != nil {
4,617✔
80
                        return err
×
81
                }
×
82

83
        case lnwire.ChannelID:
233,073✔
84
                if _, err := w.Write(e[:]); err != nil {
233,073✔
85
                        return err
×
86
                }
×
87

88
        case int64, uint64:
343,865✔
89
                if err := binary.Write(w, byteOrder, e); err != nil {
343,865✔
90
                        return err
×
91
                }
×
92

93
        case uint32:
38,907✔
94
                if err := binary.Write(w, byteOrder, e); err != nil {
38,907✔
95
                        return err
×
96
                }
×
97

98
        case int32:
29,654✔
99
                if err := binary.Write(w, byteOrder, e); err != nil {
29,654✔
100
                        return err
×
101
                }
×
102

103
        case uint16:
38,574✔
104
                if err := binary.Write(w, byteOrder, e); err != nil {
38,574✔
105
                        return err
×
106
                }
×
107

108
        case uint8:
1,298✔
109
                if err := binary.Write(w, byteOrder, e); err != nil {
1,298✔
110
                        return err
×
111
                }
×
112

113
        case bool:
41,440✔
114
                if err := binary.Write(w, byteOrder, e); err != nil {
41,440✔
115
                        return err
×
116
                }
×
117

118
        case btcutil.Amount:
34,101✔
119
                if err := binary.Write(w, byteOrder, uint64(e)); err != nil {
34,101✔
120
                        return err
×
121
                }
×
122

123
        case lnwire.MilliSatoshi:
67,570✔
124
                if err := binary.Write(w, byteOrder, uint64(e)); err != nil {
67,570✔
125
                        return err
×
126
                }
×
127

128
        case *btcec.PrivateKey:
1✔
129
                b := e.Serialize()
1✔
130
                if _, err := w.Write(b); err != nil {
1✔
131
                        return err
×
132
                }
×
133

134
        case *btcec.PublicKey:
44,014✔
135
                b := e.SerializeCompressed()
44,014✔
136
                if _, err := w.Write(b); err != nil {
44,014✔
137
                        return err
×
138
                }
×
139

140
        case shachain.Producer:
3,851✔
141
                return e.Encode(w)
3,851✔
142

143
        case shachain.Store:
3,851✔
144
                return e.Encode(w)
3,851✔
145

146
        case *wire.MsgTx:
10,483✔
147
                return e.Serialize(w)
10,483✔
148

149
        case [32]byte:
29,729✔
150
                if _, err := w.Write(e[:]); err != nil {
29,729✔
151
                        return err
×
152
                }
×
153

154
        case []byte:
70,640✔
155
                if err := wire.WriteVarBytes(w, 0, e); err != nil {
70,640✔
156
                        return err
×
157
                }
×
158

159
        case lnwire.Message:
7,415✔
160
                var msgBuf bytes.Buffer
7,415✔
161
                if _, err := lnwire.WriteMessage(&msgBuf, e, 0); err != nil {
7,415✔
162
                        return err
×
163
                }
×
164

165
                msgLen := uint16(len(msgBuf.Bytes()))
7,415✔
166
                if err := WriteElements(w, msgLen); err != nil {
7,415✔
167
                        return err
×
168
                }
×
169

170
                if _, err := w.Write(msgBuf.Bytes()); err != nil {
7,415✔
171
                        return err
×
172
                }
×
173

174
        case ChannelStatus:
3,267✔
175
                var buf [8]byte
3,267✔
176
                if err := tlv.WriteVarInt(w, uint64(e), &buf); err != nil {
3,267✔
177
                        return err
×
178
                }
×
179

180
        case ClosureType:
133✔
181
                if err := binary.Write(w, byteOrder, e); err != nil {
133✔
182
                        return err
×
183
                }
×
184

185
        case paymentIndexType:
169✔
186
                if err := binary.Write(w, byteOrder, e); err != nil {
169✔
187
                        return err
×
188
                }
×
189

190
        case lnwire.FundingFlag:
3,267✔
191
                if err := binary.Write(w, byteOrder, e); err != nil {
3,267✔
192
                        return err
×
193
                }
×
194

195
        case net.Addr:
×
196
                if err := graphdb.SerializeAddr(w, e); err != nil {
×
197
                        return err
×
198
                }
×
199

200
        case []net.Addr:
206✔
201
                if err := WriteElement(w, uint32(len(e))); err != nil {
206✔
202
                        return err
×
203
                }
×
204

205
                for _, addr := range e {
718✔
206
                        if err := graphdb.SerializeAddr(w, addr); err != nil {
512✔
207
                                return err
×
208
                        }
×
209
                }
210

211
        default:
2,503✔
212
                return UnknownElementType{"WriteElement", e}
2,503✔
213
        }
214

215
        return nil
999,596✔
216
}
217

218
// WriteElements is writes each element in the elements slice to the passed
219
// io.Writer using WriteElement.
220
func WriteElements(w io.Writer, elements ...interface{}) error {
78,471✔
221
        for _, element := range elements {
611,543✔
222
                err := WriteElement(w, element)
533,072✔
223
                if err != nil {
533,072✔
224
                        return err
×
225
                }
×
226
        }
227
        return nil
78,471✔
228
}
229

230
// ReadElement is a one-stop utility function to deserialize any datastructure
231
// encoded using the serialization format of the database.
232
func ReadElement(r io.Reader, element interface{}) error {
1,703,127✔
233
        switch e := element.(type) {
1,703,127✔
234
        case *keychain.KeyDescriptor:
73,153✔
235
                if err := binary.Read(r, byteOrder, &e.Family); err != nil {
73,153✔
236
                        return err
×
237
                }
×
238
                if err := binary.Read(r, byteOrder, &e.Index); err != nil {
73,153✔
239
                        return err
×
240
                }
×
241

242
                var hasPubKey bool
73,153✔
243
                if err := binary.Read(r, byteOrder, &hasPubKey); err != nil {
73,153✔
244
                        return err
×
245
                }
×
246

247
                if hasPubKey {
146,286✔
248
                        return ReadElement(r, &e.PubKey)
73,133✔
249
                }
73,133✔
250

251
        case *ChannelType:
7,257✔
252
                var buf [8]byte
7,257✔
253
                ctype, err := tlv.ReadVarInt(r, &buf)
7,257✔
254
                if err != nil {
7,257✔
255
                        return err
×
256
                }
×
257

258
                *e = ChannelType(ctype)
7,257✔
259

260
        case *chainhash.Hash:
7,517✔
261
                if _, err := io.ReadFull(r, e[:]); err != nil {
7,517✔
262
                        return err
×
263
                }
×
264

265
        case *wire.OutPoint:
7,390✔
266
                return graphdb.ReadOutpoint(r, e)
7,390✔
267

268
        case *lnwire.ShortChannelID:
8,431✔
269
                var a uint64
8,431✔
270
                if err := binary.Read(r, byteOrder, &a); err != nil {
8,431✔
271
                        return err
×
272
                }
×
273
                *e = lnwire.NewShortChanIDFromInt(a)
8,431✔
274

275
        case *lnwire.ChannelID:
233,308✔
276
                if _, err := io.ReadFull(r, e[:]); err != nil {
233,308✔
277
                        return err
×
278
                }
×
279

280
        case *int64, *uint64:
462,382✔
281
                if err := binary.Read(r, byteOrder, e); err != nil {
462,382✔
282
                        return err
×
283
                }
×
284

285
        case *uint32:
84,928✔
286
                if err := binary.Read(r, byteOrder, e); err != nil {
84,928✔
287
                        return err
×
288
                }
×
289

290
        case *int32:
67,324✔
291
                if err := binary.Read(r, byteOrder, e); err != nil {
67,324✔
292
                        return err
×
293
                }
×
294

295
        case *uint16:
65,881✔
296
                if err := binary.Read(r, byteOrder, e); err != nil {
65,881✔
297
                        return err
×
298
                }
×
299

300
        case *uint8:
1,831✔
301
                if err := binary.Read(r, byteOrder, e); err != nil {
1,831✔
302
                        return err
×
303
                }
×
304

305
        case *bool:
88,303✔
306
                if err := binary.Read(r, byteOrder, e); err != nil {
88,303✔
307
                        return err
×
308
                }
×
309

310
        case *btcutil.Amount:
70,137✔
311
                var a uint64
70,137✔
312
                if err := binary.Read(r, byteOrder, &a); err != nil {
70,137✔
313
                        return err
×
314
                }
×
315

316
                *e = btcutil.Amount(a)
70,137✔
317

318
        case *lnwire.MilliSatoshi:
146,958✔
319
                var a uint64
146,958✔
320
                if err := binary.Read(r, byteOrder, &a); err != nil {
146,958✔
321
                        return err
×
322
                }
×
323

324
                *e = lnwire.MilliSatoshi(a)
146,958✔
325

326
        case **btcec.PrivateKey:
×
327
                var b [btcec.PrivKeyBytesLen]byte
×
328
                if _, err := io.ReadFull(r, b[:]); err != nil {
×
329
                        return err
×
330
                }
×
331

332
                priv, _ := btcec.PrivKeyFromBytes(b[:])
×
333
                *e = priv
×
334

335
        case **btcec.PublicKey:
95,412✔
336
                var b [btcec.PubKeyBytesLenCompressed]byte
95,412✔
337
                if _, err := io.ReadFull(r, b[:]); err != nil {
95,412✔
338
                        return err
×
339
                }
×
340

341
                pubKey, err := btcec.ParsePubKey(b[:])
95,412✔
342
                if err != nil {
95,412✔
343
                        return err
×
344
                }
×
345
                *e = pubKey
95,412✔
346

347
        case *shachain.Producer:
7,272✔
348
                var root [32]byte
7,272✔
349
                if _, err := io.ReadFull(r, root[:]); err != nil {
7,272✔
350
                        return err
×
351
                }
×
352

353
                // TODO(roasbeef): remove
354
                producer, err := shachain.NewRevocationProducerFromBytes(root[:])
7,272✔
355
                if err != nil {
7,272✔
356
                        return err
×
357
                }
×
358

359
                *e = producer
7,272✔
360

361
        case *shachain.Store:
7,272✔
362
                store, err := shachain.NewRevocationStoreFromBytes(r)
7,272✔
363
                if err != nil {
7,272✔
364
                        return err
×
365
                }
×
366

367
                *e = store
7,272✔
368

369
        case **wire.MsgTx:
20,496✔
370
                tx := wire.NewMsgTx(2)
20,496✔
371
                if err := tx.Deserialize(r); err != nil {
20,496✔
372
                        return err
×
373
                }
×
374

375
                *e = tx
20,496✔
376

377
        case *[32]byte:
68,032✔
378
                if _, err := io.ReadFull(r, e[:]); err != nil {
68,032✔
379
                        return err
×
380
                }
×
381

382
        case *[]byte:
156,273✔
383
                bytes, err := wire.ReadVarBytes(r, 0, 66000, "[]byte")
156,273✔
384
                if err != nil {
156,273✔
385
                        return err
×
386
                }
×
387

388
                *e = bytes
156,273✔
389

390
        case *lnwire.Message:
5,565✔
391
                var msgLen uint16
5,565✔
392
                if err := ReadElement(r, &msgLen); err != nil {
5,565✔
393
                        return err
×
394
                }
×
395

396
                msgReader := io.LimitReader(r, int64(msgLen))
5,565✔
397
                msg, err := lnwire.ReadMessage(msgReader, 0)
5,565✔
398
                if err != nil {
5,565✔
399
                        return err
×
400
                }
×
401

402
                *e = msg
5,565✔
403

404
        case *ChannelStatus:
7,257✔
405
                var buf [8]byte
7,257✔
406
                status, err := tlv.ReadVarInt(r, &buf)
7,257✔
407
                if err != nil {
7,257✔
408
                        return err
×
409
                }
×
410

411
                *e = ChannelStatus(status)
7,257✔
412

413
        case *ClosureType:
133✔
414
                if err := binary.Read(r, byteOrder, e); err != nil {
133✔
415
                        return err
×
416
                }
×
417

418
        case *paymentIndexType:
62✔
419
                if err := binary.Read(r, byteOrder, e); err != nil {
62✔
420
                        return err
×
421
                }
×
422

423
        case *lnwire.FundingFlag:
7,257✔
424
                if err := binary.Read(r, byteOrder, e); err != nil {
7,257✔
425
                        return err
×
426
                }
×
427

428
        case *net.Addr:
×
429
                addr, err := graphdb.DeserializeAddr(r)
×
430
                if err != nil {
×
431
                        return err
×
432
                }
×
433
                *e = addr
×
434

435
        case *[]net.Addr:
317✔
436
                var numAddrs uint32
317✔
437
                if err := ReadElement(r, &numAddrs); err != nil {
317✔
438
                        return err
×
439
                }
×
440

441
                *e = make([]net.Addr, numAddrs)
317✔
442
                for i := uint32(0); i < numAddrs; i++ {
946✔
443
                        addr, err := graphdb.DeserializeAddr(r)
629✔
444
                        if err != nil {
629✔
445
                                return err
×
446
                        }
×
447
                        (*e)[i] = addr
629✔
448
                }
449

450
        default:
3,057✔
451
                return UnknownElementType{"ReadElement", e}
3,057✔
452
        }
453

454
        return nil
1,619,556✔
455
}
456

457
// ReadElements deserializes a variable number of elements into the passed
458
// io.Reader, with each element being deserialized according to the ReadElement
459
// function.
460
func ReadElements(r io.Reader, elements ...interface{}) error {
145,374✔
461
        for _, element := range elements {
1,267,499✔
462
                err := ReadElement(r, element)
1,122,125✔
463
                if err != nil {
1,122,125✔
464
                        return err
×
465
                }
×
466
        }
467
        return nil
145,374✔
468
}
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