Skip to content

Commit 9acecdc

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. TODO: Peer storage should not cross 64k limit.
1 parent ca9f813 commit 9acecdc

File tree

2 files changed

+225
-183
lines changed

2 files changed

+225
-183
lines changed

lightning/src/chain/chainmonitor.rs

Lines changed: 34 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -29,15 +29,17 @@ 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_util, 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};
40-
use crate::ln::our_peer_storage::DecryptedOurPeerStorage;
40+
use crate::ln::our_peer_storage::{
41+
DecryptedOurPeerStorage, PeerStorageMonitorHolder, PeerStorageMonitorHolderList,
42+
};
4143
use crate::ln::types::ChannelId;
4244
use crate::prelude::*;
4345
use crate::sign::ecdsa::EcdsaChannelSigner;
@@ -47,6 +49,7 @@ use crate::types::features::{InitFeatures, NodeFeatures};
4749
use crate::util::errors::APIError;
4850
use crate::util::logger::{Logger, WithContext};
4951
use crate::util::persist::MonitorName;
52+
use crate::util::ser::{VecWriter, Writeable};
5053
use crate::util::wakers::{Future, Notifier};
5154
use bitcoin::secp256k1::PublicKey;
5255
use core::ops::Deref;
@@ -810,10 +813,36 @@ where
810813
}
811814

812815
fn send_peer_storage(&self, their_node_id: PublicKey) {
813-
// TODO: Serialize `ChannelMonitor`s inside `our_peer_storage`.
814-
815816
let random_bytes = self.entropy_source.get_secure_random_bytes();
816-
let serialised_channels = Vec::new();
817+
818+
// TODO(aditya): Choose n random channels so that peer storage does not exceed 64k.
819+
let monitors = self.monitors.read().unwrap();
820+
let mut monitors_list = PeerStorageMonitorHolderList { monitors: Vec::new() };
821+
822+
for (chan_id, mon) in monitors.iter() {
823+
let mut ser_chan = VecWriter(Vec::new());
824+
let min_seen_secret = mon.monitor.get_min_seen_secret();
825+
let counterparty_node_id = mon.monitor.get_counterparty_node_id();
826+
827+
match write_util(&mon.monitor.inner.lock().unwrap(), true, &mut ser_chan) {
828+
Ok(_) => {
829+
let peer_storage_monitor = PeerStorageMonitorHolder {
830+
channel_id: *chan_id,
831+
min_seen_secret,
832+
counterparty_node_id,
833+
monitor_bytes: ser_chan.0,
834+
};
835+
836+
monitors_list.monitors.push(peer_storage_monitor);
837+
},
838+
Err(_) => {
839+
panic!("Can not write monitor for {}", mon.monitor.channel_id())
840+
},
841+
}
842+
}
843+
844+
let mut serialised_channels = Vec::new();
845+
monitors_list.write(&mut serialised_channels).unwrap();
817846
let our_peer_storage = DecryptedOurPeerStorage::new(serialised_channels);
818847
let cipher = our_peer_storage.encrypt(&self.our_peerstorage_encryption_key, &random_bytes);
819848

0 commit comments

Comments
 (0)