Skip to content

Commit 7bc6943

Browse files
Aditya Sharmaadi2011
Aditya 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. PeerStorageRetrievalMessage: Used to return a peer's stored data upon reconnection. - Define two new message types: PeerStorageMessage and PeerStorageRetrievalMessage. - Implement handlers for these messages in ChannelMessageHandler. - Add SendPeerStorageMessage and SendPeerStorageRetrievalMessage to MessageSendEvent.
1 parent 0222296 commit 7bc6943

File tree

8 files changed

+160
-0
lines changed

8 files changed

+160
-0
lines changed

lightning-net-tokio/src/lib.rs

+5
Original file line numberDiff line numberDiff line change
@@ -761,6 +761,11 @@ mod tests {
761761
fn handle_tx_init_rbf(&self, _their_node_id: PublicKey, _msg: &TxInitRbf) {}
762762
fn handle_tx_ack_rbf(&self, _their_node_id: PublicKey, _msg: &TxAckRbf) {}
763763
fn handle_tx_abort(&self, _their_node_id: PublicKey, _msg: &TxAbort) {}
764+
fn handle_peer_storage(&self, _their_node_id: PublicKey, _msg: PeerStorage) {}
765+
fn handle_peer_storage_retrieval(
766+
&self, _their_node_id: PublicKey, _msg: PeerStorageRetrieval,
767+
) {
768+
}
764769
fn peer_disconnected(&self, their_node_id: PublicKey) {
765770
if their_node_id == self.expected_pubkey {
766771
self.disconnected_flag.store(true, Ordering::SeqCst);

lightning/src/events/mod.rs

+17
Original file line numberDiff line numberDiff line change
@@ -2624,6 +2624,23 @@ pub enum MessageSendEvent {
26242624
/// The gossip_timestamp_filter which should be sent.
26252625
msg: msgs::GossipTimestampFilter,
26262626
},
2627+
/// Sends a channel partner Peer Storage of our backup which they should store.
2628+
/// This should be sent on each new connection to the channel partner or whenever we want
2629+
/// them to update the backup that they store.
2630+
SendPeerStorage {
2631+
/// The node_id of this message recipient
2632+
node_id: PublicKey,
2633+
/// The peer_storage which should be sent.
2634+
msg: msgs::PeerStorage,
2635+
},
2636+
/// Sends a channel partner their own peer storage which we store and update when they send
2637+
/// a [`msgs::PeerStorage`].
2638+
SendPeerStorageRetrieval {
2639+
/// The node_id of this message recipient
2640+
node_id: PublicKey,
2641+
/// The peer_storage_retrieval which should be sent.
2642+
msg: msgs::PeerStorageRetrieval,
2643+
}
26272644
}
26282645

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

lightning/src/ln/channelmanager.rs

+22
Original file line numberDiff line numberDiff line change
@@ -8221,6 +8221,14 @@ This indicates a bug inside LDK. Please report this error at https://github.com/
82218221
}
82228222
}
82238223

8224+
fn internal_peer_storage_retrieval(&self, _counterparty_node_id: PublicKey, _msg: msgs::PeerStorageRetrieval) -> Result<(), MsgHandleErrInternal> {
8225+
Ok(())
8226+
}
8227+
8228+
fn internal_peer_storage(&self, _counterparty_node_id: PublicKey, _msg: msgs::PeerStorage) -> Result<(), MsgHandleErrInternal> {
8229+
Ok(())
8230+
}
8231+
82248232
fn internal_funding_signed(&self, counterparty_node_id: &PublicKey, msg: &msgs::FundingSigned) -> Result<(), MsgHandleErrInternal> {
82258233
let best_block = *self.best_block.read().unwrap();
82268234
let per_peer_state = self.per_peer_state.read().unwrap();
@@ -11417,6 +11425,16 @@ where
1141711425
let _ = handle_error!(self, self.internal_funding_signed(&counterparty_node_id, msg), counterparty_node_id);
1141811426
}
1141911427

