lightning/ln/
wire.rs

1// This file is Copyright its original authors, visible in version control
2// history.
3//
4// This file is licensed under the Apache License, Version 2.0 <LICENSE-APACHE
5// or http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
6// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your option.
7// You may not use this file except in accordance with one or both of these
8// licenses.
9
10//! Wire encoding/decoding for Lightning messages according to [BOLT #1], and for
11//! custom message through the [`CustomMessageReader`] trait.
12//!
13//! [BOLT #1]: https://github.com/lightning/bolts/blob/master/01-messaging.md
14
15use crate::io;
16use crate::ln::msgs;
17use crate::util::ser::{LengthLimitedRead, LengthReadable, Readable, Writeable, Writer};
18
19/// Trait to be implemented by custom message (unrelated to the channel/gossip LN layers)
20/// decoders.
21pub trait CustomMessageReader {
22	/// The type of the message decoded by the implementation.
23	type CustomMessage: Type;
24	/// Decodes a custom message to `CustomMessageType`. If the given message type is known to the
25	/// implementation and the message could be decoded, must return `Ok(Some(message))`. If the
26	/// message type is unknown to the implementation, must return `Ok(None)`. If a decoding error
27	/// occur, must return `Err(DecodeError::X)` where `X` details the encountered error.
28	fn read<R: LengthLimitedRead>(
29		&self, message_type: u16, buffer: &mut R,
30	) -> Result<Option<Self::CustomMessage>, msgs::DecodeError>;
31}
32
33// TestEq is a dummy trait which requires PartialEq when built in testing, and otherwise is
34// blanket-implemented for all types.
35
36#[cfg(test)]
37pub trait TestEq: PartialEq {}
38#[cfg(test)]
39impl<T: PartialEq> TestEq for T {}
40
41#[cfg(not(test))]
42pub(crate) trait TestEq {}
43#[cfg(not(test))]
44impl<T> TestEq for T {}
45
46/// A Lightning message returned by [`read`] when decoding bytes received over the wire. Each
47/// variant contains a message from [`msgs`] or otherwise the message type if unknown.
48#[allow(missing_docs)]
49#[derive(Debug)]
50#[cfg_attr(any(test, feature = "_test_utils"), derive(PartialEq))]
51pub(crate) enum Message<T: core::fmt::Debug + Type + TestEq> {
52	Init(msgs::Init),
53	Error(msgs::ErrorMessage),
54	Warning(msgs::WarningMessage),
55	Ping(msgs::Ping),
56	Pong(msgs::Pong),
57	PeerStorage(msgs::PeerStorage),
58	PeerStorageRetrieval(msgs::PeerStorageRetrieval),
59	OpenChannel(msgs::OpenChannel),
60	OpenChannelV2(msgs::OpenChannelV2),
61	AcceptChannel(msgs::AcceptChannel),
62	AcceptChannelV2(msgs::AcceptChannelV2),
63	FundingCreated(msgs::FundingCreated),
64	FundingSigned(msgs::FundingSigned),
65	Stfu(msgs::Stfu),
66	SpliceInit(msgs::SpliceInit),
67	SpliceAck(msgs::SpliceAck),
68	SpliceLocked(msgs::SpliceLocked),
69	TxAddInput(msgs::TxAddInput),
70	TxAddOutput(msgs::TxAddOutput),
71	TxRemoveInput(msgs::TxRemoveInput),
72	TxRemoveOutput(msgs::TxRemoveOutput),
73	TxComplete(msgs::TxComplete),
74	TxSignatures(msgs::TxSignatures),
75	TxInitRbf(msgs::TxInitRbf),
76	TxAckRbf(msgs::TxAckRbf),
77	TxAbort(msgs::TxAbort),
78	ChannelReady(msgs::ChannelReady),
79	Shutdown(msgs::Shutdown),
80	ClosingSigned(msgs::ClosingSigned),
81	#[cfg(simple_close)]
82	ClosingComplete(msgs::ClosingComplete),
83	#[cfg(simple_close)]
84	ClosingSig(msgs::ClosingSig),
85	OnionMessage(msgs::OnionMessage),
86	StartBatch(msgs::StartBatch),
87	UpdateAddHTLC(msgs::UpdateAddHTLC),
88	UpdateFulfillHTLC(msgs::UpdateFulfillHTLC),
89	UpdateFailHTLC(msgs::UpdateFailHTLC),
90	UpdateFailMalformedHTLC(msgs::UpdateFailMalformedHTLC),
91	CommitmentSigned(msgs::CommitmentSigned),
92	RevokeAndACK(msgs::RevokeAndACK),
93	UpdateFee(msgs::UpdateFee),
94	ChannelReestablish(msgs::ChannelReestablish),
95	AnnouncementSignatures(msgs::AnnouncementSignatures),
96	ChannelAnnouncement(msgs::ChannelAnnouncement),
97	NodeAnnouncement(msgs::NodeAnnouncement),
98	ChannelUpdate(msgs::ChannelUpdate),
99	QueryShortChannelIds(msgs::QueryShortChannelIds),
100	ReplyShortChannelIdsEnd(msgs::ReplyShortChannelIdsEnd),
101	QueryChannelRange(msgs::QueryChannelRange),
102	ReplyChannelRange(msgs::ReplyChannelRange),
103	GossipTimestampFilter(msgs::GossipTimestampFilter),
104	/// A message that could not be decoded because its type is unknown.
105	Unknown(u16),
106	/// A message that was produced by a [`CustomMessageReader`] and is to be handled by a
107	/// [`crate::ln::peer_handler::CustomMessageHandler`].
108	Custom(T),
109}
110
111impl<T: core::fmt::Debug + Type + TestEq> Writeable for Message<T> {
112	fn write<W: Writer>(&self, writer: &mut W) -> Result<(), io::Error> {
113		match self {
114			&Message::Init(ref msg) => msg.write(writer),
115			&Message::Error(ref msg) => msg.write(writer),
116			&Message::Warning(ref msg) => msg.write(writer),
117			&Message::Ping(ref msg) => msg.write(writer),
118			&Message::Pong(ref msg) => msg.write(writer),
119			&Message::PeerStorage(ref msg) => msg.write(writer),
120			&Message::PeerStorageRetrieval(ref msg) => msg.write(writer),
121			&Message::OpenChannel(ref msg) => msg.write(writer),
122			&Message::OpenChannelV2(ref msg) => msg.write(writer),
123			&Message::AcceptChannel(ref msg) => msg.write(writer),
124			&Message::AcceptChannelV2(ref msg) => msg.write(writer),
125			&Message::FundingCreated(ref msg) => msg.write(writer),
126			&Message::FundingSigned(ref msg) => msg.write(writer),
127			&Message::Stfu(ref msg) => msg.write(writer),
128			&Message::SpliceInit(ref msg) => msg.write(writer),
129			&Message::SpliceAck(ref msg) => msg.write(writer),
130			&Message::SpliceLocked(ref msg) => msg.write(writer),
131			&Message::TxAddInput(ref msg) => msg.write(writer),
132			&Message::TxAddOutput(ref msg) => msg.write(writer),
133			&Message::TxRemoveInput(ref msg) => msg.write(writer),
134			&Message::TxRemoveOutput(ref msg) => msg.write(writer),
135			&Message::TxComplete(ref msg) => msg.write(writer),
136			&Message::TxSignatures(ref msg) => msg.write(writer),
137			&Message::TxInitRbf(ref msg) => msg.write(writer),
138			&Message::TxAckRbf(ref msg) => msg.write(writer),
139			&Message::TxAbort(ref msg) => msg.write(writer),
140			&Message::ChannelReady(ref msg) => msg.write(writer),
141			&Message::Shutdown(ref msg) => msg.write(writer),
142			&Message::ClosingSigned(ref msg) => msg.write(writer),
143			#[cfg(simple_close)]
144			&Message::ClosingComplete(ref msg) => msg.write(writer),
145			#[cfg(simple_close)]
146			&Message::ClosingSig(ref msg) => msg.write(writer),
147			&Message::OnionMessage(ref msg) => msg.write(writer),
148			&Message::StartBatch(ref msg) => msg.write(writer),
149			&Message::UpdateAddHTLC(ref msg) => msg.write(writer),
150			&Message::UpdateFulfillHTLC(ref msg) => msg.write(writer),
151			&Message::UpdateFailHTLC(ref msg) => msg.write(writer),
152			&Message::UpdateFailMalformedHTLC(ref msg) => msg.write(writer),
153			&Message::CommitmentSigned(ref msg) => msg.write(writer),
154			&Message::RevokeAndACK(ref msg) => msg.write(writer),
155			&Message::UpdateFee(ref msg) => msg.write(writer),
156			&Message::ChannelReestablish(ref msg) => msg.write(writer),
157			&Message::AnnouncementSignatures(ref msg) => msg.write(writer),
158			&Message::ChannelAnnouncement(ref msg) => msg.write(writer),
159			&Message::NodeAnnouncement(ref msg) => msg.write(writer),
160			&Message::ChannelUpdate(ref msg) => msg.write(writer),
161			&Message::QueryShortChannelIds(ref msg) => msg.write(writer),
162			&Message::ReplyShortChannelIdsEnd(ref msg) => msg.write(writer),
163			&Message::QueryChannelRange(ref msg) => msg.write(writer),
164			&Message::ReplyChannelRange(ref msg) => msg.write(writer),
165			&Message::GossipTimestampFilter(ref msg) => msg.write(writer),
166			&Message::Unknown(_) => Ok(()),
167			&Message::Custom(ref msg) => msg.write(writer),
168		}
169	}
170}
171
172impl<T: core::fmt::Debug + Type + TestEq> Type for Message<T> {
173	/// Returns the type that was used to decode the message payload.
174	fn type_id(&self) -> u16 {
175		match self {
176			&Message::Init(ref msg) => msg.type_id(),
177			&Message::Error(ref msg) => msg.type_id(),
178			&Message::Warning(ref msg) => msg.type_id(),
179			&Message::Ping(ref msg) => msg.type_id(),
180			&Message::Pong(ref msg) => msg.type_id(),
181			&Message::PeerStorage(ref msg) => msg.type_id(),
182			&Message::PeerStorageRetrieval(ref msg) => msg.type_id(),
183			&Message::OpenChannel(ref msg) => msg.type_id(),
184			&Message::OpenChannelV2(ref msg) => msg.type_id(),
185			&Message::AcceptChannel(ref msg) => msg.type_id(),
186			&Message::AcceptChannelV2(ref msg) => msg.type_id(),
187			&Message::FundingCreated(ref msg) => msg.type_id(),
188			&Message::FundingSigned(ref msg) => msg.type_id(),
189			&Message::Stfu(ref msg) => msg.type_id(),
190			&Message::SpliceInit(ref msg) => msg.type_id(),
191			&Message::SpliceAck(ref msg) => msg.type_id(),
192			&Message::SpliceLocked(ref msg) => msg.type_id(),
193			&Message::TxAddInput(ref msg) => msg.type_id(),
194			&Message::TxAddOutput(ref msg) => msg.type_id(),
195			&Message::TxRemoveInput(ref msg) => msg.type_id(),
196			&Message::TxRemoveOutput(ref msg) => msg.type_id(),
197			&Message::TxComplete(ref msg) => msg.type_id(),
198			&Message::TxSignatures(ref msg) => msg.type_id(),
199			&Message::TxInitRbf(ref msg) => msg.type_id(),
200			&Message::TxAckRbf(ref msg) => msg.type_id(),
201			&Message::TxAbort(ref msg) => msg.type_id(),
202			&Message::ChannelReady(ref msg) => msg.type_id(),
203			&Message::Shutdown(ref msg) => msg.type_id(),
204			&Message::ClosingSigned(ref msg) => msg.type_id(),
205			#[cfg(simple_close)]
206			&Message::ClosingComplete(ref msg) => msg.type_id(),
207			#[cfg(simple_close)]
208			&Message::ClosingSig(ref msg) => msg.type_id(),
209			&Message::OnionMessage(ref msg) => msg.type_id(),
210			&Message::StartBatch(ref msg) => msg.type_id(),
211			&Message::UpdateAddHTLC(ref msg) => msg.type_id(),
212			&Message::UpdateFulfillHTLC(ref msg) => msg.type_id(),
213			&Message::UpdateFailHTLC(ref msg) => msg.type_id(),
214			&Message::UpdateFailMalformedHTLC(ref msg) => msg.type_id(),
215			&Message::CommitmentSigned(ref msg) => msg.type_id(),
216			&Message::RevokeAndACK(ref msg) => msg.type_id(),
217			&Message::UpdateFee(ref msg) => msg.type_id(),
218			&Message::ChannelReestablish(ref msg) => msg.type_id(),
219			&Message::AnnouncementSignatures(ref msg) => msg.type_id(),
220			&Message::ChannelAnnouncement(ref msg) => msg.type_id(),
221			&Message::NodeAnnouncement(ref msg) => msg.type_id(),
222			&Message::ChannelUpdate(ref msg) => msg.type_id(),
223			&Message::QueryShortChannelIds(ref msg) => msg.type_id(),
224			&Message::ReplyShortChannelIdsEnd(ref msg) => msg.type_id(),
225			&Message::QueryChannelRange(ref msg) => msg.type_id(),
226			&Message::ReplyChannelRange(ref msg) => msg.type_id(),
227			&Message::GossipTimestampFilter(ref msg) => msg.type_id(),
228			&Message::Unknown(type_id) => type_id,
229			&Message::Custom(ref msg) => msg.type_id(),
230		}
231	}
232}
233
234impl<T: core::fmt::Debug + Type + TestEq> Message<T> {
235	/// Returns whether the message's type is even, indicating both endpoints must support it.
236	pub fn is_even(&self) -> bool {
237		(self.type_id() & 1) == 0
238	}
239}
240
241/// Reads a message from the data buffer consisting of a 2-byte big-endian type and a
242/// variable-length payload conforming to the type.
243///
244/// # Errors
245///
246/// Returns an error if the message payload could not be decoded as the specified type.
247pub(crate) fn read<R: LengthLimitedRead, T, H: core::ops::Deref>(
248	buffer: &mut R, custom_reader: H,
249) -> Result<Message<T>, (msgs::DecodeError, Option<u16>)>
250where
251	T: core::fmt::Debug + Type + Writeable,
252	H::Target: CustomMessageReader<CustomMessage = T>,
253{
254	let message_type = <u16 as Readable>::read(buffer).map_err(|e| (e, None))?;
255	do_read(buffer, message_type, custom_reader).map_err(|e| (e, Some(message_type)))
256}
257
258fn do_read<R: LengthLimitedRead, T, H: core::ops::Deref>(
259	buffer: &mut R, message_type: u16, custom_reader: H,
260) -> Result<Message<T>, msgs::DecodeError>
261where
262	T: core::fmt::Debug + Type + Writeable,
263	H::Target: CustomMessageReader<CustomMessage = T>,
264{
265	match message_type {
266		msgs::Init::TYPE => {
267			Ok(Message::Init(LengthReadable::read_from_fixed_length_buffer(buffer)?))
268		},
269		msgs::ErrorMessage::TYPE => {
270			Ok(Message::Error(LengthReadable::read_from_fixed_length_buffer(buffer)?))
271		},
272		msgs::WarningMessage::TYPE => {
273			Ok(Message::Warning(LengthReadable::read_from_fixed_length_buffer(buffer)?))
274		},
275		msgs::Ping::TYPE => {
276			Ok(Message::Ping(LengthReadable::read_from_fixed_length_buffer(buffer)?))
277		},
278		msgs::Pong::TYPE => {
279			Ok(Message::Pong(LengthReadable::read_from_fixed_length_buffer(buffer)?))
280		},
281		msgs::PeerStorage::TYPE => {
282			Ok(Message::PeerStorage(LengthReadable::read_from_fixed_length_buffer(buffer)?))
283		},
284		msgs::PeerStorageRetrieval::TYPE => Ok(Message::PeerStorageRetrieval(
285			LengthReadable::read_from_fixed_length_buffer(buffer)?,
286		)),
287		msgs::OpenChannel::TYPE => {
288			Ok(Message::OpenChannel(LengthReadable::read_from_fixed_length_buffer(buffer)?))
289		},
290		msgs::OpenChannelV2::TYPE => {
291			Ok(Message::OpenChannelV2(LengthReadable::read_from_fixed_length_buffer(buffer)?))
292		},
293		msgs::AcceptChannel::TYPE => {
294			Ok(Message::AcceptChannel(LengthReadable::read_from_fixed_length_buffer(buffer)?))
295		},
296		msgs::AcceptChannelV2::TYPE => {
297			Ok(Message::AcceptChannelV2(LengthReadable::read_from_fixed_length_buffer(buffer)?))
298		},
299		msgs::FundingCreated::TYPE => {
300			Ok(Message::FundingCreated(LengthReadable::read_from_fixed_length_buffer(buffer)?))
301		},
302		msgs::FundingSigned::TYPE => {
303			Ok(Message::FundingSigned(LengthReadable::read_from_fixed_length_buffer(buffer)?))
304		},
305		msgs::SpliceInit::TYPE => {
306			Ok(Message::SpliceInit(LengthReadable::read_from_fixed_length_buffer(buffer)?))
307		},
308		msgs::Stfu::TYPE => {
309			Ok(Message::Stfu(LengthReadable::read_from_fixed_length_buffer(buffer)?))
310		},
311		msgs::SpliceAck::TYPE => {
312			Ok(Message::SpliceAck(LengthReadable::read_from_fixed_length_buffer(buffer)?))
313		},
314		msgs::SpliceLocked::TYPE => {
315			Ok(Message::SpliceLocked(LengthReadable::read_from_fixed_length_buffer(buffer)?))
316		},
317		msgs::TxAddInput::TYPE => {
318			Ok(Message::TxAddInput(LengthReadable::read_from_fixed_length_buffer(buffer)?))
319		},
320		msgs::TxAddOutput::TYPE => {
321			Ok(Message::TxAddOutput(LengthReadable::read_from_fixed_length_buffer(buffer)?))
322		},
323		msgs::TxRemoveInput::TYPE => {
324			Ok(Message::TxRemoveInput(LengthReadable::read_from_fixed_length_buffer(buffer)?))
325		},
326		msgs::TxRemoveOutput::TYPE => {
327			Ok(Message::TxRemoveOutput(LengthReadable::read_from_fixed_length_buffer(buffer)?))
328		},
329		msgs::TxComplete::TYPE => {
330			Ok(Message::TxComplete(LengthReadable::read_from_fixed_length_buffer(buffer)?))
331		},
332		msgs::TxSignatures::TYPE => {
333			Ok(Message::TxSignatures(LengthReadable::read_from_fixed_length_buffer(buffer)?))
334		},
335		msgs::TxInitRbf::TYPE => {
336			Ok(Message::TxInitRbf(LengthReadable::read_from_fixed_length_buffer(buffer)?))
337		},
338		msgs::TxAckRbf::TYPE => {
339			Ok(Message::TxAckRbf(LengthReadable::read_from_fixed_length_buffer(buffer)?))
340		},
341		msgs::TxAbort::TYPE => {
342			Ok(Message::TxAbort(LengthReadable::read_from_fixed_length_buffer(buffer)?))
343		},
344		msgs::ChannelReady::TYPE => {
345			Ok(Message::ChannelReady(LengthReadable::read_from_fixed_length_buffer(buffer)?))
346		},
347		msgs::Shutdown::TYPE => {
348			Ok(Message::Shutdown(LengthReadable::read_from_fixed_length_buffer(buffer)?))
349		},
350		msgs::ClosingSigned::TYPE => {
351			Ok(Message::ClosingSigned(LengthReadable::read_from_fixed_length_buffer(buffer)?))
352		},
353		#[cfg(simple_close)]
354		msgs::ClosingComplete::TYPE => {
355			Ok(Message::ClosingComplete(LengthReadable::read_from_fixed_length_buffer(buffer)?))
356		},
357		#[cfg(simple_close)]
358		msgs::ClosingSig::TYPE => {
359			Ok(Message::ClosingSig(LengthReadable::read_from_fixed_length_buffer(buffer)?))
360		},
361		msgs::OnionMessage::TYPE => {
362			Ok(Message::OnionMessage(LengthReadable::read_from_fixed_length_buffer(buffer)?))
363		},
364		msgs::StartBatch::TYPE => {
365			Ok(Message::StartBatch(LengthReadable::read_from_fixed_length_buffer(buffer)?))
366		},
367		msgs::UpdateAddHTLC::TYPE => {
368			Ok(Message::UpdateAddHTLC(LengthReadable::read_from_fixed_length_buffer(buffer)?))
369		},
370		msgs::UpdateFulfillHTLC::TYPE => {
371			Ok(Message::UpdateFulfillHTLC(LengthReadable::read_from_fixed_length_buffer(buffer)?))
372		},
373		msgs::UpdateFailHTLC::TYPE => {
374			Ok(Message::UpdateFailHTLC(LengthReadable::read_from_fixed_length_buffer(buffer)?))
375		},
376		msgs::UpdateFailMalformedHTLC::TYPE => Ok(Message::UpdateFailMalformedHTLC(
377			LengthReadable::read_from_fixed_length_buffer(buffer)?,
378		)),
379		msgs::CommitmentSigned::TYPE => {
380			Ok(Message::CommitmentSigned(LengthReadable::read_from_fixed_length_buffer(buffer)?))
381		},
382		msgs::RevokeAndACK::TYPE => {
383			Ok(Message::RevokeAndACK(LengthReadable::read_from_fixed_length_buffer(buffer)?))
384		},
385		msgs::UpdateFee::TYPE => {
386			Ok(Message::UpdateFee(LengthReadable::read_from_fixed_length_buffer(buffer)?))
387		},
388		msgs::ChannelReestablish::TYPE => {
389			Ok(Message::ChannelReestablish(LengthReadable::read_from_fixed_length_buffer(buffer)?))
390		},
391		msgs::AnnouncementSignatures::TYPE => Ok(Message::AnnouncementSignatures(
392			LengthReadable::read_from_fixed_length_buffer(buffer)?,
393		)),
394		msgs::ChannelAnnouncement::TYPE => {
395			Ok(Message::ChannelAnnouncement(LengthReadable::read_from_fixed_length_buffer(buffer)?))
396		},
397		msgs::NodeAnnouncement::TYPE => {
398			Ok(Message::NodeAnnouncement(LengthReadable::read_from_fixed_length_buffer(buffer)?))
399		},
400		msgs::ChannelUpdate::TYPE => {
401			Ok(Message::ChannelUpdate(LengthReadable::read_from_fixed_length_buffer(buffer)?))
402		},
403		msgs::QueryShortChannelIds::TYPE => Ok(Message::QueryShortChannelIds(
404			LengthReadable::read_from_fixed_length_buffer(buffer)?,
405		)),
406		msgs::ReplyShortChannelIdsEnd::TYPE => Ok(Message::ReplyShortChannelIdsEnd(
407			LengthReadable::read_from_fixed_length_buffer(buffer)?,
408		)),
409		msgs::QueryChannelRange::TYPE => {
410			Ok(Message::QueryChannelRange(LengthReadable::read_from_fixed_length_buffer(buffer)?))
411		},
412		msgs::ReplyChannelRange::TYPE => {
413			Ok(Message::ReplyChannelRange(LengthReadable::read_from_fixed_length_buffer(buffer)?))
414		},
415		msgs::GossipTimestampFilter::TYPE => Ok(Message::GossipTimestampFilter(
416			LengthReadable::read_from_fixed_length_buffer(buffer)?,
417		)),
418		_ => {
419			if let Some(custom) = custom_reader.read(message_type, buffer)? {
420				Ok(Message::Custom(custom))
421			} else {
422				Ok(Message::Unknown(message_type))
423			}
424		},
425	}
426}
427
428/// Writes a message to the data buffer encoded as a 2-byte big-endian type and a variable-length
429/// payload.
430///
431/// # Errors
432///
433/// Returns an I/O error if the write could not be completed.
434pub(crate) fn write<M: Type + Writeable, W: Writer>(
435	message: &M, buffer: &mut W,
436) -> Result<(), io::Error> {
437	message.type_id().write(buffer)?;
438	message.write(buffer)
439}
440
441mod encode {
442	/// Defines a constant type identifier for reading messages from the wire.
443	pub trait Encode {
444		/// The type identifying the message payload.
445		const TYPE: u16;
446	}
447}
448
449pub(crate) use self::encode::Encode;
450
451#[cfg(not(test))]
452/// Defines a type identifier for sending messages over the wire.
453///
454/// Messages implementing this trait specify a type and must be [`Writeable`].
455pub trait Type: core::fmt::Debug + Writeable {
456	/// Returns the type identifying the message payload.
457	fn type_id(&self) -> u16;
458}
459
460#[cfg(test)]
461pub trait Type: core::fmt::Debug + Writeable + PartialEq {
462	fn type_id(&self) -> u16;
463}
464
465#[cfg(any(feature = "_test_utils", fuzzing, test))]
466impl Type for () {
467	fn type_id(&self) -> u16 {
468		unreachable!();
469	}
470}
471
472#[cfg(test)]
473impl<T: Encode + Writeable + core::fmt::Debug + PartialEq> Type for T {
474	fn type_id(&self) -> u16 {
475		T::TYPE
476	}
477}
478
479#[cfg(not(test))]
480impl<T: Encode + core::fmt::Debug + Writeable> Type for T {
481	fn type_id(&self) -> u16 {
482		T::TYPE
483	}
484}
485
486impl Encode for msgs::Stfu {
487	const TYPE: u16 = 2;
488}
489
490impl Encode for msgs::PeerStorage {
491	const TYPE: u16 = 7;
492}
493
494impl Encode for msgs::PeerStorageRetrieval {
495	const TYPE: u16 = 9;
496}
497
498impl Encode for msgs::Init {
499	const TYPE: u16 = 16;
500}
501
502impl Encode for msgs::ErrorMessage {
503	const TYPE: u16 = 17;
504}
505
506impl Encode for msgs::WarningMessage {
507	const TYPE: u16 = 1;
508}
509
510impl Encode for msgs::Ping {
511	const TYPE: u16 = 18;
512}
513
514impl Encode for msgs::Pong {
515	const TYPE: u16 = 19;
516}
517
518impl Encode for msgs::OpenChannel {
519	const TYPE: u16 = 32;
520}
521
522impl Encode for msgs::AcceptChannel {
523	const TYPE: u16 = 33;
524}
525
526impl Encode for msgs::FundingCreated {
527	const TYPE: u16 = 34;
528}
529
530impl Encode for msgs::FundingSigned {
531	const TYPE: u16 = 35;
532}
533
534impl Encode for msgs::ChannelReady {
535	const TYPE: u16 = 36;
536}
537
538impl Encode for msgs::Shutdown {
539	const TYPE: u16 = 38;
540}
541
542impl Encode for msgs::ClosingSigned {
543	const TYPE: u16 = 39;
544}
545
546impl Encode for msgs::ClosingComplete {
547	const TYPE: u16 = 40;
548}
549
550impl Encode for msgs::ClosingSig {
551	const TYPE: u16 = 41;
552}
553
554impl Encode for msgs::OpenChannelV2 {
555	const TYPE: u16 = 64;
556}
557
558impl Encode for msgs::AcceptChannelV2 {
559	const TYPE: u16 = 65;
560}
561
562impl Encode for msgs::SpliceInit {
563	// TODO(splicing) Double check with finalized spec; draft spec contains 80; previously it was 74 (conflict with tx_abort); CLN used 75
564	const TYPE: u16 = 80;
565}
566
567impl Encode for msgs::SpliceAck {
568	const TYPE: u16 = 81;
569}
570
571impl Encode for msgs::SpliceLocked {
572	const TYPE: u16 = 77;
573}
574
575impl Encode for msgs::TxAddInput {
576	const TYPE: u16 = 66;
577}
578
579impl Encode for msgs::TxAddOutput {
580	const TYPE: u16 = 67;
581}
582
583impl Encode for msgs::TxRemoveInput {
584	const TYPE: u16 = 68;
585}
586
587impl Encode for msgs::TxRemoveOutput {
588	const TYPE: u16 = 69;
589}
590
591impl Encode for msgs::TxComplete {
592	const TYPE: u16 = 70;
593}
594
595impl Encode for msgs::TxSignatures {
596	const TYPE: u16 = 71;
597}
598
599impl Encode for msgs::TxInitRbf {
600	const TYPE: u16 = 72;
601}
602
603impl Encode for msgs::TxAckRbf {
604	const TYPE: u16 = 73;
605}
606
607impl Encode for msgs::TxAbort {
608	const TYPE: u16 = 74;
609}
610
611impl Encode for msgs::OnionMessage {
612	const TYPE: u16 = 513;
613}
614
615impl Encode for msgs::StartBatch {
616	const TYPE: u16 = 127;
617}
618
619impl Encode for msgs::UpdateAddHTLC {
620	const TYPE: u16 = 128;
621}
622
623impl Encode for msgs::UpdateFulfillHTLC {
624	const TYPE: u16 = 130;
625}
626
627impl Encode for msgs::UpdateFailHTLC {
628	const TYPE: u16 = 131;
629}
630
631impl Encode for msgs::UpdateFailMalformedHTLC {
632	const TYPE: u16 = 135;
633}
634
635impl Encode for msgs::CommitmentSigned {
636	const TYPE: u16 = 132;
637}
638
639impl Encode for msgs::RevokeAndACK {
640	const TYPE: u16 = 133;
641}
642
643impl Encode for msgs::UpdateFee {
644	const TYPE: u16 = 134;
645}
646
647impl Encode for msgs::ChannelReestablish {
648	const TYPE: u16 = 136;
649}
650
651impl Encode for msgs::AnnouncementSignatures {
652	const TYPE: u16 = 259;
653}
654
655impl Encode for msgs::ChannelAnnouncement {
656	const TYPE: u16 = 256;
657}
658
659impl Encode for msgs::NodeAnnouncement {
660	const TYPE: u16 = 257;
661}
662
663impl Encode for msgs::ChannelUpdate {
664	const TYPE: u16 = 258;
665}
666
667impl Encode for msgs::QueryShortChannelIds {
668	const TYPE: u16 = 261;
669}
670
671impl Encode for msgs::ReplyShortChannelIdsEnd {
672	const TYPE: u16 = 262;
673}
674
675impl Encode for msgs::QueryChannelRange {
676	const TYPE: u16 = 263;
677}
678
679impl Encode for msgs::ReplyChannelRange {
680	const TYPE: u16 = 264;
681}
682
683impl Encode for msgs::GossipTimestampFilter {
684	const TYPE: u16 = 265;
685}
686
687#[cfg(test)]
688mod tests {
689	use super::*;
690	use crate::ln::peer_handler::IgnoringMessageHandler;
691	use crate::prelude::*;
692
693	// Big-endian wire encoding of Pong message (type = 19, byteslen = 2).
694	const ENCODED_PONG: [u8; 6] = [0u8, 19u8, 0u8, 2u8, 0u8, 0u8];
695
696	#[test]
697	fn read_empty_buffer() {
698		let buffer = [];
699		assert!(read(&mut &buffer[..], &IgnoringMessageHandler {}).is_err());
700	}
701
702	#[test]
703	fn read_incomplete_type() {
704		let buffer = &ENCODED_PONG[..1];
705		assert!(read(&mut &buffer[..], &IgnoringMessageHandler {}).is_err());
706	}
707
708	#[test]
709	fn read_empty_payload() {
710		let buffer = &ENCODED_PONG[..2];
711		assert!(read(&mut &buffer[..], &IgnoringMessageHandler {}).is_err());
712	}
713
714	#[test]
715	fn read_invalid_message() {
716		let buffer = &ENCODED_PONG[..4];
717		assert!(read(&mut &buffer[..], &IgnoringMessageHandler {}).is_err());
718	}
719
720	#[test]
721	fn read_known_message() {
722		let buffer = &ENCODED_PONG[..];
723		let message = read(&mut &buffer[..], &IgnoringMessageHandler {}).unwrap();
724		match message {
725			Message::Pong(_) => (),
726			_ => panic!("Expected pong message; found message type: {}", message.type_id()),
727		}
728	}
729
730	#[test]
731	fn read_unknown_message() {
732		let buffer = &::core::u16::MAX.to_be_bytes();
733		let message = read(&mut &buffer[..], &IgnoringMessageHandler {}).unwrap();
734		match message {
735			Message::Unknown(::core::u16::MAX) => (),
736			_ => panic!("Expected message type {}; found: {}", ::core::u16::MAX, message.type_id()),
737		}
738	}
739
740	#[test]
741	fn write_message_with_type() {
742		let message = msgs::Pong { byteslen: 2u16 };
743		let mut buffer = Vec::new();
744		assert!(write(&message, &mut buffer).is_ok());
745
746		let type_length = ::core::mem::size_of::<u16>();
747		let (type_bytes, payload_bytes) = buffer.split_at(type_length);
748		assert_eq!(u16::from_be_bytes(type_bytes.try_into().unwrap()), msgs::Pong::TYPE);
749		assert_eq!(payload_bytes, &ENCODED_PONG[type_length..]);
750	}
751
752	#[test]
753	fn read_message_encoded_with_write() {
754		let message = msgs::Pong { byteslen: 2u16 };
755		let mut buffer = Vec::new();
756		assert!(write(&message, &mut buffer).is_ok());
757
758		let decoded_message = read(&mut &buffer[..], &IgnoringMessageHandler {}).unwrap();
759		match decoded_message {
760			Message::Pong(msgs::Pong { byteslen: 2u16 }) => (),
761			Message::Pong(msgs::Pong { byteslen }) => {
762				panic!("Expected byteslen {}; found: {}", message.byteslen, byteslen);
763			},
764			_ => panic!("Expected pong message; found message type: {}", decoded_message.type_id()),
765		}
766	}
767
768	#[test]
769	fn is_even_message_type() {
770		let message = Message::<()>::Unknown(42);
771		assert!(message.is_even());
772	}
773
774	#[test]
775	fn is_odd_message_type() {
776		let message = Message::<()>::Unknown(43);
777		assert!(!message.is_even());
778	}
779
780	#[test]
781	fn read_lnd_init_msg() {
782		// Taken from lnd v0.9.0-beta.
783		let buffer = vec![0, 16, 0, 2, 34, 0, 0, 3, 2, 162, 161];
784		check_init_msg(buffer, false);
785	}
786
787	#[test]
788	fn read_clightning_init_msg() {
789		// Taken from c-lightning v0.8.0.
790		let buffer = vec![
791			0, 16, 0, 2, 34, 0, 0, 3, 2, 170, 162, 1, 32, 6, 34, 110, 70, 17, 26, 11, 89, 202, 175,
792			18, 96, 67, 235, 91, 191, 40, 195, 79, 58, 94, 51, 42, 31, 199, 178, 183, 60, 241, 136,
793			145, 15,
794		];
795		check_init_msg(buffer, true);
796	}
797
798	fn check_init_msg(buffer: Vec<u8>, expect_unknown: bool) {
799		let decoded_msg = read(&mut &buffer[..], &IgnoringMessageHandler {}).unwrap();
800		match decoded_msg {
801			Message::Init(msgs::Init { features, .. }) => {
802				assert!(features.supports_variable_length_onion());
803				assert!(features.supports_upfront_shutdown_script());
804				assert!(features.supports_gossip_queries());
805				assert_eq!(expect_unknown, features.supports_unknown_bits());
806				assert!(!features.requires_unknown_bits());
807				assert!(!features.initial_routing_sync());
808			},
809			_ => panic!("Expected init message, found message type: {}", decoded_msg.type_id()),
810		}
811	}
812
813	#[test]
814	fn read_lnd_node_announcement() {
815		// Taken from lnd v0.9.0-beta.
816		let buffer = [
817			1, 1, 91, 164, 146, 213, 213, 165, 21, 227, 102, 33, 105, 179, 214, 21, 221, 175, 228,
818			93, 57, 177, 191, 127, 107, 229, 31, 50, 21, 81, 179, 71, 39, 18, 35, 2, 89, 224, 110,
819			123, 66, 39, 148, 246, 177, 85, 12, 19, 70, 226, 173, 132, 156, 26, 122, 146, 71, 213,
820			247, 48, 93, 190, 185, 177, 12, 172, 0, 3, 2, 162, 161, 94, 103, 195, 37, 2, 37, 242,
821			97, 140, 2, 111, 69, 85, 39, 118, 30, 221, 99, 254, 120, 49, 103, 22, 170, 227, 111,
822			172, 164, 160, 49, 68, 138, 116, 16, 22, 206, 107, 51, 153, 255, 97, 108, 105, 99, 101,
823			0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,
824			1, 172, 21, 0, 2, 38, 7,
825		];
826		let decoded_msg = read(&mut &buffer[..], &IgnoringMessageHandler {}).unwrap();
827		match decoded_msg {
828			Message::NodeAnnouncement(msgs::NodeAnnouncement {
829				contents: msgs::UnsignedNodeAnnouncement { features, .. },
830				..
831			}) => {
832				assert!(features.supports_variable_length_onion());
833				assert!(features.supports_upfront_shutdown_script());
834				assert!(features.supports_gossip_queries());
835				assert!(!features.requires_unknown_bits());
836			},
837			_ => {
838				panic!("Expected node announcement, found message type: {}", decoded_msg.type_id())
839			},
840		}
841	}
842
843	#[test]
844	fn read_lnd_chan_announcement() {
845		// Taken from lnd v0.9.0-beta.
846		let buffer = vec![
847			1, 0, 82, 238, 153, 33, 128, 87, 215, 2, 28, 241, 140, 250, 98, 255, 56, 5, 79, 240,
848			214, 231, 172, 35, 240, 171, 44, 9, 78, 91, 8, 193, 102, 5, 17, 178, 142, 106, 180,
849			183, 46, 38, 217, 212, 25, 236, 69, 47, 92, 217, 181, 221, 161, 205, 121, 201, 99, 38,
850			158, 216, 186, 193, 230, 86, 222, 6, 206, 67, 22, 255, 137, 212, 141, 161, 62, 134, 76,
851			48, 241, 54, 50, 167, 187, 247, 73, 27, 74, 1, 129, 185, 197, 153, 38, 90, 255, 138,
852			39, 161, 102, 172, 213, 74, 107, 88, 150, 90, 0, 49, 104, 7, 182, 184, 194, 219, 181,
853			172, 8, 245, 65, 226, 19, 228, 101, 145, 25, 159, 52, 31, 58, 93, 53, 59, 218, 91, 37,
854			84, 103, 17, 74, 133, 33, 35, 2, 203, 101, 73, 19, 94, 175, 122, 46, 224, 47, 168, 128,
855			128, 25, 26, 25, 214, 52, 247, 43, 241, 117, 52, 206, 94, 135, 156, 52, 164, 143, 234,
856			58, 185, 50, 185, 140, 198, 174, 71, 65, 18, 105, 70, 131, 172, 137, 0, 164, 51, 215,
857			143, 117, 119, 217, 241, 197, 177, 227, 227, 170, 199, 114, 7, 218, 12, 107, 30, 191,
858			236, 203, 21, 61, 242, 48, 192, 90, 233, 200, 199, 111, 162, 68, 234, 54, 219, 1, 233,
859			66, 5, 82, 74, 84, 211, 95, 199, 245, 202, 89, 223, 102, 124, 62, 166, 253, 253, 90,
860			180, 118, 21, 61, 110, 37, 5, 96, 167, 0, 0, 6, 34, 110, 70, 17, 26, 11, 89, 202, 175,
861			18, 96, 67, 235, 91, 191, 40, 195, 79, 58, 94, 51, 42, 31, 199, 178, 183, 60, 241, 136,
862			145, 15, 0, 2, 65, 0, 0, 1, 0, 0, 2, 37, 242, 97, 140, 2, 111, 69, 85, 39, 118, 30,
863			221, 99, 254, 120, 49, 103, 22, 170, 227, 111, 172, 164, 160, 49, 68, 138, 116, 16, 22,
864			206, 107, 3, 54, 61, 144, 88, 171, 247, 136, 208, 99, 9, 135, 37, 201, 178, 253, 136,
865			0, 185, 235, 68, 160, 106, 110, 12, 46, 21, 125, 204, 18, 75, 234, 16, 3, 42, 171, 28,
866			52, 224, 11, 30, 30, 253, 156, 148, 175, 203, 121, 250, 111, 122, 195, 84, 122, 77,
867			183, 56, 135, 101, 88, 41, 60, 191, 99, 232, 85, 2, 36, 17, 156, 11, 8, 12, 189, 177,
868			68, 88, 28, 15, 207, 21, 179, 151, 56, 226, 158, 148, 3, 120, 113, 177, 243, 184, 17,
869			173, 37, 46, 222, 16,
870		];
871		let decoded_msg = read(&mut &buffer[..], &IgnoringMessageHandler {}).unwrap();
872		match decoded_msg {
873			Message::ChannelAnnouncement(msgs::ChannelAnnouncement {
874				contents: msgs::UnsignedChannelAnnouncement { features, .. },
875				..
876			}) => {
877				assert!(!features.requires_unknown_bits());
878			},
879			_ => {
880				panic!("Expected node announcement, found message type: {}", decoded_msg.type_id())
881			},
882		}
883	}
884
885	#[derive(Eq, PartialEq, Debug)]
886	struct TestCustomMessage {}
887
888	const CUSTOM_MESSAGE_TYPE: u16 = 9000;
889
890	impl Type for TestCustomMessage {
891		fn type_id(&self) -> u16 {
892			CUSTOM_MESSAGE_TYPE
893		}
894	}
895
896	impl Writeable for TestCustomMessage {
897		fn write<W: Writer>(&self, _: &mut W) -> Result<(), io::Error> {
898			Ok(())
899		}
900	}
901
902	struct TestCustomMessageReader {}
903
904	impl CustomMessageReader for TestCustomMessageReader {
905		type CustomMessage = TestCustomMessage;
906		fn read<R: io::Read>(
907			&self, message_type: u16, _: &mut R,
908		) -> Result<Option<Self::CustomMessage>, msgs::DecodeError> {
909			if message_type == CUSTOM_MESSAGE_TYPE {
910				return Ok(Some(TestCustomMessage {}));
911			}
912
913			Ok(None)
914		}
915	}
916
917	#[test]
918	fn read_custom_message() {
919		let buffer = [35, 40];
920		let decoded_msg = read(&mut &buffer[..], &TestCustomMessageReader {}).unwrap();
921		match decoded_msg {
922			Message::Custom(custom) => {
923				assert_eq!(custom.type_id(), CUSTOM_MESSAGE_TYPE);
924				assert_eq!(custom, TestCustomMessage {});
925			},
926			_ => panic!("Expected custom message, found message type: {}", decoded_msg.type_id()),
927		}
928	}
929
930	#[test]
931	fn read_with_custom_reader_unknown_message_type() {
932		let buffer = [35, 42];
933		let decoded_msg = read(&mut &buffer[..], &TestCustomMessageReader {}).unwrap();
934		match decoded_msg {
935			Message::Unknown(_) => {},
936			_ => panic!("Expected unknown message, found message type: {}", decoded_msg.type_id()),
937		}
938	}
939
940	#[test]
941	fn custom_reader_unknown_message_type() {
942		let buffer = Vec::new();
943		let res =
944			TestCustomMessageReader {}.read(CUSTOM_MESSAGE_TYPE + 1, &mut &buffer[..]).unwrap();
945		assert!(res.is_none());
946	}
947}