diff --git a/lnwire/channel_ready.go b/lnwire/channel_ready.go index 518dac304..07872f800 100644 --- a/lnwire/channel_ready.go +++ b/lnwire/channel_ready.go @@ -27,6 +27,12 @@ type ChannelReady struct { // ShortChannelID for forwarding. AliasScid *ShortChannelID + // NextLocalNonce is an optional field that stores a local musig2 nonce. + // This will only be populated if the simple taproot channels type was + // negotiated. This is the local nonce that will be used by the sender + // to accept a new commitment state transition. + NextLocalNonce *Musig2Nonce + // ExtraData is the set of data that was appended to this message to // fill out the full maximum transport message size. These fields can // be used to specify optional data such as custom TLV fields. @@ -39,7 +45,7 @@ func NewChannelReady(cid ChannelID, npcp *btcec.PublicKey) *ChannelReady { return &ChannelReady{ ChanID: cid, NextPerCommitmentPoint: npcp, - ExtraData: make([]byte, 0), + ExtraData: nil, } } @@ -57,16 +63,25 @@ func (c *ChannelReady) Decode(r io.Reader, _ uint32) error { err := ReadElements(r, &c.ChanID, &c.NextPerCommitmentPoint, - &c.ExtraData, ) if err != nil { return err } + var tlvRecords ExtraOpaqueData + if err := ReadElements(r, &tlvRecords); err != nil { + return err + } + // Next we'll parse out the set of known records. For now, this is just // the AliasScidRecordType. - var aliasScid ShortChannelID - typeMap, err := c.ExtraData.ExtractRecords(&aliasScid) + var ( + aliasScid ShortChannelID + localNonce Musig2Nonce + ) + typeMap, err := tlvRecords.ExtractRecords( + &aliasScid, &localNonce, + ) if err != nil { return err } @@ -76,6 +91,13 @@ func (c *ChannelReady) Decode(r io.Reader, _ uint32) error { if val, ok := typeMap[AliasScidRecordType]; ok && val == nil { c.AliasScid = &aliasScid } + if val, ok := typeMap[NonceRecordType]; ok && val == nil { + c.NextLocalNonce = &localNonce + } + + if len(tlvRecords) != 0 { + c.ExtraData = tlvRecords + } return nil } @@ -95,12 +117,16 @@ func (c *ChannelReady) Encode(w *bytes.Buffer, _ uint32) error { } // We'll only encode the AliasScid in a TLV segment if it exists. + recordProducers := make([]tlv.RecordProducer, 0, 2) if c.AliasScid != nil { - recordProducers := []tlv.RecordProducer{c.AliasScid} - err := EncodeMessageExtraData(&c.ExtraData, recordProducers...) - if err != nil { - return err - } + recordProducers = append(recordProducers, c.AliasScid) + } + if c.NextLocalNonce != nil { + recordProducers = append(recordProducers, c.NextLocalNonce) + } + err := EncodeMessageExtraData(&c.ExtraData, recordProducers...) + if err != nil { + return err } return WriteBytes(w, c.ExtraData)