@@ -29,15 +29,17 @@ 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_util , 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 } ;
40
- use crate :: ln:: our_peer_storage:: DecryptedOurPeerStorage ;
40
+ use crate :: ln:: our_peer_storage:: {
41
+ DecryptedOurPeerStorage , PeerStorageMonitorHolder , PeerStorageMonitorHolderList ,
42
+ } ;
41
43
use crate :: ln:: types:: ChannelId ;
42
44
use crate :: prelude:: * ;
43
45
use crate :: sign:: ecdsa:: EcdsaChannelSigner ;
@@ -47,6 +49,7 @@ use crate::types::features::{InitFeatures, NodeFeatures};
47
49
use crate :: util:: errors:: APIError ;
48
50
use crate :: util:: logger:: { Logger , WithContext } ;
49
51
use crate :: util:: persist:: MonitorName ;
52
+ use crate :: util:: ser:: { VecWriter , Writeable } ;
50
53
use crate :: util:: wakers:: { Future , Notifier } ;
51
54
use bitcoin:: secp256k1:: PublicKey ;
52
55
use core:: ops:: Deref ;
@@ -810,10 +813,36 @@ where
810
813
}
811
814
812
815
fn send_peer_storage ( & self , their_node_id : PublicKey ) {
813
- // TODO: Serialize `ChannelMonitor`s inside `our_peer_storage`.
814
-
815
816
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 ( ) ;
817
846
let our_peer_storage = DecryptedOurPeerStorage :: new ( serialised_channels) ;
818
847
let cipher = our_peer_storage. encrypt ( & self . our_peerstorage_encryption_key , & random_bytes) ;
819
848
0 commit comments