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

lightningnetwork / lnd / 15561477203

10 Jun 2025 01:54PM UTC coverage: 58.351% (-10.1%) from 68.487%
15561477203

Pull #9356

github

web-flow
Merge 6440b25db into c6d6d4c0b
Pull Request #9356: lnrpc: add incoming/outgoing channel ids filter to forwarding history request

33 of 36 new or added lines in 2 files covered. (91.67%)

28366 existing lines in 455 files now uncovered.

97715 of 167461 relevant lines covered (58.35%)

1.81 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