@@ -29,15 +29,17 @@ use bitcoin::hash_types::{BlockHash, Txid};
2929use crate :: chain;
3030use crate :: chain:: chaininterface:: { BroadcasterInterface , FeeEstimator } ;
3131use crate :: chain:: channelmonitor:: {
32- Balance , ChannelMonitor , ChannelMonitorUpdate , MonitorEvent , TransactionOutputs ,
32+ write_util , Balance , ChannelMonitor , ChannelMonitorUpdate , MonitorEvent , TransactionOutputs ,
3333 WithChannelMonitor ,
3434} ;
3535use crate :: chain:: transaction:: { OutPoint , TransactionData } ;
3636use crate :: chain:: { ChannelMonitorUpdateStatus , Filter , WatchedOutput } ;
3737use crate :: events:: { self , Event , EventHandler , ReplayEvent } ;
3838use crate :: ln:: channel_state:: ChannelDetails ;
3939use 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+ } ;
4143use crate :: ln:: types:: ChannelId ;
4244use crate :: prelude:: * ;
4345use crate :: sign:: ecdsa:: EcdsaChannelSigner ;
@@ -47,6 +49,7 @@ use crate::types::features::{InitFeatures, NodeFeatures};
4749use crate :: util:: errors:: APIError ;
4850use crate :: util:: logger:: { Logger , WithContext } ;
4951use crate :: util:: persist:: MonitorName ;
52+ use crate :: util:: ser:: { VecWriter , Writeable } ;
5053use crate :: util:: wakers:: { Future , Notifier } ;
5154use bitcoin:: secp256k1:: PublicKey ;
5255use 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