• 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

49.2
/channeldb/migration_01_to_11/codec.go
1
package migration_01_to_11
2

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

9
        "github.com/btcsuite/btcd/btcec/v2"
10
        "github.com/btcsuite/btcd/btcutil"
11
        "github.com/btcsuite/btcd/chaincfg/chainhash"
12
        "github.com/btcsuite/btcd/wire"
13
        lnwire "github.com/lightningnetwork/lnd/channeldb/migration/lnwire21"
14
        "github.com/lightningnetwork/lnd/keychain"
15
        "github.com/lightningnetwork/lnd/shachain"
16
)
17

18
// WriteOutpoint writes an outpoint to the passed writer using the minimal
19
// amount of bytes possible.
20
func WriteOutpoint(w io.Writer, o *wire.OutPoint) error {
11,350✔
21
        if _, err := w.Write(o.Hash[:]); err != nil {
11,350✔
22
                return err
×
23
        }
×
24
        if err := binary.Write(w, byteOrder, o.Index); err != nil {
11,350✔
25
                return err
×
26
        }
×
27

28
        return nil
11,350✔
29
}
30

31
// ReadOutpoint reads an outpoint from the passed reader that was previously
32
// written using the writeOutpoint struct.
33
func ReadOutpoint(r io.Reader, o *wire.OutPoint) error {
1,926✔
34
        if _, err := io.ReadFull(r, o.Hash[:]); err != nil {
1,926✔
35
                return err
×
36
        }
×
37
        if err := binary.Read(r, byteOrder, &o.Index); err != nil {
1,926✔
38
                return err
×
39
        }
×
40

41
        return nil
1,926✔
42
}
43

44
// UnknownElementType is an error returned when the codec is unable to encode or
45
// decode a particular type.
46
type UnknownElementType struct {
47
        method  string
48
        element interface{}
49
}
50

51
// Error returns the name of the method that encountered the error, as well as
52
// the type that was unsupported.
53
func (e UnknownElementType) Error() string {
×
54
        return fmt.Sprintf("Unknown type in %s: %T", e.method, e.element)
×
55
}
×
56

57
// WriteElement is a one-stop shop to write the big endian representation of
58
// any element which is to be serialized for storage on disk. The passed
59
// io.Writer should be backed by an appropriately sized byte slice, or be able
60
// to dynamically expand to accommodate additional data.
61
func WriteElement(w io.Writer, element interface{}) error {
197,918✔
62
        switch e := element.(type) {
197,918✔
63
        case keychain.KeyDescriptor:
26,860✔
64
                if err := binary.Write(w, byteOrder, e.Family); err != nil {
26,860✔
65
                        return err
×
66
                }
×
67
                if err := binary.Write(w, byteOrder, e.Index); err != nil {
26,860✔
68
                        return err
×
69
                }
×
70

71
                if e.PubKey != nil {
53,480✔
72
                        if err := binary.Write(w, byteOrder, true); err != nil {
26,620✔
73
                                return fmt.Errorf("error writing serialized element: %w", err)
×
74
                        }
×
75

76
                        return WriteElement(w, e.PubKey)
26,620✔
77
                }
78

79
                return binary.Write(w, byteOrder, false)
240✔
80
        case ChannelType:
2,683✔
81
                if err := binary.Write(w, byteOrder, e); err != nil {
2,683✔
82
                        return err
×
83
                }
×
84

85
        case chainhash.Hash:
2,713✔
86
                if _, err := w.Write(e[:]); err != nil {
2,713✔
87
                        return err
×
88
                }
×
89

90
        case wire.OutPoint:
2,698✔
91
                return WriteOutpoint(w, &e)
2,698✔
92

93
        case lnwire.ShortChannelID:
2,698✔
94
                if err := binary.Write(w, byteOrder, e.ToUint64()); err != nil {
2,698✔
95
                        return err
×
96
                }
×
97

98
        case lnwire.ChannelID:
×
99
                if _, err := w.Write(e[:]); err != nil {
×
100
                        return err
×
101
                }
×
102

103
        case int64, uint64:
24,116✔
104
                if err := binary.Write(w, byteOrder, e); err != nil {
24,116✔
105
                        return err
×
106
                }
×
107

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

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

118
        case uint16:
17,434✔
119
                if err := binary.Write(w, byteOrder, e); err != nil {
17,434✔
120
                        return err
×
121
                }
×
122

123
        case uint8:
×
124
                if err := binary.Write(w, byteOrder, e); err != nil {
×
125
                        return err
×
126
                }
×
127

128
        case bool:
7,412✔
129
                if err := binary.Write(w, byteOrder, e); err != nil {
7,412✔
130
                        return err
×
131
                }
×
132

133
        case btcutil.Amount:
21,486✔
134
                if err := binary.Write(w, byteOrder, uint64(e)); err != nil {
21,486✔
135
                        return err
×
136
                }
×
137

138
        case lnwire.MilliSatoshi:
26,206✔
139
                if err := binary.Write(w, byteOrder, uint64(e)); err != nil {
26,206✔
140
                        return err
×
141
                }
×
142

143
        case *btcec.PrivateKey:
12✔
144
                b := e.Serialize()
12✔
145
                if _, err := w.Write(b); err != nil {
12✔
146
                        return err
×
147
                }
×
148

149
        case *btcec.PublicKey:
31,986✔
150
                b := e.SerializeCompressed()
31,986✔
151
                if _, err := w.Write(b); err != nil {
31,986✔
152
                        return err
×
153
                }
×
154

155
        case shachain.Producer:
2,659✔
156
                return e.Encode(w)
2,659✔
157

158
        case shachain.Store:
2,659✔
159
                return e.Encode(w)
2,659✔
160

161
        case *wire.MsgTx:
4,011✔
162
                return e.Serialize(w)
4,011✔
163

164
        case [32]byte:
2,017✔
165
                if _, err := w.Write(e[:]); err != nil {
2,017✔
166
                        return err
×
167
                }
×
168

169
        case []byte:
8,088✔
170
                if err := wire.WriteVarBytes(w, 0, e); err != nil {
8,088✔
171
                        return err
×
172
                }
×
173

174
        case lnwire.Message:
×
175
                if _, err := lnwire.WriteMessage(w, e, 0); err != nil {
×
176
                        return err
×
177
                }
×
178

179
        case ChannelStatus:
2,683✔
180
                if err := binary.Write(w, byteOrder, e); err != nil {
2,683✔
181
                        return err
×
182
                }
×
183

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

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

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

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

204
                for _, addr := range e {
×
205
                        if err := serializeAddr(w, addr); err != nil {
×
206
                                return err
×
207
                        }
×
208
                }
209

210
        default:
×
211
                return UnknownElementType{"WriteElement", e}
×
212
        }
213

214
        return nil
159,031✔
215
}
216

