Skip to content

Commit 31b8588

Browse files
Aditya SharmaAditya Sharma
authored andcommitted
lightning: Add message types and their handlers for peer storage messages.
1 parent 380abd2 commit 31b8588

File tree

8 files changed

+134
-0
lines changed

8 files changed

+134
-0
lines changed

lightning-net-tokio/src/lib.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -760,6 +760,11 @@ mod tests {
760760
fn handle_tx_init_rbf(&self, _their_node_id: PublicKey, _msg: &TxInitRbf) {}
761761
fn handle_tx_ack_rbf(&self, _their_node_id: PublicKey, _msg: &TxAckRbf) {}
762762
fn handle_tx_abort(&self, _their_node_id: PublicKey, _msg: &TxAbort) {}
763+
fn handle_peer_storage(&self, _their_node_id: PublicKey, _msg: &PeerStorageMessage) {}
764+
fn handle_your_peer_storage(
765+
&self, _their_node_id: PublicKey, _msg: &YourPeerStorageMessage,
766+
) {
767+
}
763768
fn peer_disconnected(&self, their_node_id: PublicKey) {
764769
if their_node_id == self.expected_pubkey {
765770
self.disconnected_flag.store(true, Ordering::SeqCst);

lightning/src/events/mod.rs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2557,6 +2557,23 @@ pub enum MessageSendEvent {
25572557
/// The gossip_timestamp_filter which should be sent.
25582558
msg: msgs::GossipTimestampFilter,
25592559
},
2560+
/// Sends a channel partner Peer Storage of our backup which they should store.
2561+
/// This should be sent on each new connection to the channel partner or whenever we want
2562+
/// them to update the backup that they store.
2563+
SendPeerStorageMessage {
2564+
/// The node_id of this message recipient
2565+
node_id: PublicKey,
2566+
/// The PeerStorageMessage which should be sent.
2567+
msg: msgs::PeerStorageMessage,
2568+
},
2569+
/// Sends a channel partner their own peer storage which we store and update when they send
2570+
/// a [`msgs::PeerStorageMessage`].
2571+
SendYourPeerStorageMessage {
2572+
/// The node_id of this message recipient
2573+
node_id: PublicKey,
2574+
/// The YourPeerStorageMessage which should be sent.
2575+
msg: msgs::YourPeerStorageMessage,
2576+
}
25602577
}
25612578

25622579
/// A trait indicating an object may generate message send events

lightning/src/ln/channelmanager.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10470,6 +10470,12 @@ where
1047010470
let _ = handle_error!(self, self.internal_funding_signed(&counterparty_node_id, msg), counterparty_node_id);
1047110471
}
1047210472

10473+
fn handle_peer_storage(&self, counterparty_node_id: PublicKey, msg: &msgs::PeerStorageMessage) {
10474+
}
10475+
10476+
fn handle_your_peer_storage(&self, counterparty_node_id: PublicKey, msg: &msgs::YourPeerStorageMessage) {
10477+
}
10478+
1047310479
fn handle_channel_ready(&self, counterparty_node_id: PublicKey, msg: &msgs::ChannelReady) {
1047410480
// Note that we never need to persist the updated ChannelManager for an inbound
1047510481
// channel_ready message - while the channel's state will change, any channel_ready message
@@ -10735,6 +10741,10 @@ where
1073510741
&events::MessageSendEvent::SendShortIdsQuery { .. } => false,
1073610742
&events::MessageSendEvent::SendReplyChannelRange { .. } => false,
1073710743
&events::MessageSendEvent::SendGossipTimestampFilter { .. } => false,
10744+
10745+
// Peer Storage
10746+
&events::MessageSendEvent::SendPeerStorageMessage { .. } => false,
10747+
&events::MessageSendEvent::SendYourPeerStorageMessage { .. } => false,
1073810748
}
1073910749
});
1074010750
debug_assert!(peer_state.is_connected, "A disconnected peer cannot disconnect");

