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

lightningnetwork / lnd / 13211764208

08 Feb 2025 03:08AM UTC coverage: 49.288% (-9.5%) from 58.815%
13211764208

Pull #9489

github

calvinrzachman
itest: verify switchrpc server enforces send then track

We prevent the rpc server from allowing onion dispatches for
attempt IDs which have already been tracked by rpc clients.

This helps protect the client from leaking a duplicate onion
attempt. NOTE: This is not the only method for solving this
issue! The issue could be addressed via careful client side
programming which accounts for the uncertainty and async
nature of dispatching onions to a remote process via RPC.
This would require some lnd ChannelRouter changes for how
we intend to use these RPCs though.
Pull Request #9489: multi: add BuildOnion, SendOnion, and TrackOnion RPCs

474 of 990 new or added lines in 11 files covered. (47.88%)

27321 existing lines in 435 files now uncovered.

101192 of 205306 relevant lines covered (49.29%)

1.54 hits per line

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

70.0
/lnwire/funding_signed.go
1
package lnwire
2

3
import (
4
        "bytes"
5
        "io"
6

7
        "github.com/lightningnetwork/lnd/tlv"
8
)
9

10
// FundingSigned is sent from Bob (the responder) to Alice (the initiator)
11
// after receiving the funding outpoint and her signature for Bob's version of
12
// the commitment transaction.
13
type FundingSigned struct {
14
        // ChannelPoint is the particular active channel that this
15
        // FundingSigned is bound to.
16
        ChanID ChannelID
17

18
        // CommitSig is Bob's signature for Alice's version of the commitment
19
        // transaction.
20
        CommitSig Sig
21

22
        // PartialSig is used to transmit a musig2 extended partial signature
23
        // that also carries along the public nonce of the signer.
24
        //
25
        // NOTE: This field is only populated if a musig2 taproot channel is
26
        // being signed for. In this case, the above Sig type MUST be blank.
27
        PartialSig OptPartialSigWithNonceTLV
28

29
        // ExtraData is the set of data that was appended to this message to
30
        // fill out the full maximum transport message size. These fields can
31
        // be used to specify optional data such as custom TLV fields.
32
        ExtraData ExtraOpaqueData
33
}
34

35
// A compile time check to ensure FundingSigned implements the lnwire.Message
36
// interface.
37
var _ Message = (*FundingSigned)(nil)
38

39
// Encode serializes the target FundingSigned into the passed io.Writer
40
// implementation. Serialization will observe the rules defined by the passed
41
// protocol version.
42
//
43
// This is part of the lnwire.Message interface.
44
func (f *FundingSigned) Encode(w *bytes.Buffer, pver uint32) error {
3✔
45
        recordProducers := make([]tlv.RecordProducer, 0, 1)
3✔
46
        f.PartialSig.WhenSome(func(sig PartialSigWithNonceTLV) {
6✔
47
                recordProducers = append(recordProducers, &sig)
3✔
48
        })
3✔
49
        err := EncodeMessageExtraData(&f.ExtraData, recordProducers...)
3✔
50
        if err != nil {
3✔
51
                return err
×
52
        }
×
53

54
        if err := WriteChannelID(w, f.ChanID); err != nil {
3✔
55
                return err
×
56
        }
×
57

58
        if err := WriteSig(w, f.CommitSig); err != nil {
3✔
59
                return err
×
60
        }
×
61

62
        return WriteBytes(w, f.ExtraData)
3✔
63
}
64

65
// Decode deserializes the serialized FundingSigned stored in the passed
66
// io.Reader into the target FundingSigned using the deserialization rules
67
// defined by the passed protocol version.
68
//
69
// This is part of the lnwire.Message interface.
70
func (f *FundingSigned) Decode(r io.Reader, pver uint32) error {
3✔
71
        err := ReadElements(r, &f.ChanID, &f.CommitSig)
3✔
72
        if err != nil {
3✔
UNCOV
73
                return err
×
UNCOV
74
        }
×
75

76
        var tlvRecords ExtraOpaqueData
3✔
77
        if err := ReadElements(r, &tlvRecords); err != nil {
3✔
78
                return err
×
79
        }
×
80

81
        partialSig := f.PartialSig.Zero()
3✔
82
        typeMap, err := tlvRecords.ExtractRecords(&partialSig)
3✔
83
        if err != nil {
3✔
UNCOV
84
                return err
×
UNCOV
85
        }
×
86

87
        // Set the corresponding TLV types if they were included in the stream.
88
        if val, ok := typeMap[f.PartialSig.TlvType()]; ok && val == nil {
6✔
89
                f.PartialSig = tlv.SomeRecordT(partialSig)
3✔
90
        }
3✔
91

92
        if len(tlvRecords) != 0 {
6✔
93
                f.ExtraData = tlvRecords
3✔
94
        }
3✔
95

96
        return nil
3✔
97
}
98

99
// MsgType returns the uint32 code which uniquely identifies this message as a
100
// FundingSigned on the wire.
101
//
102
// This is part of the lnwire.Message interface.
103
func (f *FundingSigned) MsgType() MessageType {
3✔
104
        return MsgFundingSigned
3✔
105
}
3✔
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