Skip to content

Commit a69cba5

Browse files
Aditya SharmaAditya Sharma
authored andcommitted
Add Message Handlers for Peer Storage
Introduce message types and handlers to enable the exchange of peer storage data between nodes. PeerStorageMessage: Used to send encrypted backups to peers. YourPeerStorageMessage: Used to return a peer's stored data upon reconnection. - Define two new message types: PeerStorageMessage and YourPeerStorageMessage. - Implement handlers for these messages in ChannelMessageHandler. - Add SendPeerStorageMessage and SendYourPeerStorageMessage to MessageSendEvent.
1 parent 8c64b1d commit a69cba5

File tree

8 files changed

+135
-0
lines changed

8 files changed

+135
-0
lines changed

lightning-net-tokio/src/lib.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -760,6 +760,8 @@ 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(&self, _their_node_id: PublicKey, _msg: &YourPeerStorageMessage) {}
763765
fn peer_disconnected(&self, their_node_id: PublicKey) {
764766
if their_node_id == self.expected_pubkey {
765767
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
@@ -2574,6 +2574,23 @@ pub enum MessageSendEvent {
25742574
/// The gossip_timestamp_filter which should be sent.
25752575
msg: msgs::GossipTimestampFilter,
25762576
},
2577+
/// Sends a channel partner Peer Storage of our backup which they should store.
2578+
/// This should be sent on each new connection to the channel partner or whenever we want
2579+
/// them to update the backup that they store.
2580+
SendPeerStorageMessage {
2581+
/// The node_id of this message recipient
2582+
node_id: PublicKey,
2583+
/// The PeerStorageMessage which should be sent.
2584+
msg: msgs::PeerStorageMessage,
2585+
},
2586+
/// Sends a channel partner their own peer storage which we store and update when they send
2587+
/// a [`msgs::PeerStorageMessage`].
2588+
SendYourPeerStorageMessage {
2589+
/// The node_id of this message recipient
2590+
node_id: PublicKey,
2591+
/// The YourPeerStorageMessage which should be sent.
2592+
msg: msgs::YourPeerStorageMessage,
2593+
}
25772594
}
25782595

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

lightning/src/ln/channelmanager.rs

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

10474+
fn handle_peer_storage(&self, counterparty_node_id: PublicKey, msg: &msgs::PeerStorageMessage) {
10475+
let _persistence_guard = PersistenceNotifierGuard::optionally_notify(self, || NotifyOption::SkipPersistNoEvents);
10476+
self.internal_peer_storage(&counterparty_node_id, msg);
10477+
}
10478+
10479+
fn handle_your_peer_storage(&self, counterparty_node_id: PublicKey, msg: &msgs::YourPeerStorageMessage) {
10480+
let _persistence_guard = PersistenceNotifierGuard::optionally_notify(self, || NotifyOption::SkipPersistNoEvents);
10481+
self.internal_your_peer_storage(&counterparty_node_id, msg);
10482+
}
10483+
1047410484
fn handle_channel_ready(&self, counterparty_node_id: PublicKey, msg: &msgs::ChannelReady) {
1047510485
// Note that we never need to persist the updated ChannelManager for an inbound
1047610486
// channel_ready message - while the channel's state will change, any channel_ready message
@@ -10736,6 +10746,10 @@ where
1073610746
&events::MessageSendEvent::SendShortIdsQuery { .. } => false,
1073710747
&events::MessageSendEvent::SendReplyChannelRange { .. } => false,
1073810748
&events::MessageSendEvent::SendGossipTimestampFilter { .. } => false,
10749+
10750+
// Peer Storage
10751+
&events::MessageSendEvent::SendPeerStorageMessage { .. } => false,
10752+
&events::MessageSendEvent::SendYourPeerStorageMessage { .. } => false,
1073910753
}
1074010754
});
1074110755
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
@@ -854,6 +854,12 @@ macro_rules! get_htlc_update_msgs {
854854
/// such messages are intended to all peers.
855855
pub fn remove_first_msg_event_to_node(msg_node_id: &PublicKey, msg_events: &mut Vec<MessageSendEvent>) -> MessageSendEvent {
856856
let ev_index = msg_events.iter().position(|e| { match e {
857+
MessageSendEvent::SendPeerStorageMessage { node_id, .. } => {
858+
node_id == msg_node_id
859+
},
860+
MessageSendEvent::SendYourPeerStorageMessage { node_id, .. } => {
861+
node_id == msg_node_id
862+
},
857863
MessageSendEvent::SendAcceptChannel { node_id, .. } => {
858864
node_id == msg_node_id
859865
},

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
@@ -323,6 +323,8 @@ impl ChannelMessageHandler for ErroringMessageHandler {
323323
}
324324
// msgs::ChannelUpdate does not contain the channel_id field, so we just drop them.
325325
fn handle_channel_update(&self, _their_node_id: PublicKey, _msg: &msgs::ChannelUpdate) {}
326+
fn handle_peer_storage(&self, _their_node_id: PublicKey, _msg: &msgs::PeerStorageMessage) {}
327+
fn handle_your_peer_storage(&self, _their_node_id: PublicKey, _msg: &msgs::YourPeerStorageMessage) {}
326328
fn peer_disconnected(&self, _their_node_id: PublicKey) {}
327329
fn peer_connected(&self, _their_node_id: PublicKey, _init: &msgs::Init, _inbound: bool) -> Result<(), ()> { Ok(()) }
328330
fn handle_error(&self, _their_node_id: PublicKey, _msg: &msgs::ErrorMessage) {}
@@ -1813,6 +1815,12 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, OM: Deref, L: Deref, CM
18131815
wire::Message::ChannelReady(msg) => {
18141816
self.message_handler.chan_handler.handle_channel_ready(their_node_id, &msg);
18151817
},
1818+
wire::Message::PeerStorageMessage(msg) => {
1819+
self.message_handler.chan_handler.handle_peer_storage(their_node_id, &msg);
1820+
},
1821+
wire::Message::YourPeerStorageMessage(msg) => {
1822+
self.message_handler.chan_handler.handle_your_peer_storage(their_node_id, &msg);
1823+
},
18161824

18171825
// Quiescence messages:
18181826
wire::Message::Stfu(msg) => {
@@ -2108,6 +2116,14 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, OM: Deref, L: Deref, CM
21082116
}
21092117
for event in events_generated.drain(..) {
21102118
match event {
2119+
MessageSendEvent::SendPeerStorageMessage { ref node_id, ref msg } => {
2120+
log_debug!(self.logger, "Handling SendPeerStorageMessage event in peer_handler for {}", log_pubkey!(node_id));
2121+
self.enqueue_message(&mut *get_peer_for_forwarding!(node_id), msg);
2122+
},
2123+
MessageSendEvent::SendYourPeerStorageMessage { ref node_id, ref msg } => {
2124+
log_debug!(self.logger, "Handling SendYourPeerStorageMessage event in peer_handler for {}", log_pubkey!(node_id));
2125+
self.enqueue_message(&mut *get_peer_for_forwarding!(node_id), msg);
2126+
},
21112127
MessageSendEvent::SendAcceptChannel { ref node_id, ref msg } => {
21122128
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 {}",
21132129
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)