Skip to content

Commit 9c0e13c

Browse files
Aditya SharmaAditya Sharma
authored andcommitted
lightning: Add message types and their handlers for peer storage messages.
1 parent 2633754 commit 9c0e13c

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
@@ -759,6 +759,11 @@ mod tests {
759759
fn handle_tx_init_rbf(&self, _their_node_id: &PublicKey, _msg: &TxInitRbf) {}
760760
fn handle_tx_ack_rbf(&self, _their_node_id: &PublicKey, _msg: &TxAckRbf) {}
761761
fn handle_tx_abort(&self, _their_node_id: &PublicKey, _msg: &TxAbort) {}
762+
fn handle_peer_storage(&self, _their_node_id: &PublicKey, _msg: &PeerStorageMessage) {}
763+
fn handle_your_peer_storage(
764+
&self, _their_node_id: &PublicKey, _msg: &YourPeerStorageMessage,
765+
) {
766+
}
762767
fn peer_disconnected(&self, their_node_id: &PublicKey) {
763768
if *their_node_id == self.expected_pubkey {
764769
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
@@ -2529,6 +2529,23 @@ pub enum MessageSendEvent {
25292529
/// The gossip_timestamp_filter which should be sent.
25302530
msg: msgs::GossipTimestampFilter,
25312531
},
2532+
/// Sends a channel partner Peer Storage of our backup which they should store.
2533+
/// This should be sent on each new connection to the channel partner or whenever we want
2534+
/// them to update the backup that they store.
2535+
SendPeerStorageMessage {
2536+
/// The node_id of this message recipient
2537+
node_id: PublicKey,
2538+
/// The PeerStorageMessage which should be sent.
2539+
msg: msgs::PeerStorageMessage,
2540+
},
2541+
/// Sends a channel partner their own peer storage which we store and update when they send
2542+
/// a [`msgs::PeerStorageMessage`].
2543+
SendYourPeerStorageMessage {
2544+
/// The node_id of this message recipient
2545+
node_id: PublicKey,
2546+
/// The YourPeerStorageMessage which should be sent.
2547+
msg: msgs::YourPeerStorageMessage,
2548+
}
25322549
}
25332550

25342551
/// 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
@@ -10202,6 +10202,12 @@ where
1020210202
let _ = handle_error!(self, self.internal_funding_signed(counterparty_node_id, msg), *counterparty_node_id);
1020310203
}
1020410204

10205+
fn handle_peer_storage(&self, counterparty_node_id: &PublicKey, msg: &msgs::PeerStorageMessage) {
10206+
}
10207+
10208+
fn handle_your_peer_storage(&self, counterparty_node_id: &PublicKey, msg: &msgs::YourPeerStorageMessage) {
10209+
}
10210+
1020510211
fn handle_channel_ready(&self, counterparty_node_id: &PublicKey, msg: &msgs::ChannelReady) {
1020610212
// Note that we never need to persist the updated ChannelManager for an inbound
1020710213
// channel_ready message - while the channel's state will change, any channel_ready message
@@ -10467,6 +10473,10 @@ where
1046710473
&events::MessageSendEvent::SendShortIdsQuery { .. } => false,
1046810474
&events::MessageSendEvent::SendReplyChannelRange { .. } => false,
1046910475
&events::MessageSendEvent::SendGossipTimestampFilter { .. } => false,
10476+
10477+
// Peer Storage
10478+
&events::MessageSendEvent::SendPeerStorageMessage { .. } => false,
10479+
&events::MessageSendEvent::SendYourPeerStorageMessage { .. } => false,
1047010480
}
1047110481
});
1047210482
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
@@ -848,6 +848,12 @@ macro_rules! get_htlc_update_msgs {
848848
/// such messages are intended to all peers.
849849
pub fn remove_first_msg_event_to_node(msg_node_id: &PublicKey, msg_events: &mut Vec<MessageSendEvent>) -> MessageSendEvent {
850850
let ev_index = msg_events.iter().position(|e| { match e {
851+
MessageSendEvent::SendPeerStorageMessage { node_id, .. } => {
852+
node_id == msg_node_id
853+
},
854+
MessageSendEvent::SendYourPeerStorageMessage { node_id, .. } => {
855+
node_id == msg_node_id
856+
},
851857
MessageSendEvent::SendAcceptChannel { node_id, .. } => {
852858
node_id == msg_node_id
853859
},

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);
@@ -2584,6 +2608,14 @@ impl_writeable_msg!(UpdateFulfillHTLC, {
25842608
payment_preimage
25852609
}, {});
25862610

2611+
impl_writeable_msg!(PeerStorageMessage, {
2612+
data
2613+
}, {});
2614+
2615+
impl_writeable_msg!(YourPeerStorageMessage, {
2616+
data
2617+
}, {});
2618+
25872619
// Note that this is written as a part of ChannelManager objects, and thus cannot change its
25882620
// serialization format in a way which assumes we know the total serialized length/message end
25892621
// position.
@@ -4434,6 +4466,26 @@ mod tests {
44344466
assert_eq!(encoded_value, target_value);
44354467
}
44364468

4469+
#[test]
4470+
fn encoding_peer_storage() {
4471+
let peerstorage = msgs::PeerStorageMessage {
4472+
data: <Vec<u8>>::from_hex("01020304050607080910").unwrap()
4473+
};
4474+
let encoded_value = peerstorage.encode();
4475+
let target_value = <Vec<u8>>::from_hex("000a01020304050607080910").unwrap();
4476+
assert_eq!(encoded_value, target_value);
4477+
}
4478+
4479+
#[test]
4480+
fn encoding_your_peer_storage() {
4481+
let yourpeerstorage = msgs::YourPeerStorageMessage {
4482+
data: <Vec<u8>>::from_hex("01020304050607080910").unwrap()
4483+
};
4484+
let encoded_value = yourpeerstorage.encode();
4485+
let target_value = <Vec<u8>>::from_hex("000a01020304050607080910").unwrap();
4486+
assert_eq!(encoded_value, target_value);
4487+
}
4488+
44374489
#[test]
44384490
fn encoding_pong() {
44394491
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) {}
@@ -1800,6 +1802,12 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, OM: Deref, L: Deref, CM
18001802
wire::Message::ChannelReady(msg) => {
18011803
self.message_handler.chan_handler.handle_channel_ready(&their_node_id, &msg);
18021804
},
1805+
wire::Message::PeerStorageMessage(msg) => {
1806+
self.message_handler.chan_handler.handle_peer_storage(&their_node_id, &msg);
1807+
},
1808+
wire::Message::YourPeerStorageMessage(msg) => {
1809+
self.message_handler.chan_handler.handle_your_peer_storage(&their_node_id, &msg);
1810+
},
18031811

18041812
// Quiescence messages:
18051813
wire::Message::Stfu(msg) => {
@@ -2095,6 +2103,14 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, OM: Deref, L: Deref, CM
20952103
}
20962104
for event in events_generated.drain(..) {
20972105
match event {
2106+
MessageSendEvent::SendPeerStorageMessage { ref node_id, ref msg } => {
2107+
log_debug!(self.logger, "Handling SendPeerStorageMessage event in peer_handler for {}", log_pubkey!(node_id));
2108+
self.enqueue_message(&mut *get_peer_for_forwarding!(node_id), msg);
2109+
},
2110+
MessageSendEvent::SendYourPeerStorageMessage { ref node_id, ref msg } => {
2111+
log_debug!(self.logger, "Handling SendYourPeerStorageMessage event in peer_handler for {}", log_pubkey!(node_id));
2112+
self.enqueue_message(&mut *get_peer_for_forwarding!(node_id), msg);
2113+
},
20982114
MessageSendEvent::SendAcceptChannel { ref node_id, ref msg } => {
20992115
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 {}",
21002116
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
@@ -942,6 +942,14 @@ impl msgs::ChannelMessageHandler for TestChannelMessageHandler {
942942
fn handle_tx_abort(&self, _their_node_id: &PublicKey, msg: &msgs::TxAbort) {
943943
self.received_msg(wire::Message::TxAbort(msg.clone()));
944944
}
945+
946+
fn handle_peer_storage(&self, _their_node_id: &PublicKey, msg: &msgs::PeerStorageMessage) {
947+
self.received_msg(wire::Message::PeerStorageMessage(msg.clone()));
948+
}
949+
950+
fn handle_your_peer_storage(&self, _their_node_id: &PublicKey, msg: &msgs::YourPeerStorageMessage) {
951+
self.received_msg(wire::Message::YourPeerStorageMessage(msg.clone()));
952+
}
945953
}
946954

947955
impl events::MessageSendEventsProvider for TestChannelMessageHandler {

0 commit comments

Comments
 (0)