217
// WriteElements is writes each element in the elements slice to the passed
218
// io.Writer using WriteElement.
219
func WriteElements(w io.Writer, elements ...interface{}) error {
16,864✔
220
        for _, element := range elements {
184,151✔
221
                err := WriteElement(w, element)
167,287✔
222
                if err != nil {
167,287✔
223
                        return err
×
224
                }
×
225
        }
226
        return nil
16,864✔
227
}
228

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

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

246
                if hasPubKey {
37,970✔
247
                        return ReadElement(r, &e.PubKey)
18,860✔
248
                }
18,860✔
249

250
        case *ChannelType:
1,910✔
251
                if err := binary.Read(r, byteOrder, e); err != nil {
1,910✔
252
                        return err
×
253
                }
×
254

255
        case *chainhash.Hash:
1,934✔
256
                if _, err := io.ReadFull(r, e[:]); err != nil {
1,934✔
257
                        return err
×
258
                }
×
259

260
        case *wire.OutPoint:
1,922✔
261
                return ReadOutpoint(r, e)
1,922✔
262

263
        case *lnwire.ShortChannelID:
1,922✔
264
                var a uint64
1,922✔
265
                if err := binary.Read(r, byteOrder, &a); err != nil {
1,922✔
266
                        return err
×
267
                }
×
268
                *e = lnwire.NewShortChanIDFromInt(a)
1,922✔
269

270
        case *lnwire.ChannelID:
×
271
                if _, err := io.ReadFull(r, e[:]); err != nil {
×
272
                        return err
×
273
                }
×
274

275
        case *int64, *uint64:
17,448✔
276
                if err := binary.Read(r, byteOrder, e); err != nil {
17,448✔
277
                        return err
×
278
                }
×
279

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

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

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

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

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

305
        case *btcutil.Amount:
15,264✔
306
                var a uint64
15,264✔
307
                if err := binary.Read(r, byteOrder, &a); err != nil {
15,264✔
308
                        return err
×
309
                }
×
310

311
                *e = btcutil.Amount(a)
15,264✔
312

313
        case *lnwire.MilliSatoshi:
18,811✔
314
                var a uint64
18,811✔
315
                if err := binary.Read(r, byteOrder, &a); err != nil {
18,811✔
316
                        return err
×
317
                }
