github.com/decred/dcrlnd@v0.7.6/lnwire/update_fail_malformed_htlc.go (about)

     1  package lnwire
     2  
     3  import (
     4  	"bytes"
     5  	"crypto/sha256"
     6  	"io"
     7  )
     8  
     9  // UpdateFailMalformedHTLC is sent by either the payment forwarder or by
    10  // payment receiver to the payment sender in order to notify it that the onion
    11  // blob can't be parsed. For that reason we send this message instead of
    12  // obfuscate the onion failure.
    13  type UpdateFailMalformedHTLC struct {
    14  	// ChanID is the particular active channel that this
    15  	// UpdateFailMalformedHTLC is bound to.
    16  	ChanID ChannelID
    17  
    18  	// ID references which HTLC on the remote node's commitment transaction
    19  	// has timed out.
    20  	ID uint64
    21  
    22  	// ShaOnionBlob hash of the onion blob on which can't be parsed by the
    23  	// node in the payment path.
    24  	ShaOnionBlob [sha256.Size]byte
    25  
    26  	// FailureCode the exact reason why onion blob haven't been parsed.
    27  	FailureCode FailCode
    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 UpdateFailMalformedHTLC implements the
    36  // lnwire.Message interface.
    37  var _ Message = (*UpdateFailMalformedHTLC)(nil)
    38  
    39  // Decode deserializes a serialized UpdateFailMalformedHTLC message stored in the passed
    40  // io.Reader observing the specified protocol version.
    41  //
    42  // This is part of the lnwire.Message interface.
    43  func (c *UpdateFailMalformedHTLC) Decode(r io.Reader, pver uint32) error {
    44  	return ReadElements(r,
    45  		&c.ChanID,
    46  		&c.ID,
    47  		c.ShaOnionBlob[:],
    48  		&c.FailureCode,
    49  		&c.ExtraData,
    50  	)
    51  }
    52  
    53  // Encode serializes the target UpdateFailMalformedHTLC into the passed
    54  // io.Writer observing the protocol version specified.
    55  //
    56  // This is part of the lnwire.Message interface.
    57  func (c *UpdateFailMalformedHTLC) Encode(w *bytes.Buffer,
    58  	pver uint32) error {
    59  
    60  	if err := WriteChannelID(w, c.ChanID); err != nil {
    61  		return err
    62  	}
    63  
    64  	if err := WriteUint64(w, c.ID); err != nil {
    65  		return err
    66  	}
    67  
    68  	if err := WriteBytes(w, c.ShaOnionBlob[:]); err != nil {
    69  		return err
    70  	}
    71  
    72  	if err := WriteFailCode(w, c.FailureCode); err != nil {
    73  		return err
    74  	}
    75  
    76  	return WriteBytes(w, c.ExtraData)
    77  }
    78  
    79  // MsgType returns the integer uniquely identifying this message type on the
    80  // wire.
    81  //
    82  // This is part of the lnwire.Message interface.
    83  func (c *UpdateFailMalformedHTLC) MsgType() MessageType {
    84  	return MsgUpdateFailMalformedHTLC
    85  }
    86  
    87  // TargetChanID returns the channel id of the link for which this message is
    88  // intended.
    89  //
    90  // NOTE: Part of peer.LinkUpdater interface.
    91  func (c *UpdateFailMalformedHTLC) TargetChanID() ChannelID {
    92  	return c.ChanID
    93  }