@@ -379,6 +379,11 @@ pub const FEE_SPIKE_BUFFER_FEE_INCREASE_MULTIPLE: u64 = 2;
379379#[ cfg( not( fuzzing) ) ]
380380const FEE_SPIKE_BUFFER_FEE_INCREASE_MULTIPLE : u64 = 2 ;
381381
382+ /// If we fail to see a funding transaction confirmed on-chain within this many blocks after the
383+ /// channel creation on an inbound channel, we simply force-close and move on.
384+ /// This constant is the one suggested in BOLT 2.
385+ pub ( crate ) const FUNDING_CONF_DEADLINE_BLOCKS : u32 = 2016 ;
386+
382387// TODO: We should refactor this to be an Inbound/OutboundChannel until initial setup handshaking
383388// has been completed, and then turn into a Channel to get compiler-time enforcement of things like
384389// calling channel_id() before we're set up or things like get_outbound_funding_signed on an
@@ -476,6 +481,10 @@ pub(super) struct Channel<Signer: Sign> {
476481 funding_tx_confirmed_in : Option < BlockHash > ,
477482 funding_tx_confirmation_height : u32 ,
478483 short_channel_id : Option < u64 > ,
484+ /// Either the height at which this channel was created or the height at which it was last
485+ /// serialized if it was serialized by versions prior to 0.0.103.
486+ /// We use this to close if funding is never broadcasted.
487+ channel_creation_height : u32 ,
479488
480489 counterparty_dust_limit_satoshis : u64 ,
481490 #[ cfg( test) ]
@@ -647,7 +656,10 @@ impl<Signer: Sign> Channel<Signer> {
647656 }
648657
649658 // Constructors:
650- pub fn new_outbound < K : Deref , F : Deref > ( fee_estimator : & F , keys_provider : & K , counterparty_node_id : PublicKey , their_features : & InitFeatures , channel_value_satoshis : u64 , push_msat : u64 , user_id : u64 , config : & UserConfig ) -> Result < Channel < Signer > , APIError >
659+ pub fn new_outbound < K : Deref , F : Deref > (
660+ fee_estimator : & F , keys_provider : & K , counterparty_node_id : PublicKey , their_features : & InitFeatures ,
661+ channel_value_satoshis : u64 , push_msat : u64 , user_id : u64 , config : & UserConfig , current_chain_height : u32
662+ ) -> Result < Channel < Signer > , APIError >
651663 where K :: Target : KeysInterface < Signer = Signer > ,
652664 F :: Target : FeeEstimator ,
653665 {
@@ -735,6 +747,7 @@ impl<Signer: Sign> Channel<Signer> {
735747 funding_tx_confirmed_in : None ,
736748 funding_tx_confirmation_height : 0 ,
737749 short_channel_id : None ,
750+ channel_creation_height : current_chain_height,
738751
739752 feerate_per_kw : feerate,
740753 counterparty_dust_limit_satoshis : 0 ,
@@ -808,7 +821,10 @@ impl<Signer: Sign> Channel<Signer> {
808821
809822 /// Creates a new channel from a remote sides' request for one.
810823 /// Assumes chain_hash has already been checked and corresponds with what we expect!
811- pub fn new_from_req < K : Deref , F : Deref > ( fee_estimator : & F , keys_provider : & K , counterparty_node_id : PublicKey , their_features : & InitFeatures , msg : & msgs:: OpenChannel , user_id : u64 , config : & UserConfig ) -> Result < Channel < Signer > , ChannelError >
824+ pub fn new_from_req < K : Deref , F : Deref > (
825+ fee_estimator : & F , keys_provider : & K , counterparty_node_id : PublicKey , their_features : & InitFeatures ,
826+ msg : & msgs:: OpenChannel , user_id : u64 , config : & UserConfig , current_chain_height : u32
827+ ) -> Result < Channel < Signer > , ChannelError >
812828 where K :: Target : KeysInterface < Signer = Signer > ,
813829 F :: Target : FeeEstimator
814830 {
@@ -1021,6 +1037,7 @@ impl<Signer: Sign> Channel<Signer> {
10211037 funding_tx_confirmed_in : None ,
10221038 funding_tx_confirmation_height : 0 ,
10231039 short_channel_id : None ,
1040+ channel_creation_height : current_chain_height,
10241041
10251042 feerate_per_kw : msg. feerate_per_kw ,
10261043 channel_value_satoshis : msg. funding_satoshis ,
@@ -4236,6 +4253,13 @@ impl<Signer: Sign> Channel<Signer> {
42364253 self . minimum_depth. unwrap( ) , funding_tx_confirmations) ;
42374254 return Err ( ClosureReason :: ProcessingError { err : err_reason } ) ;
42384255 }
4256+ } else if !self . is_outbound ( ) && self . funding_tx_confirmed_in . is_none ( ) &&
4257+ height >= self . channel_creation_height + FUNDING_CONF_DEADLINE_BLOCKS {
4258+ log_info ! ( logger, "Closing channel {} due to funding timeout" , log_bytes!( self . channel_id) ) ;
4259+ // If funding_tx_confirmed_in is unset, the channel must not be active
4260+ assert ! ( non_shutdown_state <= ChannelState :: ChannelFunded as u32 ) ;
4261+ assert_eq ! ( non_shutdown_state & ChannelState :: OurFundingLocked as u32 , 0 ) ;
4262+ return Err ( ClosureReason :: FundingTimedOut ) ;
42394263 }
42404264
42414265 Ok ( ( None , timed_out_htlcs) )
@@ -5274,16 +5298,18 @@ impl<Signer: Sign> Writeable for Channel<Signer> {
52745298 ( 7 , self . shutdown_scriptpubkey, option) ,
52755299 ( 9 , self . target_closing_feerate_sats_per_kw, option) ,
52765300 ( 11 , self . monitor_pending_finalized_fulfills, vec_type) ,
5301+ ( 13 , self . channel_creation_height, required) ,
52775302 } ) ;
52785303
52795304 Ok ( ( ) )
52805305 }
52815306}
52825307
52835308const MAX_ALLOC_SIZE : usize = 64 * 1024 ;
5284- impl < ' a , Signer : Sign , K : Deref > ReadableArgs < & ' a K > for Channel < Signer >
5309+ impl < ' a , Signer : Sign , K : Deref > ReadableArgs < ( & ' a K , u32 ) > for Channel < Signer >
52855310 where K :: Target : KeysInterface < Signer = Signer > {
5286- fn read < R : io:: Read > ( reader : & mut R , keys_source : & ' a K ) -> Result < Self , DecodeError > {
5311+ fn read < R : io:: Read > ( reader : & mut R , args : ( & ' a K , u32 ) ) -> Result < Self , DecodeError > {
5312+ let ( keys_source, serialized_height) = args;
52875313 let ver = read_ver_prefix ! ( reader, SERIALIZATION_VERSION ) ;
52885314
52895315 let user_id = Readable :: read ( reader) ?;
@@ -5511,6 +5537,7 @@ impl<'a, Signer: Sign, K: Deref> ReadableArgs<&'a K> for Channel<Signer>
55115537 // Prior to supporting channel type negotiation, all of our channels were static_remotekey
55125538 // only, so we default to that if none was written.
55135539 let mut channel_type = Some ( ChannelTypeFeatures :: only_static_remote_key ( ) ) ;
5540+ let mut channel_creation_height = Some ( serialized_height) ;
55145541 read_tlv_fields ! ( reader, {
55155542 ( 0 , announcement_sigs, option) ,
55165543 ( 1 , minimum_depth, option) ,
@@ -5520,6 +5547,7 @@ impl<'a, Signer: Sign, K: Deref> ReadableArgs<&'a K> for Channel<Signer>
55205547 ( 7 , shutdown_scriptpubkey, option) ,
55215548 ( 9 , target_closing_feerate_sats_per_kw, option) ,
55225549 ( 11 , monitor_pending_finalized_fulfills, vec_type) ,
5550+ ( 13 , channel_creation_height, option) ,
55235551 } ) ;
55245552
55255553 let chan_features = channel_type. as_ref ( ) . unwrap ( ) ;
@@ -5584,6 +5612,7 @@ impl<'a, Signer: Sign, K: Deref> ReadableArgs<&'a K> for Channel<Signer>
55845612 funding_tx_confirmed_in,
55855613 funding_tx_confirmation_height,
55865614 short_channel_id,
5615+ channel_creation_height : channel_creation_height. unwrap ( ) ,
55875616
55885617 counterparty_dust_limit_satoshis,
55895618 holder_dust_limit_satoshis,
@@ -5732,7 +5761,7 @@ mod tests {
57325761 let secp_ctx = Secp256k1 :: new ( ) ;
57335762 let node_id = PublicKey :: from_secret_key ( & secp_ctx, & SecretKey :: from_slice ( & [ 42 ; 32 ] ) . unwrap ( ) ) ;
57345763 let config = UserConfig :: default ( ) ;
5735- match Channel :: < EnforcingSigner > :: new_outbound ( & & fee_estimator, & & keys_provider, node_id, & features, 10000000 , 100000 , 42 , & config) {
5764+ match Channel :: < EnforcingSigner > :: new_outbound ( & & fee_estimator, & & keys_provider, node_id, & features, 10000000 , 100000 , 42 , & config, 0 ) {
57365765 Err ( APIError :: IncompatibleShutdownScript { script } ) => {
57375766 assert_eq ! ( script. into_inner( ) , non_v0_segwit_shutdown_script. into_inner( ) ) ;
57385767 } ,
@@ -5754,7 +5783,7 @@ mod tests {
57545783
57555784 let node_a_node_id = PublicKey :: from_secret_key ( & secp_ctx, & SecretKey :: from_slice ( & [ 42 ; 32 ] ) . unwrap ( ) ) ;
57565785 let config = UserConfig :: default ( ) ;
5757- let node_a_chan = Channel :: < EnforcingSigner > :: new_outbound ( & & fee_est, & & keys_provider, node_a_node_id, & InitFeatures :: known ( ) , 10000000 , 100000 , 42 , & config) . unwrap ( ) ;
5786+ let node_a_chan = Channel :: < EnforcingSigner > :: new_outbound ( & & fee_est, & & keys_provider, node_a_node_id, & InitFeatures :: known ( ) , 10000000 , 100000 , 42 , & config, 0 ) . unwrap ( ) ;
57585787
57595788 // Now change the fee so we can check that the fee in the open_channel message is the
57605789 // same as the old fee.
@@ -5779,13 +5808,13 @@ mod tests {
57795808 // Create Node A's channel pointing to Node B's pubkey
57805809 let node_b_node_id = PublicKey :: from_secret_key ( & secp_ctx, & SecretKey :: from_slice ( & [ 42 ; 32 ] ) . unwrap ( ) ) ;
57815810 let config = UserConfig :: default ( ) ;
5782- let mut node_a_chan = Channel :: < EnforcingSigner > :: new_outbound ( & & feeest, & & keys_provider, node_b_node_id, & InitFeatures :: known ( ) , 10000000 , 100000 , 42 , & config) . unwrap ( ) ;
5811+ let mut node_a_chan = Channel :: < EnforcingSigner > :: new_outbound ( & & feeest, & & keys_provider, node_b_node_id, & InitFeatures :: known ( ) , 10000000 , 100000 , 42 , & config, 0 ) . unwrap ( ) ;
57835812
57845813 // Create Node B's channel by receiving Node A's open_channel message
57855814 // Make sure A's dust limit is as we expect.
57865815 let open_channel_msg = node_a_chan. get_open_channel ( genesis_block ( network) . header . block_hash ( ) ) ;
57875816 let node_b_node_id = PublicKey :: from_secret_key ( & secp_ctx, & SecretKey :: from_slice ( & [ 7 ; 32 ] ) . unwrap ( ) ) ;
5788- let node_b_chan = Channel :: < EnforcingSigner > :: new_from_req ( & & feeest, & & keys_provider, node_b_node_id, & InitFeatures :: known ( ) , & open_channel_msg, 7 , & config) . unwrap ( ) ;
5817+ let node_b_chan = Channel :: < EnforcingSigner > :: new_from_req ( & & feeest, & & keys_provider, node_b_node_id, & InitFeatures :: known ( ) , & open_channel_msg, 7 , & config, 0 ) . unwrap ( ) ;
57895818
57905819 // Node B --> Node A: accept channel, explicitly setting B's dust limit.
57915820 let mut accept_channel_msg = node_b_chan. get_accept_channel ( ) ;
@@ -5849,7 +5878,7 @@ mod tests {
58495878
58505879 let node_id = PublicKey :: from_secret_key ( & secp_ctx, & SecretKey :: from_slice ( & [ 42 ; 32 ] ) . unwrap ( ) ) ;
58515880 let config = UserConfig :: default ( ) ;
5852- let mut chan = Channel :: < EnforcingSigner > :: new_outbound ( & & fee_est, & & keys_provider, node_id, & InitFeatures :: known ( ) , 10000000 , 100000 , 42 , & config) . unwrap ( ) ;
5881+ let mut chan = Channel :: < EnforcingSigner > :: new_outbound ( & & fee_est, & & keys_provider, node_id, & InitFeatures :: known ( ) , 10000000 , 100000 , 42 , & config, 0 ) . unwrap ( ) ;
58535882
58545883 let commitment_tx_fee_0_htlcs = chan. commit_tx_fee_msat ( 0 ) ;
58555884 let commitment_tx_fee_1_htlc = chan. commit_tx_fee_msat ( 1 ) ;
@@ -5898,12 +5927,12 @@ mod tests {
58985927 // Create Node A's channel pointing to Node B's pubkey
58995928 let node_b_node_id = PublicKey :: from_secret_key ( & secp_ctx, & SecretKey :: from_slice ( & [ 42 ; 32 ] ) . unwrap ( ) ) ;
59005929 let config = UserConfig :: default ( ) ;
5901- let mut node_a_chan = Channel :: < EnforcingSigner > :: new_outbound ( & & feeest, & & keys_provider, node_b_node_id, & InitFeatures :: known ( ) , 10000000 , 100000 , 42 , & config) . unwrap ( ) ;
5930+ let mut node_a_chan = Channel :: < EnforcingSigner > :: new_outbound ( & & feeest, & & keys_provider, node_b_node_id, & InitFeatures :: known ( ) , 10000000 , 100000 , 42 , & config, 0 ) . unwrap ( ) ;
59025931
59035932 // Create Node B's channel by receiving Node A's open_channel message
59045933 let open_channel_msg = node_a_chan. get_open_channel ( chain_hash) ;
59055934 let node_b_node_id = PublicKey :: from_secret_key ( & secp_ctx, & SecretKey :: from_slice ( & [ 7 ; 32 ] ) . unwrap ( ) ) ;
5906- let mut node_b_chan = Channel :: < EnforcingSigner > :: new_from_req ( & & feeest, & & keys_provider, node_b_node_id, & InitFeatures :: known ( ) , & open_channel_msg, 7 , & config) . unwrap ( ) ;
5935+ let mut node_b_chan = Channel :: < EnforcingSigner > :: new_from_req ( & & feeest, & & keys_provider, node_b_node_id, & InitFeatures :: known ( ) , & open_channel_msg, 7 , & config, 0 ) . unwrap ( ) ;
59075936
59085937 // Node B --> Node A: accept channel
59095938 let accept_channel_msg = node_b_chan. get_accept_channel ( ) ;
@@ -5960,7 +5989,7 @@ mod tests {
59605989 // Create a channel.
59615990 let node_b_node_id = PublicKey :: from_secret_key ( & secp_ctx, & SecretKey :: from_slice ( & [ 42 ; 32 ] ) . unwrap ( ) ) ;
59625991 let config = UserConfig :: default ( ) ;
5963- let mut node_a_chan = Channel :: < EnforcingSigner > :: new_outbound ( & & feeest, & & keys_provider, node_b_node_id, & InitFeatures :: known ( ) , 10000000 , 100000 , 42 , & config) . unwrap ( ) ;
5992+ let mut node_a_chan = Channel :: < EnforcingSigner > :: new_outbound ( & & feeest, & & keys_provider, node_b_node_id, & InitFeatures :: known ( ) , 10000000 , 100000 , 42 , & config, 0 ) . unwrap ( ) ;
59645993 assert ! ( node_a_chan. counterparty_forwarding_info. is_none( ) ) ;
59655994 assert_eq ! ( node_a_chan. holder_htlc_minimum_msat, 1 ) ; // the default
59665995 assert ! ( node_a_chan. counterparty_forwarding_info( ) . is_none( ) ) ;
@@ -6024,7 +6053,7 @@ mod tests {
60246053 let counterparty_node_id = PublicKey :: from_secret_key ( & secp_ctx, & SecretKey :: from_slice ( & [ 42 ; 32 ] ) . unwrap ( ) ) ;
60256054 let mut config = UserConfig :: default ( ) ;
60266055 config. channel_options . announced_channel = false ;
6027- let mut chan = Channel :: < InMemorySigner > :: new_outbound ( & & feeest, & & keys_provider, counterparty_node_id, & InitFeatures :: known ( ) , 10_000_000 , 100000 , 42 , & config) . unwrap ( ) ; // Nothing uses their network key in this test
6056+ let mut chan = Channel :: < InMemorySigner > :: new_outbound ( & & feeest, & & keys_provider, counterparty_node_id, & InitFeatures :: known ( ) , 10_000_000 , 100000 , 42 , & config, 0 ) . unwrap ( ) ; // Nothing uses their network key in this test
60286057 chan. holder_dust_limit_satoshis = 546 ;
60296058 chan. counterparty_selected_channel_reserve_satoshis = Some ( 0 ) ; // Filled in in accept_channel
60306059
0 commit comments