@@ -29,15 +29,15 @@ use bitcoin::hash_types::{BlockHash, Txid};
29
29
use crate :: chain;
30
30
use crate :: chain:: chaininterface:: { BroadcasterInterface , FeeEstimator } ;
31
31
use crate :: chain:: channelmonitor:: {
32
- Balance , ChannelMonitor , ChannelMonitorUpdate , MonitorEvent , TransactionOutputs ,
32
+ write_chanmon_internal , Balance , ChannelMonitor , ChannelMonitorUpdate , MonitorEvent , TransactionOutputs ,
33
33
WithChannelMonitor ,
34
34
} ;
35
35
use crate :: chain:: transaction:: { OutPoint , TransactionData } ;
36
36
use crate :: chain:: { ChannelMonitorUpdateStatus , Filter , WatchedOutput } ;
37
37
use crate :: events:: { self , Event , EventHandler , ReplayEvent } ;
38
38
use crate :: ln:: channel_state:: ChannelDetails ;
39
39
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 } ;
41
41
use crate :: ln:: types:: ChannelId ;
42
42
use crate :: prelude:: * ;
43
43
use crate :: sign:: ecdsa:: EcdsaChannelSigner ;
@@ -47,6 +47,7 @@ use crate::types::features::{InitFeatures, NodeFeatures};
47
47
use crate :: util:: errors:: APIError ;
48
48
use crate :: util:: logger:: { Logger , WithContext } ;
49
49
use crate :: util:: persist:: MonitorName ;
50
+ use crate :: util:: ser:: { VecWriter , Writeable } ;
50
51
use crate :: util:: wakers:: { Future , Notifier } ;
51
52
use bitcoin:: secp256k1:: PublicKey ;
52
53
use core:: ops:: Deref ;
@@ -810,10 +811,48 @@ where
810
811
}
811
812
812
813
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 > ( ) ;
815
816
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 ( ) ;
817
856
let our_peer_storage = DecryptedOurPeerStorage :: new ( serialised_channels) ;
818
857
let cipher = our_peer_storage. encrypt ( & self . our_peerstorage_encryption_key , & random_bytes) ;
819
858
0 commit comments