@@ -1704,12 +1704,18 @@ impl<Signer: Sign, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelMana
1704
1704
return Err ( APIError :: APIMisuseError { err : format ! ( "Channel value must be at least 1000 satoshis. It was {}" , channel_value_satoshis) } ) ;
1705
1705
}
1706
1706
1707
- let channel = {
1708
- let per_peer_state = self . per_peer_state . read ( ) . unwrap ( ) ;
1709
- match per_peer_state. get ( & their_network_key) {
1710
- Some ( peer_state) => {
1707
+ let _persistence_guard = PersistenceNotifierGuard :: notify_on_drop ( & self . total_consistency_lock , & self . persistence_notifier ) ;
1708
+ // We want to make sure the lock is actually acquired by PersistenceNotifierGuard.
1709
+ debug_assert ! ( & self . total_consistency_lock. try_write( ) . is_err( ) ) ;
1710
+
1711
+ let mut channel_state = self . channel_state . lock ( ) . unwrap ( ) ;
1712
+ let per_peer_state = self . per_peer_state . read ( ) . unwrap ( ) ;
1713
+ match per_peer_state. get ( & their_network_key) {
1714
+ None => return Err ( APIError :: ChannelUnavailable { err : format ! ( "Not connected to node: {}" , their_network_key) } ) ,
1715
+ Some ( peer_state) => {
1716
+ let mut peer_state = peer_state. lock ( ) . unwrap ( ) ;
1717
+ let channel = {
1711
1718
let outbound_scid_alias = self . create_and_insert_outbound_scid_alias ( ) ;
1712
- let peer_state = peer_state. lock ( ) . unwrap ( ) ;
1713
1719
let their_features = & peer_state. latest_features ;
1714
1720
let config = if override_config. is_some ( ) { override_config. as_ref ( ) . unwrap ( ) } else { & self . default_configuration } ;
1715
1721
match Channel :: new_outbound ( & self . fee_estimator , & self . keys_manager , their_network_key,
@@ -1722,38 +1728,29 @@ impl<Signer: Sign, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelMana
1722
1728
return Err ( e) ;
1723
1729
} ,
1724
1730
}
1725
- } ,
1726
- None => return Err ( APIError :: ChannelUnavailable { err : format ! ( "Not connected to node: {}" , their_network_key) } ) ,
1727
- }
1728
- } ;
1729
- let res = channel. get_open_channel ( self . genesis_hash . clone ( ) ) ;
1731
+ } ;
1732
+ let res = channel. get_open_channel ( self . genesis_hash . clone ( ) ) ;
1730
1733
1731
- let _persistence_guard = PersistenceNotifierGuard :: notify_on_drop ( & self . total_consistency_lock , & self . persistence_notifier ) ;
1732
- // We want to make sure the lock is actually acquired by PersistenceNotifierGuard.
1733
- debug_assert ! ( & self . total_consistency_lock. try_write( ) . is_err( ) ) ;
1734
+ let temporary_channel_id = channel. channel_id ( ) ;
1734
1735
1735
- let temporary_channel_id = channel. channel_id ( ) ;
1736
- let mut channel_state = self . channel_state . lock ( ) . unwrap ( ) ;
1737
- let per_peer_state = self . per_peer_state . read ( ) . unwrap ( ) ;
1738
- if let Some ( peer_state_mutex) = per_peer_state. get ( & their_network_key) {
1739
- let mut peer_state_lock = peer_state_mutex. lock ( ) . unwrap ( ) ;
1740
- let peer_state = & mut * peer_state_lock;
1741
- match peer_state. channel_by_id . entry ( temporary_channel_id) {
1742
- hash_map:: Entry :: Occupied ( _) => {
1743
- if cfg ! ( fuzzing) {
1744
- return Err ( APIError :: APIMisuseError { err : "Fuzzy bad RNG" . to_owned ( ) } ) ;
1745
- } else {
1746
- panic ! ( "RNG is bad???" ) ;
1747
- }
1748
- } ,
1749
- hash_map:: Entry :: Vacant ( entry) => { entry. insert ( channel) ; }
1736
+ match peer_state. channel_by_id . entry ( temporary_channel_id) {
1737
+ hash_map:: Entry :: Occupied ( _) => {
1738
+ if cfg ! ( fuzzing) {
1739
+ return Err ( APIError :: APIMisuseError { err : "Fuzzy bad RNG" . to_owned ( ) } ) ;
1740
+ } else {
1741
+ panic ! ( "RNG is bad???" ) ;
1742
+ }
1743
+ } ,
1744
+ hash_map:: Entry :: Vacant ( entry) => { entry. insert ( channel) ; }
1745
+ }
1746
+
1747
+ channel_state. pending_msg_events . push ( events:: MessageSendEvent :: SendOpenChannel {
1748
+ node_id : their_network_key,
1749
+ msg : res,
1750
+ } ) ;
1751
+ Ok ( temporary_channel_id)
1750
1752
}
1751
- } else { unreachable ! ( ) }
1752
- channel_state. pending_msg_events . push ( events:: MessageSendEvent :: SendOpenChannel {
1753
- node_id : their_network_key,
1754
- msg : res,
1755
- } ) ;
1756
- Ok ( temporary_channel_id)
1753
+ }
1757
1754
}
1758
1755
1759
1756
fn list_channels_with_filter < Fn : FnMut ( & ( & [ u8 ; 32 ] , & Channel < Signer > ) ) -> bool + Copy > ( & self , f : Fn ) -> Vec < ChannelDetails > {
@@ -2843,12 +2840,15 @@ impl<Signer: Sign, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelMana
2843
2840
fn funding_transaction_generated_intern < FundingOutput : Fn ( & Channel < Signer > , & Transaction ) -> Result < OutPoint , APIError > > (
2844
2841
& self , temporary_channel_id : & [ u8 ; 32 ] , counterparty_node_id : & PublicKey , funding_transaction : Transaction , find_funding_output : FundingOutput
2845
2842
) -> Result < ( ) , APIError > {
2846
- let ( chan, msg) = {
2847
- let ( res, chan) = {
2848
- let per_peer_state = self . per_peer_state . read ( ) . unwrap ( ) ;
2849
- if let Some ( peer_state_mutex) = per_peer_state. get ( counterparty_node_id) {
2850
- let mut peer_state_lock = peer_state_mutex. lock ( ) . unwrap ( ) ;
2851
- let peer_state = & mut * peer_state_lock;
2843
+ let mut channel_state_lock = self . channel_state . lock ( ) . unwrap ( ) ;
2844
+ let channel_state = & mut * channel_state_lock;
2845
+ let per_peer_state = self . per_peer_state . read ( ) . unwrap ( ) ;
2846
+ if let Some ( peer_state_mutex) = per_peer_state. get ( counterparty_node_id) {
2847
+ let mut peer_state_lock = peer_state_mutex. lock ( ) . unwrap ( ) ;
2848
+ let peer_state = & mut * peer_state_lock;
2849
+
2850
+ let ( chan, msg) = {
2851
+ let ( res, chan) = {
2852
2852
match peer_state. channel_by_id . remove ( temporary_channel_id) {
2853
2853
Some ( mut chan) => {
2854
2854
let funding_txo = find_funding_output ( & chan, & funding_transaction) ?;
@@ -2861,31 +2861,22 @@ impl<Signer: Sign, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelMana
2861
2861
} ,
2862
2862
None => { return Err ( APIError :: ChannelUnavailable { err : "No such channel" . to_owned ( ) } ) } ,
2863
2863
}
2864
- } else {
2865
- return Err ( APIError :: APIMisuseError { err : format ! ( "Can't find a peer with a node_id matching the passed counterparty_node_id {}" , counterparty_node_id) } )
2864
+ } ;
2865
+ match handle_error ! ( self , res, chan. get_counterparty_node_id( ) ) {
2866
+ Ok ( funding_msg) => {
2867
+ ( chan, funding_msg)
2868
+ } ,
2869
+ Err ( _) => { return Err ( APIError :: ChannelUnavailable {
2870
+ err : "Error deriving keys or signing initial commitment transactions - either our RNG or our counterparty's RNG is broken or the Signer refused to sign" . to_owned ( )
2871
+ } ) } ,
2866
2872
}
2867
2873
} ;
2868
- match handle_error ! ( self , res, chan. get_counterparty_node_id( ) ) {
2869
- Ok ( funding_msg) => {
2870
- ( chan, funding_msg)
2871
- } ,
2872
- Err ( _) => { return Err ( APIError :: ChannelUnavailable {
2873
- err : "Error deriving keys or signing initial commitment transactions - either our RNG or our counterparty's RNG is broken or the Signer refused to sign" . to_owned ( )
2874
- } ) } ,
2875
- }
2876
- } ;
2877
2874
2878
- let mut channel_state_lock = self . channel_state . lock ( ) . unwrap ( ) ;
2879
- let channel_state = & mut * channel_state_lock;
2880
- channel_state. pending_msg_events . push ( events:: MessageSendEvent :: SendFundingCreated {
2881
- node_id : chan. get_counterparty_node_id ( ) ,
2882
- msg,
2883
- } ) ;
2884
- let per_peer_state = self . per_peer_state . read ( ) . unwrap ( ) ;
2885
- let chan_id = chan. channel_id ( ) ;
2886
- if let Some ( peer_state_mutex) = per_peer_state. get ( counterparty_node_id) {
2887
- let mut peer_state_lock = peer_state_mutex. lock ( ) . unwrap ( ) ;
2888
- let peer_state = & mut * peer_state_lock;
2875
+ channel_state. pending_msg_events . push ( events:: MessageSendEvent :: SendFundingCreated {
2876
+ node_id : chan. get_counterparty_node_id ( ) ,
2877
+ msg,
2878
+ } ) ;
2879
+ let chan_id = chan. channel_id ( ) ;
2889
2880
match peer_state. channel_by_id . entry ( chan_id) {
2890
2881
hash_map:: Entry :: Occupied ( _) => {
2891
2882
panic ! ( "Generated duplicate funding txid?" ) ;
@@ -2898,8 +2889,10 @@ impl<Signer: Sign, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelMana
2898
2889
e. insert ( chan) ;
2899
2890
}
2900
2891
}
2901
- } else { unreachable ! ( ) ; }
2902
- Ok ( ( ) )
2892
+ Ok ( ( ) )
2893
+ } else {
2894
+ return Err ( APIError :: APIMisuseError { err : format ! ( "Can't find a peer with a node_id matching the passed counterparty_node_id {}" , counterparty_node_id) } )
2895
+ }
2903
2896
}
2904
2897
2905
2898
#[ cfg( test) ]
0 commit comments