Skip to main content

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