×
318

319
                *e = lnwire.MilliSatoshi(a)
18,811✔
320

321
        case **btcec.PrivateKey:
12✔
322
                var b [btcec.PrivKeyBytesLen]byte
12✔
323
                if _, err := io.ReadFull(r, b[:]); err != nil {
12✔
324
                        return err
×
325
                }
×
326

327
                priv, _ := btcec.PrivKeyFromBytes(b[:])
12✔
328
                *e = priv
12✔
329

330
        case **btcec.PublicKey:
22,674✔
331
                var b [btcec.PubKeyBytesLenCompressed]byte
22,674✔
332
                if _, err := io.ReadFull(r, b[:]); err != nil {
22,676✔
333
                        return err
2✔
334
                }
2✔
335

336
                pubKey, err := btcec.ParsePubKey(b[:])
22,672✔
337
                if err != nil {
22,672✔
338
                        return err
×
339
                }
×
340
                *e = pubKey
22,672✔
341

342
        case *shachain.Producer:
1,884✔
343
                var root [32]byte
1,884✔
344
                if _, err := io.ReadFull(r, root[:]); err != nil {
1,884✔
345
                        return err
×
346
                }
×
347

348
                // TODO(roasbeef): remove
349
                producer, err := shachain.NewRevocationProducerFromBytes(root[:])
1,884✔
350
                if err != nil {
1,884✔
351
                        return err
×
352
                }
×
353

354
                *e = producer
1,884✔
355

356
        case *shachain.Store:
1,884✔
357
                store, err := shachain.NewRevocationStoreFromBytes(r)
1,884✔
358
                if err != nil {
1,884✔
359
                        return err
×
360
                }
×
361

362
                *e = store
1,884✔
363

364
        case **wire.MsgTx:
2,842✔
365
                tx := wire.NewMsgTx(2)
2,842✔
366
                if err := tx.Deserialize(r); err != nil {
2,843✔
367
                        return err
1✔
368
                }
1✔
369

370
                *e = tx
2,841✔
371

372
        case *[32]byte:
1,608✔
373
                if _, err := io.ReadFull(r, e[:]); err != nil {
1,608✔
374
                        return err
×
375
                }
×
376

377
        case *[]byte:
6,100✔
378
                bytes, err := wire.ReadVarBytes(r, 0, 66000, "[]byte")
6,100✔
379
                if err != nil {
6,100✔
380
                        return err
×
381
                }
×
382

383
                *e = bytes
6,100✔
384

385
        case *lnwire.Message:
×
386
                msg, err := lnwire.ReadMessage(r, 0)
×
387
                if err != nil {
×
388
                        return err
×
389
                }
×
390

391
                *e = msg
×
392

393
        case *ChannelStatus:
1,910✔
394
                if err := binary.Read(r, byteOrder, e); err != nil {
1,910✔
395
                        return err
×
396
                }
×
397

398
        case *ClosureType:
12✔
399
                if err := binary.Read(r, byteOrder, e); err != nil {
12✔
400
                        return err
×
401
                }
×
402

403
        case *lnwire.FundingFlag:
1,910✔
404
                if err := binary.Read(r, byteOrder, e); err != nil {
1,910✔
405
                        return err
×
406
                }
×
407

408
        case *net.Addr:
×
409
                addr, err := deserializeAddr(r)
×
410
                if err != nil {
×
411
                        return err
×
412
                }
×
413
                *e = addr
×
414

415
        case *[]net.Addr:
×
416
                var numAddrs uint32
×
417
                if err := ReadElement(r, &numAddrs); err != nil {
×
418
                        return err
×
419
                }
×
420

421
                *e = make([]net.Addr, numAddrs)
×
422
                for i := uint32(0); i < numAddrs; i++ {
×
423
                        addr, err := deserializeAddr(r)
×
424
                        if err != nil {
×
425
                                return err
×
426
                        }
×
427
                        (*e)[i] = addr
×
428
                }
429

430
        default:
×
431
                return UnknownElementType{"ReadElement", e}
×
432
        }
433

434
        return nil
121,415✔
435
}
436

437
// ReadElements deserializes a variable number of elements into the passed
438
// io.Reader, with each element being deserialized according to the ReadElement
439
// function.
440
func ReadElements(r io.Reader, elements ...interface{}) error {
12,223✔
441
        for _, element := range elements {
132,721✔
442
                err := ReadElement(r, element)
120,498✔
443
                if err != nil {
120,500✔
444
                        return err
2✔
445
                }
2✔
446
        }
447
        return nil
12,221✔
448
}
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