11428+
fn handle_peer_storage(&self, counterparty_node_id: PublicKey, msg: msgs::PeerStorage) {
11429+
let _persistence_guard = PersistenceNotifierGuard::optionally_notify(self, || NotifyOption::SkipPersistNoEvents);
11430+
let _ = handle_error!(self, self.internal_peer_storage(counterparty_node_id, msg), counterparty_node_id);
11431+
}
11432+
11433+
fn handle_peer_storage_retrieval(&self, counterparty_node_id: PublicKey, msg: msgs::PeerStorageRetrieval) {
11434+
let _persistence_guard = PersistenceNotifierGuard::optionally_notify(self, || NotifyOption::SkipPersistNoEvents);
11435+
let _ = handle_error!(self, self.internal_peer_storage_retrieval(counterparty_node_id, msg), counterparty_node_id);
11436+
}
11437+
1142011438
fn handle_channel_ready(&self, counterparty_node_id: PublicKey, msg: &msgs::ChannelReady) {
1142111439
// Note that we never need to persist the updated ChannelManager for an inbound
1142211440
// channel_ready message - while the channel's state will change, any channel_ready message
@@ -11658,6 +11676,10 @@ where
1165811676
&events::MessageSendEvent::SendShortIdsQuery { .. } => false,
1165911677
&events::MessageSendEvent::SendReplyChannelRange { .. } => false,
1166011678
&events::MessageSendEvent::SendGossipTimestampFilter { .. } => false,
11679+
11680+
// Peer Storage
11681+
&events::MessageSendEvent::SendPeerStorage { .. } => false,
11682+
&events::MessageSendEvent::SendPeerStorageRetrieval { .. } => false,
1166111683
}
1166211684
});
1166311685
debug_assert!(peer_state.is_connected, "A disconnected peer cannot disconnect");

lightning/src/ln/functional_test_utils.rs