lightning/src/ln/functional_test_utils.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -853,6 +853,12 @@ macro_rules! get_htlc_update_msgs {
853853
/// such messages are intended to all peers.
854854
pub fn remove_first_msg_event_to_node(msg_node_id: &PublicKey, msg_events: &mut Vec<MessageSendEvent>) -> MessageSendEvent {
855855
let ev_index = msg_events.iter().position(|e| { match e {
856+
MessageSendEvent::SendPeerStorageMessage { node_id, .. } => {
857+
node_id == msg_node_id
858+
},
859+
MessageSendEvent::SendYourPeerStorageMessage { node_id, .. } => {
860+
node_id == msg_node_id
861+
},
856862
MessageSendEvent::SendAcceptChannel { node_id, .. } => {
857863
node_id == msg_node_id
858864
},

lightning/src/ln/msgs.rs

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -723,6 +723,24 @@ pub struct UpdateFulfillHTLC {
723723
pub payment_preimage: PaymentPreimage,
724724
}
725725

726+
/// A [`PeerStorage`] message to be sent to or received from a peer.
727+
///
728+
/// [`PeerStorage`]: https://github.com/lightning/bolts/pull/1110
729+
#[derive(Clone, Debug, Hash, PartialEq, Eq)]
730+
pub struct PeerStorageMessage {
731+
/// Data included in the msg
732+
pub data: Vec<u8>,
733+
}
734+
735+
/// An [`YourPeerStorage`] message to be sent to or received from a peer.
736+
///
737+
/// [`YourPeerStorage`]: https://github.com/lightning/bolts/pull/1110
738+
#[derive(Clone, Debug, Hash, PartialEq, Eq)]
739+
pub struct YourPeerStorageMessage {
740+
/// Data included in the msg
741+
pub data: Vec<u8>,
742+
}
743+
726744
/// An [`update_fail_htlc`] message to be sent to or received from a peer.
727745
///
728746
/// [`update_fail_htlc`]: https://github.com/lightning/bolts/blob/master/02-peer-protocol.md#removing-an-htlc-update_fulfill_htlc-update_fail_htlc-and-update_fail_malformed_htlc
@@ -1505,6 +1523,12 @@ pub trait ChannelMessageHandler : MessageSendEventsProvider {
15051523
/// Handle an incoming `channel_ready` message from the given peer.
15061524
fn handle_channel_ready(&self, their_node_id: PublicKey, msg: &ChannelReady);
15071525

1526+
// Peer Storage
1527+
/// Handle an incoming `peer_storage` message from the given peer.
1528+
fn handle_peer_storage(&self, their_node_id: PublicKey, msg: &PeerStorageMessage);
1529+
/// Handle an incoming `your_peer_storage` message from the given peer.
1530+
fn handle_your_peer_storage(&self, their_node_id: PublicKey, msg: &YourPeerStorageMessage);
1531+
15081532
// Channel close:
15091533
/// Handle an incoming `shutdown` message from the given peer.
15101534
fn handle_shutdown(&self, their_node_id: PublicKey, msg: &Shutdown);
@@ -2597,6 +2621,14 @@ impl_writeable_msg!(UpdateFulfillHTLC, {
25972621
payment_preimage
25982622
}, {});
25992623

2624+
impl_writeable_msg!(PeerStorageMessage, {
2625+
data
2626+
}, {});
2627+
2628+
impl_writeable_msg!(YourPeerStorageMessage, {
2629+
data
2630+
}, {});
2631+
26002632
// Note that this is written as a part of ChannelManager objects, and thus cannot change its
26012633
// serialization format in a way which assumes we know the total serialized length/message end
26022634
// position.
@@ -4447,6 +4479,26 @@ mod tests {
44474479
assert_eq!(encoded_value, target_value);
44484480
}
44494481

4482+
#[test]
4483+
fn encoding_peer_storage() {
4484+
let peerstorage = msgs::PeerStorageMessage {
4485+
data: <Vec<u8>>::from_hex("01020304050607080910").unwrap()
4486+
};
4487+
let encoded_value = peerstorage.encode();
4488+
let target_value = <Vec<u8>>::from_hex("000a01020304050607080910").unwrap();
4489+
assert_eq!(encoded_value, target_value);
4490+
}
4491+
4492+
#[test]
4493+
fn encoding_your_peer_storage() {
4494+
let yourpeerstorage = msgs::YourPeerStorageMessage {
4495+
data: <Vec<u8>>::from_hex("01020304050607080910").unwrap()
4496+
};
4497+
let encoded_value = yourpeerstorage.encode();
4498+
let target_value = <Vec<u8>>::from_hex("000a01020304050607080910").unwrap();
4499+
assert_eq!(encoded_value, target_value);
4500+
}
4501+
44504502
#[test]
44514503
fn encoding_pong() {
44524504
let pong = msgs::Pong {

lightning/src/ln/peer_handler.rs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -314,6 +314,8 @@ impl ChannelMessageHandler for ErroringMessageHandler {
314314
}
315315
// msgs::ChannelUpdate does not contain the channel_id field, so we just drop them.
316316
fn handle_channel_update(&self, _their_node_id: PublicKey, _msg: &msgs::ChannelUpdate) {}
317+
fn handle_peer_storage(&self, _their_node_id: PublicKey, _msg: &msgs::PeerStorageMessage) {}
318+
fn handle_your_peer_storage(&self, _their_node_id: PublicKey, _msg: &msgs::YourPeerStorageMessage) {}
317319
fn peer_disconnected(&self, _their_node_id: PublicKey) {}
318320
fn peer_connected(&self, _their_node_id: PublicKey, _init: &msgs::Init, _inbound: bool) -> Result<(), ()> { Ok(()) }
319321
fn handle_error(&self, _their_node_id: PublicKey, _msg: &msgs::ErrorMessage) {}
@@ -1803,6 +1805,12 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, OM: Deref, L: Deref, CM
18031805
wire::Message::ChannelReady(msg) => {
18041806
self.message_handler.chan_handler.handle_channel_ready(their_node_id, &msg);
18051807
},
1808+
wire::Message::PeerStorageMessage(msg) => {
1809+
self.message_handler.chan_handler.handle_peer_storage(their_node_id, &msg);
1810+
},
1811+
wire::Message::YourPeerStorageMessage(msg) => {
1812+
self.message_handler.chan_handler.handle_your_peer_storage(their_node_id, &msg);
1813+
},
18061814

18071815
// Quiescence messages:
18081816
wire::Message::Stfu(msg) => {
@@ -2098,6 +2106,14 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, OM: Deref, L: Deref, CM
20982106
}
20992107
for event in events_generated.drain(..) {
21002108
match event {
2109+
MessageSendEvent::SendPeerStorageMessage { ref node_id, ref msg } => {
2110+
log_debug!(self.logger, "Handling SendPeerStorageMessage event in peer_handler for {}", log_pubkey!(node_id));
2111+
self.enqueue_message(&mut *get_peer_for_forwarding!(node_id), msg);
2112+
},
2113+
MessageSendEvent::SendYourPeerStorageMessage { ref node_id, ref msg } => {
2114+
log_debug!(self.logger, "Handling SendYourPeerStorageMessage event in peer_handler for {}", log_pubkey!(node_id));
2115+
self.enqueue_message(&mut *get_peer_for_forwarding!(node_id), msg);
2116+
},
21012117
MessageSendEvent::SendAcceptChannel { ref node_id, ref msg } => {
21022118
log_debug!(WithContext::from(&self.logger, Some(*node_id), Some(msg.common_fields.temporary_channel_id), None), "Handling SendAcceptChannel event in peer_handler for node {} for channel {}",
21032119
log_pubkey!(node_id),

lightning/src/ln/wire.rs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,8 @@ pub(crate) enum Message<T> where T: core::fmt::Debug + Type + TestEq {
5353
Warning(msgs::WarningMessage),
5454
Ping(msgs::Ping),
5555
Pong(msgs::Pong),
56+
PeerStorageMessage(msgs::PeerStorageMessage),
57+
YourPeerStorageMessage(msgs::YourPeerStorageMessage),
5658
OpenChannel(msgs::OpenChannel),
5759
OpenChannelV2(msgs::OpenChannelV2),
5860
AcceptChannel(msgs::AcceptChannel),
@@ -111,6 +113,8 @@ impl<T> Writeable for Message<T> where T: core::fmt::Debug + Type + TestEq {
111113
&Message::Warning(ref msg) => msg.write(writer),
112114
&Message::Ping(ref msg) => msg.write(writer),
113115
&Message::Pong(ref msg) => msg.write(writer),
116+
&Message::PeerStorageMessage(ref msg) => msg.write(writer),
117+
&Message::YourPeerStorageMessage(ref msg) => msg.write(writer),
114118
&Message::OpenChannel(ref msg) => msg.write(writer),
115119
&Message::OpenChannelV2(ref msg) => msg.write(writer),
116120
&Message::AcceptChannel(ref msg) => msg.write(writer),
@@ -169,6 +173,8 @@ impl<T> Type for Message<T> where T: core::fmt::Debug + Type + TestEq {
169173
&Message::Warning(ref msg) => msg.type_id(),
170174
&Message::Ping(ref msg) => msg.type_id(),
171175
&Message::Pong(ref msg) => msg.type_id(),
176+
&Message::PeerStorageMessage(ref msg) => msg.type_id(),
177+
&Message::YourPeerStorageMessage(ref msg) => msg.type_id(),
172178
&Message::OpenChannel(ref msg) => msg.type_id(),
173179
&Message::OpenChannelV2(ref msg) => msg.type_id(),
174180
&Message::AcceptChannel(ref msg) => msg.type_id(),
@@ -261,6 +267,12 @@ fn do_read<R: io::Read, T, H: core::ops::Deref>(buffer: &mut R, message_type: u1
261267
msgs::Pong::TYPE => {
262268
Ok(Message::Pong(Readable::read(buffer)?))
263269
},
270+
msgs::PeerStorageMessage::TYPE => {
271+
Ok(Message::PeerStorageMessage(Readable::read(buffer)?))
272+
},
273+
msgs::YourPeerStorageMessage::TYPE => {
274+
Ok(Message::YourPeerStorageMessage(Readable::read(buffer)?))
275+
},
264276
msgs::OpenChannel::TYPE => {
265277
Ok(Message::OpenChannel(Readable::read(buffer)?))
266278
},
@@ -625,6 +637,14 @@ impl Encode for msgs::GossipTimestampFilter {
625637
const TYPE: u16 = 265;
626638
}
627639

640+
impl Encode for msgs::PeerStorageMessage {
641+
const TYPE: u16 = 7;
642+
}
643+
644+
impl Encode for msgs::YourPeerStorageMessage {
645+
const TYPE: u16 = 9;
646+
}
647+
628648
#[cfg(test)]
629649
mod tests {
630650
use super::*;

lightning/src/util/test_utils.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -917,6 +917,14 @@ impl msgs::ChannelMessageHandler for TestChannelMessageHandler {
917917
self.received_msg(wire::Message::TxAbort(msg.clone()));
918918
}
919919

920+
fn handle_peer_storage(&self, _their_node_id: PublicKey, msg: &msgs::PeerStorageMessage) {
921+
self.received_msg(wire::Message::PeerStorageMessage(msg.clone()));
922+
}
923+
924+
fn handle_your_peer_storage(&self, _their_node_id: PublicKey, msg: &msgs::YourPeerStorageMessage) {
925+
self.received_msg(wire::Message::YourPeerStorageMessage(msg.clone()));
926+
}
927+
920928
fn message_received(&self) {}
921929
}
922930

0 commit comments

Comments
 (0)