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

lightningnetwork / lnd / 13408822928

19 Feb 2025 08:59AM UTC coverage: 41.123% (-17.7%) from 58.794%
13408822928

Pull #9521

github

web-flow
Merge d2f397b3c into 0e8786348
Pull Request #9521: unit: remove GOACC, use Go 1.20 native coverage functionality

92496 of 224923 relevant lines covered (41.12%)

18825.83 hits per line

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

35.46
/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 {
10✔
21
        if _, err := w.Write(o.Hash[:]); err != nil {
10✔
22
                return err
×
23
        }
×
24
        if err := binary.Write(w, byteOrder, o.Index); err != nil {
10✔
25
                return err
×
26
        }
×
27

28
        return nil
10✔
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 {
6✔
34
        if _, err := io.ReadFull(r, o.Hash[:]); err != nil {
6✔
35
                return err
×
36
        }
×
37
        if err := binary.Read(r, byteOrder, &o.Index); err != nil {
6✔
38
                return err
×
39
        }
×
40

41
        return nil
6✔
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 {
422✔
62
        switch e := element.(type) {
422✔
63
        case keychain.KeyDescriptor:
30✔
64
                if err := binary.Write(w, byteOrder, e.Family); err != nil {
30✔
65
                        return err
×
66
                }
×
67
                if err := binary.Write(w, byteOrder, e.Index); err != nil {
30✔
68
                        return err
×
69
                }
×
70

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

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

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

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

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

93
        case lnwire.ShortChannelID:
9✔
94
                if err := binary.Write(w, byteOrder, e.ToUint64()); err != nil {
9✔
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:
43✔
104
                if err := binary.Write(w, byteOrder, e); err != nil {
43✔
105
                        return err
×
106
                }
×
107

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

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

118
        case uint16:
12✔
119
                if err := binary.Write(w, byteOrder, e); err != nil {
12✔
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:
23✔
129
                if err := binary.Write(w, byteOrder, e); err != nil {
23✔
130
                        return err
×
131
                }
×
132

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

138
        case lnwire.MilliSatoshi:
55✔
139
                if err := binary.Write(w, byteOrder, uint64(e)); err != nil {
55✔
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:
48✔
150
                b := e.SerializeCompressed()
48✔
151
                if _, err := w.Write(b); err != nil {
48✔
152
                        return err
×
153
                }
×
154

155
        case shachain.Producer:
×
156
                return e.Encode(w)
×
157

158
        case shachain.Store:
×
159
                return e.Encode(w)
×
160

161
        case *wire.MsgTx:
×
162
                return e.Serialize(w)
×
163

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

169
        case []byte:
43✔
170
                if err := wire.WriteVarBytes(w, 0, e); err != nil {
43✔
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:
×
180
                if err := binary.Write(w, byteOrder, e); err != nil {
×
181
                        return err
×
182
                }
×
183

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

189
        case lnwire.FundingFlag:
×
190
                if err := binary.Write(w, byteOrder, e); err != nil {
×
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
383✔
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 {
113✔
220
        for _, element := range elements {
505✔
221
                err := WriteElement(w, element)
392✔
222
                if err != nil {
392✔
223
                        return err
×
224
                }
×
225
        }
226
        return nil
113✔
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 {
349✔
232
        switch e := element.(type) {
349✔
233
        case *keychain.KeyDescriptor:
20✔
234
                if err := binary.Read(r, byteOrder, &e.Family); err != nil {
20✔
235
                        return err
×
236
                }
×
237
                if err := binary.Read(r, byteOrder, &e.Index); err != nil {
20✔
238
                        return err
×
239
                }
×
240

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

246
                if hasPubKey {
40✔
247
                        return ReadElement(r, &e.PubKey)
20✔
248
                }
20✔
249

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

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

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

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

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

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

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

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

290
        case *uint16:
8✔
291
                if err := binary.Read(r, byteOrder, e); err != nil {
8✔
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:
13✔
301
                if err := binary.Read(r, byteOrder, e); err != nil {
13✔
302
                        return err
×
303
                }
×
304

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

311
                *e = btcutil.Amount(a)
26✔
312

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

319
                *e = lnwire.MilliSatoshi(a)
51✔
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:
34✔
331
                var b [btcec.PubKeyBytesLenCompressed]byte
34✔
332
                if _, err := io.ReadFull(r, b[:]); err != nil {
36✔
333
                        return err
2✔
334
                }
2✔
335

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

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

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

354
                *e = producer
×
355

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

362
                *e = store
×
363

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

370
                *e = tx
×
371

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

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

383
                *e = bytes
43✔
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:
×
394
                if err := binary.Read(r, byteOrder, e); err != nil {
×
395
                        return err
×
396
                }
×
397

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

403
        case *lnwire.FundingFlag:
×
404
                if err := binary.Read(r, byteOrder, e); err != nil {
×
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
321✔
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 {
143✔
441
        for _, element := range elements {
472✔
442
                err := ReadElement(r, element)
329✔
443
                if err != nil {
331✔
444
                        return err
2✔
445
                }
2✔
446
        }
447
        return nil
141✔
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