Skip to content

Commit a05b011

Browse files
committed
Serialise ChannelMonitors and send them over inside Peer Storage
Create a utililty function to prevent code duplication while writing ChannelMonitors. Serialise them inside ChainMonitor::send_peer_storage and send them over.
1 parent cfebc80 commit a05b011

File tree

2 files changed

+254
-192
lines changed

2 files changed

+254
-192
lines changed

lightning/src/chain/chainmonitor.rs

Lines changed: 44 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -29,15 +29,15 @@ use bitcoin::hash_types::{BlockHash, Txid};
2929
use crate::chain;
3030
use crate::chain::chaininterface::{BroadcasterInterface, FeeEstimator};
3131
use crate::chain::channelmonitor::{
32-
Balance, ChannelMonitor, ChannelMonitorUpdate, MonitorEvent, TransactionOutputs,
32+
write_chanmon_internal, Balance, ChannelMonitor, ChannelMonitorUpdate, MonitorEvent, TransactionOutputs,
3333
WithChannelMonitor,
3434
};
3535
use crate::chain::transaction::{OutPoint, TransactionData};
3636
use crate::chain::{ChannelMonitorUpdateStatus, Filter, WatchedOutput};
3737
use crate::events::{self, Event, EventHandler, ReplayEvent};
3838
use crate::ln::channel_state::ChannelDetails;
3939
use crate::ln::msgs::{self, BaseMessageHandler, Init, MessageSendEvent, SendOnlyMessageHandler};
40-
use crate::ln::our_peer_storage::DecryptedOurPeerStorage;
40+
use crate::ln::our_peer_storage::{DecryptedOurPeerStorage, PeerStorageMonitorHolder};
4141
use crate::ln::types::ChannelId;
4242
use crate::prelude::*;
4343
use crate::sign::ecdsa::EcdsaChannelSigner;
@@ -47,6 +47,7 @@ use crate::types::features::{InitFeatures, NodeFeatures};
4747
use crate::util::errors::APIError;
4848
use crate::util::logger::{Logger, WithContext};
4949
use crate::util::persist::MonitorName;
50+
use crate::util::ser::{VecWriter, Writeable};
5051
use crate::util::wakers::{Future, Notifier};
5152
use bitcoin::secp256k1::PublicKey;
5253
use core::ops::Deref;
@@ -810,10 +811,48 @@ where
810811
}
811812

812813
fn send_peer_storage(&self, their_node_id: PublicKey) {
813-
// TODO: Serialize `ChannelMonitor`s inside `our_peer_storage`.
814-
814+
const MAX_PEER_STORAGE_SIZE: usize = 65531;
815+
const USIZE_LEN: usize = core::mem::size_of::<usize>();
815816
let random_bytes = self.entropy_source.get_secure_random_bytes();
816-
let serialised_channels = Vec::new();
817+
let random_usize = usize::from_le_bytes(random_bytes[0..USIZE_LEN].try_into().unwrap());
818+
819+
let monitors = self.monitors.read().unwrap();
820+
let mut monitors_list: Vec<PeerStorageMonitorHolder> = Vec::new();
821+
let mut curr_size = 0;
822+
823+
// Randomising Keys in the HashMap to fetch monitors without repetition.
824+
let mut keys: Vec<&ChannelId> = monitors.keys().collect();
825+
for i in (1..keys.len()).rev() {
826+
let j = random_usize % (i + 1);
827+
keys.swap(i, j);
828+
}
829+
830+
for chan_id in keys {
831+
let mon = &monitors[chan_id];
832+
let mut ser_chan = VecWriter(Vec::new());
833+
let min_seen_secret = mon.monitor.get_min_seen_secret();
834+
let counterparty_node_id = mon.monitor.get_counterparty_node_id();
835+
let chan_mon = mon.monitor.inner.lock().unwrap();
836+
837+
write_chanmon_internal(&chan_mon, true, &mut ser_chan).expect("can not write Channel Monitor for peer storage message");
838+
839+
let peer_storage_monitor = PeerStorageMonitorHolder {
840+
channel_id: *chan_id,
841+
min_seen_secret,
842+
counterparty_node_id,
843+
monitor_bytes: ser_chan.0,
844+
};
845+
846+
// Adding size of peer_storage_monitor.
847+
curr_size += peer_storage_monitor.serialized_length();
848+
849+
if curr_size > MAX_PEER_STORAGE_SIZE {
850+
break;
851+
}
852+
monitors_list.push(peer_storage_monitor);
853+
}
854+
855+
let serialised_channels = monitors_list.encode();
817856
let our_peer_storage = DecryptedOurPeerStorage::new(serialised_channels);
818857
let cipher = our_peer_storage.encrypt(&self.our_peerstorage_encryption_key, &random_bytes);
819858

0 commit comments

Comments
 (0)