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 }