lnd/lnwire/stfu.go
2024-08-05 17:23:19 -07:00

82 lines
2.2 KiB
Go

package lnwire
import (
"bytes"
"io"
)
// Stfu is a message that is sent to lock the channel state prior to some other
// interactive protocol where channel updates need to be paused.
type Stfu struct {
// ChanID identifies which channel needs to be frozen.
ChanID ChannelID
// Initiator is a byte that identifies whether we are the initiator of
// this process.
Initiator bool
// 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
}
// A compile time check to ensure Stfu implements the lnwire.Message interface.
var _ Message = (*Stfu)(nil)
// Encode serializes the target Stfu into the passed io.Writer.
// Serialization will observe the rules defined by the passed protocol version.
//
// This is a part of the lnwire.Message interface.
func (s *Stfu) Encode(w *bytes.Buffer, _ uint32) error {
if err := WriteChannelID(w, s.ChanID); err != nil {
return err
}
if err := WriteBool(w, s.Initiator); err != nil {
return err
}
return WriteBytes(w, s.ExtraData)
}
// Decode deserializes the serialized Stfu stored in the passed io.Reader
// into the target Stfu using the deserialization rules defined by the
// passed protocol version.
//
// This is a part of the lnwire.Message interface.
func (s *Stfu) Decode(r io.Reader, _ uint32) error {
if err := ReadElements(
r, &s.ChanID, &s.Initiator, &s.ExtraData,
); err != nil {
return err
}
// This is required to pass the fuzz test round trip equality check.
if len(s.ExtraData) == 0 {
s.ExtraData = nil
}
return nil
}
// MsgType returns the MessageType code which uniquely identifies this message
// as a Stfu on the wire.
//
// This is part of the lnwire.Message interface.
func (s *Stfu) MsgType() MessageType {
return MsgStfu
}
// A compile time check to ensure Stfu implements the
// lnwire.LinkUpdater interface.
var _ LinkUpdater = (*Stfu)(nil)
// TargetChanID returns the channel id of the link for which this message is
// intended.
//
// NOTE: Part of peer.LinkUpdater interface.
func (s *Stfu) TargetChanID() ChannelID {
return s.ChanID
}