mirror of
https://github.com/lightningnetwork/lnd.git
synced 2024-11-19 09:53:54 +01:00
3d88017b38
These two messages will be used to implement the new and improved co-op closing protocol. This PR also show cases how to use the new `tlv.OptionalRecord` type to define and handle TLV level parsing. I think we can make one additional helper function to clean up some of the boiler plate for the encode/decode.
77 lines
2.0 KiB
Go
77 lines
2.0 KiB
Go
package lnwire
|
|
|
|
import (
|
|
"bytes"
|
|
"io"
|
|
)
|
|
|
|
// ClosingSig is sent in response to a ClosingComplete message. It carries the
|
|
// signatures of the closee to the closer.
|
|
type ClosingSig struct {
|
|
// ChannelID serves to identify which channel is to be closed.
|
|
ChannelID ChannelID
|
|
|
|
// ClosingSigs houses the 3 possible signatures that can be sent.
|
|
ClosingSigs
|
|
|
|
// 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.
|
|
ExtraData ExtraOpaqueData
|
|
}
|
|
|
|
// Decode deserializes a serialized ClosingSig message stored in the passed
|
|
// io.Reader.
|
|
func (c *ClosingSig) Decode(r io.Reader, _ uint32) error {
|
|
// First, read out all the fields that are hard coded into the message.
|
|
err := ReadElements(r, &c.ChannelID)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
// With the hard coded messages read, we'll now read out the TLV fields
|
|
// of the message.
|
|
var tlvRecords ExtraOpaqueData
|
|
if err := ReadElements(r, &tlvRecords); err != nil {
|
|
return err
|
|
}
|
|
|
|
if err := decodeClosingSigs(&c.ClosingSigs, tlvRecords); err != nil {
|
|
return err
|
|
}
|
|
|
|
if len(tlvRecords) != 0 {
|
|
c.ExtraData = tlvRecords
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// Encode serializes the target ClosingSig into the passed io.Writer.
|
|
func (c *ClosingSig) Encode(w *bytes.Buffer, _ uint32) error {
|
|
if err := WriteChannelID(w, c.ChannelID); err != nil {
|
|
return err
|
|
}
|
|
|
|
recordProducers := closingSigRecords(&c.ClosingSigs)
|
|
|
|
err := EncodeMessageExtraData(&c.ExtraData, recordProducers...)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
return WriteBytes(w, c.ExtraData)
|
|
}
|
|
|
|
// MsgType returns the uint32 code which uniquely identifies this message as a
|
|
// ClosingSig message on the wire.
|
|
//
|
|
// This is part of the lnwire.Message interface.
|
|
func (c *ClosingSig) MsgType() MessageType {
|
|
return MsgClosingSig
|
|
}
|
|
|
|
// A compile time check to ensure ClosingSig implements the lnwire.Message
|
|
// interface.
|
|
var _ Message = (*ClosingSig)(nil)
|