+6
Original file line numberDiff line numberDiff line change
@@ -880,6 +880,12 @@ macro_rules! get_htlc_update_msgs {
880880
/// such messages are intended to all peers.
881881
pub fn remove_first_msg_event_to_node(msg_node_id: &PublicKey, msg_events: &mut Vec<MessageSendEvent>) -> MessageSendEvent {
882882
let ev_index = msg_events.iter().position(|e| { match e {
883+
MessageSendEvent::SendPeerStorage { node_id, .. } => {
884+
node_id == msg_node_id
885+
},
886+
MessageSendEvent::SendPeerStorageRetrieval { node_id, .. } => {
887+
node_id == msg_node_id
888+
},
883889
MessageSendEvent::SendAcceptChannel { node_id, .. } => {
884890
node_id == msg_node_id
885891
},

lightning/src/ln/msgs.rs

+64
Original file line numberDiff line numberDiff line change
@@ -726,6 +726,36 @@ pub struct UpdateFulfillHTLC {
726726
pub payment_preimage: PaymentPreimage,
727727
}
728728

729+
/// A [`peer_storage`] message that can be sent to or received from a peer.
730+
///
731+
/// This message is used to distribute backup data to peers.
732+
/// If data is lost or corrupted, users can retrieve it through [`PeerStorageRetrieval`]
733+
/// to recover critical information, such as channel states, for fund recovery.
734+
///
735+
/// [`peer_storage`] is used to send our own encrypted backup data to a peer.
736+
///
737+
/// [`peer_storage`]: https://github.com/lightning/bolts/pull/1110
738+
#[derive(Clone, Debug, Hash, PartialEq, Eq)]
739+
pub struct PeerStorage {
740+
/// Our encrypted backup data included in the msg.
741+
pub data: Vec<u8>,
742+
}
743+
744+
/// A [`peer_storage_retrieval`] message that can be sent to or received from a peer.
745+
///
746+
/// This message is sent to peers for whom we store backup data.
747+
/// If we receive this message, it indicates that the peer had stored our backup data.
748+
/// This data can be used for fund recovery in case of data loss.
749+
///
750+
/// [`peer_storage_retrieval`] is used to send the most recent backup of the peer.
751+
///
752+
/// [`peer_storage_retrieval`]: https://github.com/lightning/bolts/pull/1110
753+
#[derive(Clone, Debug, Hash, PartialEq, Eq)]
754+
pub struct PeerStorageRetrieval {
755+
/// Most recent peer's data included in the msg.
756+
pub data: Vec<u8>,
757+
}
758+
729759
/// An [`update_fail_htlc`] message to be sent to or received from a peer.
730760
///
731761
/// [`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
@@ -1508,6 +1538,12 @@ pub trait ChannelMessageHandler : MessageSendEventsProvider {
15081538
/// Handle an incoming `channel_ready` message from the given peer.
15091539
fn handle_channel_ready(&self, their_node_id: PublicKey, msg: &ChannelReady);
15101540

1541+
// Peer Storage
1542+
/// Handle an incoming `peer_storage` message from the given peer.
1543+
fn handle_peer_storage(&self, their_node_id: PublicKey, msg: PeerStorage);
1544+
/// Handle an incoming `peer_storage_retrieval` message from the given peer.
1545+
fn handle_peer_storage_retrieval(&self, their_node_id: PublicKey, msg: PeerStorageRetrieval);
1546+
15111547
// Channel close:
15121548
/// Handle an incoming `shutdown` message from the given peer.
15131549
fn handle_shutdown(&self, their_node_id: PublicKey, msg: &Shutdown);
@@ -2634,6 +2670,14 @@ impl_writeable_msg!(UpdateFulfillHTLC, {
26342670
payment_preimage
26352671
}, {});
26362672

2673+
impl_writeable_msg!(PeerStorage, {
2674+
data
2675+
}, {});
2676+
2677+
impl_writeable_msg!(PeerStorageRetrieval, {
2678+
data
2679+
}, {});
2680+
26372681
// Note that this is written as a part of ChannelManager objects, and thus cannot change its
26382682
// serialization format in a way which assumes we know the total serialized length/message end
26392683
// position.
@@ -4536,6 +4580,26 @@ mod tests {
45364580
assert_eq!(encoded_value, target_value);
45374581
}
45384582

4583+
#[test]
4584+
fn encoding_peer_storage() {
4585+
let peer_storage = msgs::PeerStorage {
4586+
data: <Vec<u8>>::from_hex("01020304050607080910").unwrap()
4587+
};
4588+
let encoded_value = peer_storage.encode();
4589+
let target_value = <Vec<u8>>::from_hex("000a01020304050607080910").unwrap();
4590+
assert_eq!(encoded_value, target_value);
4591+
}
4592+
4593+
#[test]
4594+
fn encoding_peer_storage_retrieval() {
4595+
let peer_storage_retrieval = msgs::PeerStorageRetrieval {
4596+
data: <Vec<u8>>::from_hex("01020304050607080910").unwrap()
4597+
};
4598+
let encoded_value = peer_storage_retrieval.encode();
4599+
let target_value = <Vec<u8>>::from_hex("000a01020304050607080910").unwrap();
4600+
assert_eq!(encoded_value, target_value);
4601+
}
4602+
45394603
#[test]
45404604
fn encoding_pong() {
45414605
let pong = msgs::Pong {

lightning/src/ln/peer_handler.rs

+16
Original file line numberDiff line numberDiff line change
@@ -327,6 +327,8 @@ impl ChannelMessageHandler for ErroringMessageHandler {
327327
}
328328
// msgs::ChannelUpdate does not contain the channel_id field, so we just drop them.
329329
fn handle_channel_update(&self, _their_node_id: PublicKey, _msg: &msgs::ChannelUpdate) {}
330+
fn handle_peer_storage(&self, _their_node_id: PublicKey, _msg: msgs::PeerStorage) {}
331+
fn handle_peer_storage_retrieval(&self, _their_node_id: PublicKey, _msg: msgs::PeerStorageRetrieval) {}
330332
fn peer_disconnected(&self, _their_node_id: PublicKey) {}
331333
fn peer_connected(&self, _their_node_id: PublicKey, _init: &msgs::Init, _inbound: bool) -> Result<(), ()> { Ok(()) }
332334
fn handle_error(&self, _their_node_id: PublicKey, _msg: &msgs::ErrorMessage) {}
@@ -1850,6 +1852,12 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, OM: Deref, L: Deref, CM
18501852
wire::Message::ChannelReady(msg) => {
18511853
self.message_handler.chan_handler.handle_channel_ready(their_node_id, &msg);
18521854
},
1855+
wire::Message::PeerStorage(msg) => {
1856+
self.message_handler.chan_handler.handle_peer_storage(their_node_id, msg);
1857+
},
1858+
wire::Message::PeerStorageRetrieval(msg) => {
1859+
self.message_handler.chan_handler.handle_peer_storage_retrieval(their_node_id, msg);
1860+
},
18531861

18541862
// Quiescence messages:
18551863
wire::Message::Stfu(msg) => {
@@ -2163,6 +2171,14 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, OM: Deref, L: Deref, CM
21632171
// robustly gossip broadcast events even if a peer's message buffer is full.
21642172
let mut handle_event = |event, from_chan_handler| {
21652173
match event {
2174+
MessageSendEvent::SendPeerStorage { ref node_id, ref msg } => {
2175+
log_debug!(self.logger, "Handling SendPeerStorage event in peer_handler for {}", log_pubkey!(node_id));
2176+
self.enqueue_message(&mut *get_peer_for_forwarding!(node_id)?, msg);
2177+
},
2178+
MessageSendEvent::SendPeerStorageRetrieval { ref node_id, ref msg } => {
2179+
log_debug!(self.logger, "Handling SendPeerStorageRetrieval event in peer_handler for {}", log_pubkey!(node_id));
2180+
self.enqueue_message(&mut *get_peer_for_forwarding!(node_id)?, msg);
2181+
},
21662182
MessageSendEvent::SendAcceptChannel { ref node_id, ref msg } => {
21672183
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 {}",
21682184
log_pubkey!(node_id),

lightning/src/ln/wire.rs

+20
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+
PeerStorage(msgs::PeerStorage),
57+
PeerStorageRetrieval(msgs::PeerStorageRetrieval),
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::PeerStorage(ref msg) => msg.write(writer),
117+
&Message::PeerStorageRetrieval(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::PeerStorage(ref msg) => msg.type_id(),
177+
&Message::PeerStorageRetrieval(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::PeerStorage::TYPE => {
271+
Ok(Message::PeerStorage(Readable::read(buffer)?))
272+
},
273+
msgs::PeerStorageRetrieval::TYPE => {
274+
Ok(Message::PeerStorageRetrieval(Readable::read(buffer)?))
275+
},
264276
msgs::OpenChannel::TYPE => {
265277
Ok(Message::OpenChannel(Readable::read(buffer)?))
266278
},
@@ -448,6 +460,14 @@ impl Encode for msgs::Stfu {
448460
const TYPE: u16 = 2;
449461
}
450462

463+
impl Encode for msgs::PeerStorage {
464+
const TYPE: u16 = 7;
465+
}
466+
467+
impl Encode for msgs::PeerStorageRetrieval {
468+
const TYPE: u16 = 9;
469+
}
470+
451471
impl Encode for msgs::Init {
452472
const TYPE: u16 = 16;
453473
}

lightning/src/util/test_utils.rs

+10
Original file line numberDiff line numberDiff line change
@@ -1118,6 +1118,16 @@ impl msgs::ChannelMessageHandler for TestChannelMessageHandler {
11181118
self.received_msg(wire::Message::TxAbort(msg.clone()));
11191119
}
11201120

1121+
fn handle_peer_storage(&self, _their_node_id: PublicKey, msg: msgs::PeerStorage) {
1122+
self.received_msg(wire::Message::PeerStorage(msg));
1123+
}
1124+
1125+
fn handle_peer_storage_retrieval(
1126+
&self, _their_node_id: PublicKey, msg: msgs::PeerStorageRetrieval,
1127+
) {
1128+
self.received_msg(wire::Message::PeerStorageRetrieval(msg));
1129+
}
1130+
11211131
fn message_received(&self) {}
11221132
}
11231133

0 commit comments

Comments
 (0)