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

lightningnetwork / lnd / 13566028875

27 Feb 2025 12:09PM UTC coverage: 49.396% (-9.4%) from 58.748%
13566028875

Pull #9555

github

ellemouton
graph/db: populate the graph cache in Start instead of during construction

In this commit, we move the graph cache population logic out of the
ChannelGraph constructor and into its Start method instead.
Pull Request #9555: graph: extract cache from CRUD [6]

34 of 54 new or added lines in 4 files covered. (62.96%)

27464 existing lines in 436 files now uncovered.

101095 of 204664 relevant lines covered (49.4%)

1.54 hits per line

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

0.0
/channeldb/migration21/common/enclosed_types.go
1
package common
2

3
import (
4
        "bytes"
5
        "encoding/binary"
6
        "io"
7

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

16
// CircuitKey is used by a channel to uniquely identify the HTLCs it receives
17
// from the switch, and is used to purge our in-memory state of HTLCs that have
18
// already been processed by a link. Two list of CircuitKeys are included in
19
// each CommitDiff to allow a link to determine which in-memory htlcs directed
20
// the opening and closing of circuits in the switch's circuit map.
21
type CircuitKey struct {
22
        // ChanID is the short chanid indicating the HTLC's origin.
23
        //
24
        // NOTE: It is fine for this value to be blank, as this indicates a
25
        // locally-sourced payment.
26
        ChanID lnwire.ShortChannelID
27

28
        // HtlcID is the unique htlc index predominately assigned by links,
29
        // though can also be assigned by switch in the case of locally-sourced
30
        // payments.
31
        HtlcID uint64
32
}
33

34
// HTLC is the on-disk representation of a hash time-locked contract. HTLCs are
35
// contained within ChannelDeltas which encode the current state of the
36
// commitment between state updates.
37
//
38
// TODO(roasbeef): save space by using smaller ints at tail end?
39
type HTLC struct {
40
        // Signature is the signature for the second level covenant transaction
41
        // for this HTLC. The second level transaction is a timeout tx in the
42
        // case that this is an outgoing HTLC, and a success tx in the case
43
        // that this is an incoming HTLC.
44
        //
45
        // TODO(roasbeef): make [64]byte instead?
46
        Signature []byte
47

48
        // RHash is the payment hash of the HTLC.
49
        RHash [32]byte
50

51
        // Amt is the amount of milli-satoshis this HTLC escrows.
52
        Amt lnwire.MilliSatoshi
53

54
        // RefundTimeout is the absolute timeout on the HTLC that the sender
55
        // must wait before reclaiming the funds in limbo.
56
        RefundTimeout uint32
57

58
        // OutputIndex is the output index for this particular HTLC output
59
        // within the commitment transaction.
60
        OutputIndex int32
61

62
        // Incoming denotes whether we're the receiver or the sender of this
63
        // HTLC.
64
        Incoming bool
65

66
        // OnionBlob is an opaque blob which is used to complete multi-hop
67
        // routing.
68
        OnionBlob []byte
69

70
        // HtlcIndex is the HTLC counter index of this active, outstanding
71
        // HTLC. This differs from the LogIndex, as the HtlcIndex is only
72
        // incremented for each offered HTLC, while they LogIndex is
73
        // incremented for each update (includes settle+fail).
74
        HtlcIndex uint64
75

76
        // LogIndex is the cumulative log index of this HTLC. This differs
77
        // from the HtlcIndex as this will be incremented for each new log
78
        // update added.
79
        LogIndex uint64
80
}
81

82
// ChannelCommitment is a snapshot of the commitment state at a particular
83
// point in the commitment chain. With each state transition, a snapshot of the
84
// current state along with all non-settled HTLCs are recorded. These snapshots
85
// detail the state of the _remote_ party's commitment at a particular state
86
// number.  For ourselves (the local node) we ONLY store our most recent
87
// (unrevoked) state for safety purposes.
88
type ChannelCommitment struct {
89
        // CommitHeight is the update number that this ChannelDelta represents
90
        // the total number of commitment updates to this point. This can be
91
        // viewed as sort of a "commitment height" as this number is
92
        // monotonically increasing.
93
        CommitHeight uint64
94

95
        // LocalLogIndex is the cumulative log index index of the local node at
96
        // this point in the commitment chain. This value will be incremented
97
        // for each _update_ added to the local update log.
98
        LocalLogIndex uint64
99

100
        // LocalHtlcIndex is the current local running HTLC index. This value
101
        // will be incremented for each outgoing HTLC the local node offers.
102
        LocalHtlcIndex uint64
103

104
        // RemoteLogIndex is the cumulative log index index of the remote node
105
        // at this point in the commitment chain. This value will be
106
        // incremented for each _update_ added to the remote update log.
107
        RemoteLogIndex uint64
108

109
        // RemoteHtlcIndex is the current remote running HTLC index. This value
110
        // will be incremented for each outgoing HTLC the remote node offers.
111
        RemoteHtlcIndex uint64
112

113
        // LocalBalance is the current available settled balance within the
114
        // channel directly spendable by us.
115
        //
116
        // NOTE: This is the balance *after* subtracting any commitment fee,
117
        // AND anchor output values.
118
        LocalBalance lnwire.MilliSatoshi
119

120
        // RemoteBalance is the current available settled balance within the
121
        // channel directly spendable by the remote node.
122
        //
123
        // NOTE: This is the balance *after* subtracting any commitment fee,
124
        // AND anchor output values.
125
        RemoteBalance lnwire.MilliSatoshi
126

127
        // CommitFee is the amount calculated to be paid in fees for the
128
        // current set of commitment transactions. The fee amount is persisted
129
        // with the channel in order to allow the fee amount to be removed and
130
        // recalculated with each channel state update, including updates that
131
        // happen after a system restart.
132
        CommitFee btcutil.Amount
133

134
        // FeePerKw is the min satoshis/kilo-weight that should be paid within
135
        // the commitment transaction for the entire duration of the channel's
136
        // lifetime. This field may be updated during normal operation of the
137
        // channel as on-chain conditions change.
138
        //
139
        // TODO(halseth): make this SatPerKWeight. Cannot be done atm because
140
        // this will cause the import cycle lnwallet<->channeldb. Fee
141
        // estimation stuff should be in its own package.
142
        FeePerKw btcutil.Amount
143

144
        // CommitTx is the latest version of the commitment state, broadcast
145
        // able by us.
146
        CommitTx *wire.MsgTx
147

148
        // CommitSig is one half of the signature required to fully complete
149
        // the script for the commitment transaction above. This is the
150
        // signature signed by the remote party for our version of the
151
        // commitment transactions.
152
        CommitSig []byte
153

154
        // Htlcs is the set of HTLC's that are pending at this particular
155
        // commitment height.
156
        Htlcs []HTLC
157

158
        // TODO(roasbeef): pending commit pointer?
159
        //  * lets just walk through
160
}
161

162
// LogUpdate represents a pending update to the remote commitment chain. The
163
// log update may be an add, fail, or settle entry. We maintain this data in
164
// order to be able to properly retransmit our proposed
165
// state if necessary.
166
type LogUpdate struct {
167
        // LogIndex is the log index of this proposed commitment update entry.
168
        LogIndex uint64
169

170
        // UpdateMsg is the update message that was included within the our
171
        // local update log. The LogIndex value denotes the log index of this
172
        // update which will be used when restoring our local update log if
173
        // we're left with a dangling update on restart.
174
        UpdateMsg lnwire.Message
175
}
176

177
// AddRef is used to identify a particular Add in a FwdPkg. The short channel ID
178
// is assumed to be that of the packager.
179
type AddRef struct {
180
        // Height is the remote commitment height that locked in the Add.
181
        Height uint64
182

183
        // Index is the index of the Add within the fwd pkg's Adds.
184
        //
185
        // NOTE: This index is static over the lifetime of a forwarding package.
186
        Index uint16
187
}
188

189
// SettleFailRef is used to locate a Settle/Fail in another channel's FwdPkg. A
190
// channel does not remove its own Settle/Fail htlcs, so the source is provided
191
// to locate a db bucket belonging to another channel.
192
type SettleFailRef struct {
193
        // Source identifies the outgoing link that locked in the settle or
194
        // fail. This is then used by the *incoming* link to find the settle
195
        // fail in another link's forwarding packages.
196
        Source lnwire.ShortChannelID
197

198
        // Height is the remote commitment height that locked in this
199
        // Settle/Fail.
200
        Height uint64
201

202
        // Index is the index of the Add with the fwd pkg's SettleFails.
203
        //
204
        // NOTE: This index is static over the lifetime of a forwarding package.
205
        Index uint16
206
}
207

208
// CommitDiff represents the delta needed to apply the state transition between
209
// two subsequent commitment states. Given state N and state N+1, one is able
210
// to apply the set of messages contained within the CommitDiff to N to arrive
211
// at state N+1. Each time a new commitment is extended, we'll write a new
212
// commitment (along with the full commitment state) to disk so we can
213
// re-transmit the state in the case of a connection loss or message drop.
214
type CommitDiff struct {
215
        // ChannelCommitment is the full commitment state that one would arrive
216
        // at by applying the set of messages contained in the UpdateDiff to
217
        // the prior accepted commitment.
218
        Commitment ChannelCommitment
219

220
        // LogUpdates is the set of messages sent prior to the commitment state
221
        // transition in question. Upon reconnection, if we detect that they
222
        // don't have the commitment, then we re-send this along with the
223
        // proper signature.
224
        LogUpdates []LogUpdate
225

226
        // CommitSig is the exact CommitSig message that should be sent after
227
        // the set of LogUpdates above has been retransmitted. The signatures
228
        // within this message should properly cover the new commitment state
229
        // and also the HTLC's within the new commitment state.
230
        CommitSig *lnwire.CommitSig
231

232
        // OpenedCircuitKeys is a set of unique identifiers for any downstream
233
        // Add packets included in this commitment txn. After a restart, this
234
        // set of htlcs is acked from the link's incoming mailbox to ensure
235
        // there isn't an attempt to re-add them to this commitment txn.
236
        OpenedCircuitKeys []CircuitKey
237

238
        // ClosedCircuitKeys records the unique identifiers for any settle/fail
239
        // packets that were resolved by this commitment txn. After a restart,
240
        // this is used to ensure those circuits are removed from the circuit
241
        // map, and the downstream packets in the link's mailbox are removed.
242
        ClosedCircuitKeys []CircuitKey
243

244
        // AddAcks specifies the locations (commit height, pkg index) of any
245
        // Adds that were failed/settled in this commit diff. This will ack
246
        // entries in *this* channel's forwarding packages.
247
        //
248
        // NOTE: This value is not serialized, it is used to atomically mark the
249
        // resolution of adds, such that they will not be reprocessed after a
250
        // restart.
251
        AddAcks []AddRef
252

253
        // SettleFailAcks specifies the locations (chan id, commit height, pkg
254
        // index) of any Settles or Fails that were locked into this commit
255
        // diff, and originate from *another* channel, i.e. the outgoing link.
256
        //
257
        // NOTE: This value is not serialized, it is used to atomically acks
258
        // settles and fails from the forwarding packages of other channels,
259
        // such that they will not be reforwarded internally after a restart.
260
        SettleFailAcks []SettleFailRef
261
}
262

263
// NetworkResult is the raw result received from the network after a payment
264
// attempt has been made. Since the switch doesn't always have the necessary
265
// data to decode the raw message, we store it together with some meta data,
266
// and decode it when the router query for the final result.
267
type NetworkResult struct {
268
        // Msg is the received result. This should be of type UpdateFulfillHTLC
269
        // or UpdateFailHTLC.
270
        Msg lnwire.Message
271

272
        // unencrypted indicates whether the failure encoded in the message is
273
        // unencrypted, and hence doesn't need to be decrypted.
274
        Unencrypted bool
275

276
        // IsResolution indicates whether this is a resolution message, in
277
        // which the failure reason might not be included.
278
        IsResolution bool
279
}
280

281
// ClosureType is an enum like structure that details exactly _how_ a channel
282
// was closed. Three closure types are currently possible: none, cooperative,
283
// local force close, remote force close, and (remote) breach.
284
type ClosureType uint8
285

286
// ChannelConstraints represents a set of constraints meant to allow a node to
287
// limit their exposure, enact flow control and ensure that all HTLCs are
288
// economically relevant. This struct will be mirrored for both sides of the
289
// channel, as each side will enforce various constraints that MUST be adhered
290
// to for the life time of the channel. The parameters for each of these
291
// constraints are static for the duration of the channel, meaning the channel
292
// must be torn down for them to change.
293
type ChannelConstraints struct {
294
        // DustLimit is the threshold (in satoshis) below which any outputs
295
        // should be trimmed. When an output is trimmed, it isn't materialized
296
        // as an actual output, but is instead burned to miner's fees.
297
        DustLimit btcutil.Amount
298

299
        // ChanReserve is an absolute reservation on the channel for the
300
        // owner of this set of constraints. This means that the current
301
        // settled balance for this node CANNOT dip below the reservation
302
        // amount. This acts as a defense against costless attacks when
303
        // either side no longer has any skin in the game.
304
        ChanReserve btcutil.Amount
305

306
        // MaxPendingAmount is the maximum pending HTLC value that the
307
        // owner of these constraints can offer the remote node at a
308
        // particular time.
309
        MaxPendingAmount lnwire.MilliSatoshi
310

311
        // MinHTLC is the minimum HTLC value that the owner of these
312
        // constraints can offer the remote node. If any HTLCs below this
313
        // amount are offered, then the HTLC will be rejected. This, in
314
        // tandem with the dust limit allows a node to regulate the
315
        // smallest HTLC that it deems economically relevant.
316
        MinHTLC lnwire.MilliSatoshi
317

318
        // MaxAcceptedHtlcs is the maximum number of HTLCs that the owner of
319
        // this set of constraints can offer the remote node. This allows each
320
        // node to limit their over all exposure to HTLCs that may need to be
321
        // acted upon in the case of a unilateral channel closure or a contract
322
        // breach.
323
        MaxAcceptedHtlcs uint16
324

325
        // CsvDelay is the relative time lock delay expressed in blocks. Any
326
        // settled outputs that pay to the owner of this channel configuration
327
        // MUST ensure that the delay branch uses this value as the relative
328
        // time lock. Similarly, any HTLC's offered by this node should use
329
        // this value as well.
330
        CsvDelay uint16
331
}
332

333
// ChannelConfig is a struct that houses the various configuration opens for
334
// channels. Each side maintains an instance of this configuration file as it
335
// governs: how the funding and commitment transaction to be created, the
336
// nature of HTLC's allotted, the keys to be used for delivery, and relative
337
// time lock parameters.
338
type ChannelConfig struct {
339
        // ChannelConstraints is the set of constraints that must be upheld for
340
        // the duration of the channel for the owner of this channel
341
        // configuration. Constraints govern a number of flow control related
342
        // parameters, also including the smallest HTLC that will be accepted
343
        // by a participant.
344
        ChannelConstraints
345

346
        // MultiSigKey is the key to be used within the 2-of-2 output script
347
        // for the owner of this channel config.
348
        MultiSigKey keychain.KeyDescriptor
349

350
        // RevocationBasePoint is the base public key to be used when deriving
351
        // revocation keys for the remote node's commitment transaction. This
352
        // will be combined along with a per commitment secret to derive a
353
        // unique revocation key for each state.
354
        RevocationBasePoint keychain.KeyDescriptor
355

356
        // PaymentBasePoint is the base public key to be used when deriving
357
        // the key used within the non-delayed pay-to-self output on the
358
        // commitment transaction for a node. This will be combined with a
359
        // tweak derived from the per-commitment point to ensure unique keys
360
        // for each commitment transaction.
361
        PaymentBasePoint keychain.KeyDescriptor
362

363
        // DelayBasePoint is the base public key to be used when deriving the
364
        // key used within the delayed pay-to-self output on the commitment
365
        // transaction for a node. This will be combined with a tweak derived
366
        // from the per-commitment point to ensure unique keys for each
367
        // commitment transaction.
368
        DelayBasePoint keychain.KeyDescriptor
369

370
        // HtlcBasePoint is the base public key to be used when deriving the
371
        // local HTLC key. The derived key (combined with the tweak derived
372
        // from the per-commitment point) is used within the "to self" clause
373
        // within any HTLC output scripts.
374
        HtlcBasePoint keychain.KeyDescriptor
375
}
376

377
// ChannelCloseSummary contains the final state of a channel at the point it
378
// was closed. Once a channel is closed, all the information pertaining to that
379
// channel within the openChannelBucket is deleted, and a compact summary is
380
// put in place instead.
381
type ChannelCloseSummary struct {
382
        // ChanPoint is the outpoint for this channel's funding transaction,
383
        // and is used as a unique identifier for the channel.
384
        ChanPoint wire.OutPoint
385

386
        // ShortChanID encodes the exact location in the chain in which the
387
        // channel was initially confirmed. This includes: the block height,
388
        // transaction index, and the output within the target transaction.
389
        ShortChanID lnwire.ShortChannelID
390

391
        // ChainHash is the hash of the genesis block that this channel resides
392
        // within.
393
        ChainHash chainhash.Hash
394

395
        // ClosingTXID is the txid of the transaction which ultimately closed
396
        // this channel.
397
        ClosingTXID chainhash.Hash
398

399
        // RemotePub is the public key of the remote peer that we formerly had
400
        // a channel with.
401
        RemotePub *btcec.PublicKey
402

403
        // Capacity was the total capacity of the channel.
404
        Capacity btcutil.Amount
405

406
        // CloseHeight is the height at which the funding transaction was
407
        // spent.
408
        CloseHeight uint32
409

410
        // SettledBalance is our total balance settled balance at the time of
411
        // channel closure. This _does not_ include the sum of any outputs that
412
        // have been time-locked as a result of the unilateral channel closure.
413
        SettledBalance btcutil.Amount
414

415
        // TimeLockedBalance is the sum of all the time-locked outputs at the
416
        // time of channel closure. If we triggered the force closure of this
417
        // channel, then this value will be non-zero if our settled output is
418
        // above the dust limit. If we were on the receiving side of a channel
419
        // force closure, then this value will be non-zero if we had any
420
        // outstanding outgoing HTLC's at the time of channel closure.
421
        TimeLockedBalance btcutil.Amount
422

423
        // CloseType details exactly _how_ the channel was closed. Five closure
424
        // types are possible: cooperative, local force, remote force, breach
425
        // and funding canceled.
426
        CloseType ClosureType
427

428
        // IsPending indicates whether this channel is in the 'pending close'
429
        // state, which means the channel closing transaction has been
430
        // confirmed, but not yet been fully resolved. In the case of a channel
431
        // that has been cooperatively closed, it will go straight into the
432
        // fully resolved state as soon as the closing transaction has been
433
        // confirmed. However, for channels that have been force closed, they'll
434
        // stay marked as "pending" until _all_ the pending funds have been
435
        // swept.
436
        IsPending bool
437

438
        // RemoteCurrentRevocation is the current revocation for their
439
        // commitment transaction. However, since this is the derived public key,
440
        // we don't yet have the private key so we aren't yet able to verify
441
        // that it's actually in the hash chain.
442
        RemoteCurrentRevocation *btcec.PublicKey
443

444
        // RemoteNextRevocation is the revocation key to be used for the *next*
445
        // commitment transaction we create for the local node. Within the
446
        // specification, this value is referred to as the
447
        // per-commitment-point.
448
        RemoteNextRevocation *btcec.PublicKey
449

450
        // LocalChanConfig is the channel configuration for the local node.
451
        LocalChanConfig ChannelConfig
452

453
        // LastChanSyncMsg is the ChannelReestablish message for this channel
454
        // for the state at the point where it was closed.
455
        LastChanSyncMsg *lnwire.ChannelReestablish
456
}
457

458
// FwdState is an enum used to describe the lifecycle of a FwdPkg.
459
type FwdState byte
460

461
const (
462
        // FwdStateLockedIn is the starting state for all forwarding packages.
463
        // Packages in this state have not yet committed to the exact set of
464
        // Adds to forward to the switch.
465
        FwdStateLockedIn FwdState = iota
466

467
        // FwdStateProcessed marks the state in which all Adds have been
468
        // locally processed and the forwarding decision to the switch has been
469
        // persisted.
470
        FwdStateProcessed
471

472
        // FwdStateCompleted signals that all Adds have been acked, and that all
473
        // settles and fails have been delivered to their sources. Packages in
474
        // this state can be removed permanently.
475
        FwdStateCompleted
476
)
477

478
// PkgFilter is used to compactly represent a particular subset of the Adds in a
479
// forwarding package. Each filter is represented as a simple, statically-sized
480
// bitvector, where the elements are intended to be the indices of the Adds as
481
// they are written in the FwdPkg.
482
type PkgFilter struct {
483
        count  uint16
484
        filter []byte
485
}
486

487
// NewPkgFilter initializes an empty PkgFilter supporting `count` elements.
UNCOV
488
func NewPkgFilter(count uint16) *PkgFilter {
×
UNCOV
489
        // We add 7 to ensure that the integer division yields properly rounded
×
UNCOV
490
        // values.
×
UNCOV
491
        filterLen := (count + 7) / 8
×
UNCOV
492

×
UNCOV
493
        return &PkgFilter{
×
UNCOV
494
                count:  count,
×
UNCOV
495
                filter: make([]byte, filterLen),
×
UNCOV
496
        }
×
UNCOV
497
}
×
498

499
// Count returns the number of elements represented by this PkgFilter.
500
func (f *PkgFilter) Count() uint16 {
×
501
        return f.count
×
502
}
×
503

504
// Set marks the `i`-th element as included by this filter.
505
// NOTE: It is assumed that i is always less than count.
506
func (f *PkgFilter) Set(i uint16) {
×
507
        byt := i / 8
×
508
        bit := i % 8
×
509

×
510
        // Set the i-th bit in the filter.
×
511
        // TODO(conner): ignore if > count to prevent panic?
×
512
        f.filter[byt] |= byte(1 << (7 - bit))
×
513
}
×
514

515
// Contains queries the filter for membership of index `i`.
516
// NOTE: It is assumed that i is always less than count.
517
func (f *PkgFilter) Contains(i uint16) bool {
×
518
        byt := i / 8
×
519
        bit := i % 8
×
520

×
521
        // Read the i-th bit in the filter.
×
522
        // TODO(conner): ignore if > count to prevent panic?
×
523
        return f.filter[byt]&(1<<(7-bit)) != 0
×
524
}
×
525

526
// Equal checks two PkgFilters for equality.
527
func (f *PkgFilter) Equal(f2 *PkgFilter) bool {
×
528
        if f == f2 {
×
529
                return true
×
530
        }
×
531
        if f.count != f2.count {
×
532
                return false
×
533
        }
×
534

535
        return bytes.Equal(f.filter, f2.filter)
×
536
}
537

538
// IsFull returns true if every element in the filter has been Set, and false
539
// otherwise.
540
func (f *PkgFilter) IsFull() bool {
×
541
        // Batch validate bytes that are fully used.
×
542
        for i := uint16(0); i < f.count/8; i++ {
×
543
                if f.filter[i] != 0xFF {
×
544
                        return false
×
545
                }
×
546
        }
547

548
        // If the count is not a multiple of 8, check that the filter contains
549
        // all remaining bits.
550
        rem := f.count % 8
×
551
        for idx := f.count - rem; idx < f.count; idx++ {
×
552
                if !f.Contains(idx) {
×
553
                        return false
×
554
                }
×
555
        }
556

557
        return true
×
558
}
559

560
// Size returns number of bytes produced when the PkgFilter is serialized.
UNCOV
561
func (f *PkgFilter) Size() uint16 {
×
UNCOV
562
        // 2 bytes for uint16 `count`, then round up number of bytes required to
×
UNCOV
563
        // represent `count` bits.
×
UNCOV
564
        return 2 + (f.count+7)/8
×
UNCOV
565
}
×
566

567
// Encode writes the filter to the provided io.Writer.
UNCOV
568
func (f *PkgFilter) Encode(w io.Writer) error {
×
UNCOV
569
        if err := binary.Write(w, binary.BigEndian, f.count); err != nil {
×
570
                return err
×
571
        }
×
572

UNCOV
573
        _, err := w.Write(f.filter)
×
UNCOV
574

×
UNCOV
575
        return err
×
576
}
577

578
// Decode reads the filter from the provided io.Reader.
UNCOV
579
func (f *PkgFilter) Decode(r io.Reader) error {
×
UNCOV
580
        if err := binary.Read(r, binary.BigEndian, &f.count); err != nil {
×
581
                return err
×
582
        }
×
583

UNCOV
584
        f.filter = make([]byte, f.Size()-2)
×
UNCOV
585
        _, err := io.ReadFull(r, f.filter)
×
UNCOV
586

×
UNCOV
587
        return err
×
588
}
589

590
// FwdPkg records all adds, settles, and fails that were locked in as a result
591
// of the remote peer sending us a revocation. Each package is identified by
592
// the short chanid and remote commitment height corresponding to the revocation
593
// that locked in the HTLCs. For everything except a locally initiated payment,
594
// settles and fails in a forwarding package must have a corresponding Add in
595
// another package, and can be removed individually once the source link has
596
// received the fail/settle.
597
//
598
// Adds cannot be removed, as we need to present the same batch of Adds to
599
// properly handle replay protection. Instead, we use a PkgFilter to mark that
600
// we have finished processing a particular Add. A FwdPkg should only be deleted
601
// after the AckFilter is full and all settles and fails have been persistently
602
// removed.
603
type FwdPkg struct {
604
        // Source identifies the channel that wrote this forwarding package.
605
        Source lnwire.ShortChannelID
606

607
        // Height is the height of the remote commitment chain that locked in
608
        // this forwarding package.
609
        Height uint64
610

611
        // State signals the persistent condition of the package and directs how
612
        // to reprocess the package in the event of failures.
613
        State FwdState
614

615
        // Adds contains all add messages which need to be processed and
616
        // forwarded to the switch. Adds does not change over the life of a
617
        // forwarding package.
618
        Adds []LogUpdate
619

620
        // FwdFilter is a filter containing the indices of all Adds that were
621
        // forwarded to the switch.
622
        FwdFilter *PkgFilter
623

624
        // AckFilter is a filter containing the indices of all Adds for which
625
        // the source has received a settle or fail and is reflected in the next
626
        // commitment txn. A package should not be removed until IsFull()
627
        // returns true.
628
        AckFilter *PkgFilter
629

630
        // SettleFails contains all settle and fail messages that should be
631
        // forwarded to the switch.
632
        SettleFails []LogUpdate
633

634
        // SettleFailFilter is a filter containing the indices of all Settle or
635
        // Fails originating in this package that have been received and locked
636
        // into the incoming link's commitment state.
637
        SettleFailFilter *PkgFilter
638
}
639

640
// NewFwdPkg initializes a new forwarding package in FwdStateLockedIn. This
641
// should be used to create a package at the time we receive a revocation.
642
func NewFwdPkg(source lnwire.ShortChannelID, height uint64,
UNCOV
643
        addUpdates, settleFailUpdates []LogUpdate) *FwdPkg {
×
UNCOV
644

×
UNCOV
645
        nAddUpdates := uint16(len(addUpdates))
×
UNCOV
646
        nSettleFailUpdates := uint16(len(settleFailUpdates))
×
UNCOV
647

×
UNCOV
648
        return &FwdPkg{
×
UNCOV
649
                Source:           source,
×
UNCOV
650
                Height:           height,
×
UNCOV
651
                State:            FwdStateLockedIn,
×
UNCOV
652
                Adds:             addUpdates,
×
UNCOV
653
                FwdFilter:        NewPkgFilter(nAddUpdates),
×
UNCOV
654
                AckFilter:        NewPkgFilter(nAddUpdates),
×
UNCOV
655
                SettleFails:      settleFailUpdates,
×
UNCOV
656
                SettleFailFilter: NewPkgFilter(nSettleFailUpdates),
×
UNCOV
657
        }
×
UNCOV
658
}
×
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