@@ -379,6 +379,11 @@ pub const FEE_SPIKE_BUFFER_FEE_INCREASE_MULTIPLE: u64 = 2;
379
379
#[ cfg( not( fuzzing) ) ]
380
380
const FEE_SPIKE_BUFFER_FEE_INCREASE_MULTIPLE : u64 = 2 ;
381
381
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
+
382
387
// TODO: We should refactor this to be an Inbound/OutboundChannel until initial setup handshaking
383
388
// has been completed, and then turn into a Channel to get compiler-time enforcement of things like
384
389
// 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> {
476
481
funding_tx_confirmed_in : Option < BlockHash > ,
477
482
funding_tx_confirmation_height : u32 ,
478
483
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 ,
479
488
480
489
counterparty_dust_limit_satoshis : u64 ,
481
490
#[ cfg( test) ]
@@ -647,7 +656,10 @@ impl<Signer: Sign> Channel<Signer> {
647
656
}
648
657
649
658
// 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 >
651
663
where K :: Target : KeysInterface < Signer = Signer > ,
652
664
F :: Target : FeeEstimator ,
653
665
{
@@ -735,6 +747,7 @@ impl<Signer: Sign> Channel<Signer> {
735
747
funding_tx_confirmed_in : None ,
736
748
funding_tx_confirmation_height : 0 ,
737
749
short_channel_id : None ,
750
+ channel_creation_height : current_chain_height,
738
751
739
752
feerate_per_kw : feerate,
740
753
counterparty_dust_limit_satoshis : 0 ,
@@ -808,7 +821,10 @@ impl<Signer: Sign> Channel<Signer> {
808
821
809
822
/// Creates a new channel from a remote sides' request for one.
810
823
/// 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 >
812
828
where K :: Target : KeysInterface < Signer = Signer > ,
813
829
F :: Target : FeeEstimator
814
830
{
@@ -1021,6 +1037,7 @@ impl<Signer: Sign> Channel<Signer> {
1021
1037
funding_tx_confirmed_in : None ,
1022
1038
funding_tx_confirmation_height : 0 ,
1023
1039
short_channel_id : None ,
1040
+ channel_creation_height : current_chain_height,
1024
1041
1025
1042
feerate_per_kw : msg. feerate_per_kw ,
1026
1043
channel_value_satoshis : msg. funding_satoshis ,
@@ -4236,6 +4253,13 @@ impl<Signer: Sign> Channel<Signer> {
4236
4253
self . minimum_depth. unwrap( ) , funding_tx_confirmations) ;
4237
4254
return Err ( ClosureReason :: ProcessingError { err : err_reason } ) ;
4238
4255
}
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 ) ;
4239
4263
}
4240
4264
4241
4265
Ok ( ( None , timed_out_htlcs) )
@@ -5274,16 +5298,18 @@ impl<Signer: Sign> Writeable for Channel<Signer> {
5274
5298
( 7 , self . shutdown_scriptpubkey, option) ,
5275
5299
( 9 , self . target_closing_feerate_sats_per_kw, option) ,
5276
5300
( 11 , self . monitor_pending_finalized_fulfills, vec_type) ,
5301
+ ( 13 , self . channel_creation_height, required) ,
5277
5302
} ) ;
5278
5303
5279
5304
Ok ( ( ) )
5280
5305
}
5281
5306
}
5282
5307
5283
5308
const 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 >
5285
5310
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;
5287
5313
let ver = read_ver_prefix ! ( reader, SERIALIZATION_VERSION ) ;
5288
5314
5289
5315
let user_id = Readable :: read ( reader) ?;
@@ -5511,6 +5537,7 @@ impl<'a, Signer: Sign, K: Deref> ReadableArgs<&'a K> for Channel<Signer>
5511
5537
// Prior to supporting channel type negotiation, all of our channels were static_remotekey
5512
5538
// only, so we default to that if none was written.
5513
5539
let mut channel_type = Some ( ChannelTypeFeatures :: only_static_remote_key ( ) ) ;
5540
+ let mut channel_creation_height = Some ( serialized_height) ;
5514
5541
read_tlv_fields ! ( reader, {
5515
5542
( 0 , announcement_sigs, option) ,
5516
5543
( 1 , minimum_depth, option) ,
@@ -5520,6 +5547,7 @@ impl<'a, Signer: Sign, K: Deref> ReadableArgs<&'a K> for Channel<Signer>
5520
5547
( 7 , shutdown_scriptpubkey, option) ,
5521
5548
( 9 , target_closing_feerate_sats_per_kw, option) ,
5522
5549
( 11 , monitor_pending_finalized_fulfills, vec_type) ,
5550
+ ( 13 , channel_creation_height, option) ,
5523
5551
} ) ;
5524
5552
5525
5553
let chan_features = channel_type. as_ref ( ) . unwrap ( ) ;
@@ -5584,6 +5612,7 @@ impl<'a, Signer: Sign, K: Deref> ReadableArgs<&'a K> for Channel<Signer>
5584
5612
funding_tx_confirmed_in,
5585
5613
funding_tx_confirmation_height,
5586
5614
short_channel_id,
5615
+ channel_creation_height : channel_creation_height. unwrap ( ) ,
5587
5616
5588
5617
counterparty_dust_limit_satoshis,
5589
5618
holder_dust_limit_satoshis,
@@ -5732,7 +5761,7 @@ mod tests {
5732
5761
let secp_ctx = Secp256k1 :: new ( ) ;
5733
5762
let node_id = PublicKey :: from_secret_key ( & secp_ctx, & SecretKey :: from_slice ( & [ 42 ; 32 ] ) . unwrap ( ) ) ;
5734
5763
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 ) {
5736
5765
Err ( APIError :: IncompatibleShutdownScript { script } ) => {
5737
5766
assert_eq ! ( script. into_inner( ) , non_v0_segwit_shutdown_script. into_inner( ) ) ;
5738
5767
} ,
@@ -5754,7 +5783,7 @@ mod tests {
5754
5783
5755
5784
let node_a_node_id = PublicKey :: from_secret_key ( & secp_ctx, & SecretKey :: from_slice ( & [ 42 ; 32 ] ) . unwrap ( ) ) ;
5756
5785
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 ( ) ;
5758
5787
5759
5788
// Now change the fee so we can check that the fee in the open_channel message is the
5760
5789
// same as the old fee.
@@ -5779,13 +5808,13 @@ mod tests {
5779
5808
// Create Node A's channel pointing to Node B's pubkey
5780
5809
let node_b_node_id = PublicKey :: from_secret_key ( & secp_ctx, & SecretKey :: from_slice ( & [ 42 ; 32 ] ) . unwrap ( ) ) ;
5781
5810
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 ( ) ;
5783
5812
5784
5813
// Create Node B's channel by receiving Node A's open_channel message
5785
5814
// Make sure A's dust limit is as we expect.
5786
5815
let open_channel_msg = node_a_chan. get_open_channel ( genesis_block ( network) . header . block_hash ( ) ) ;
5787
5816
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 ( ) ;
5789
5818
5790
5819
// Node B --> Node A: accept channel, explicitly setting B's dust limit.
5791
5820
let mut accept_channel_msg = node_b_chan. get_accept_channel ( ) ;
@@ -5849,7 +5878,7 @@ mod tests {
5849
5878
5850
5879
let node_id = PublicKey :: from_secret_key ( & secp_ctx, & SecretKey :: from_slice ( & [ 42 ; 32 ] ) . unwrap ( ) ) ;
5851
5880
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 ( ) ;
5853
5882
5854
5883
let commitment_tx_fee_0_htlcs = chan. commit_tx_fee_msat ( 0 ) ;
5855
5884
let commitment_tx_fee_1_htlc = chan. commit_tx_fee_msat ( 1 ) ;
@@ -5898,12 +5927,12 @@ mod tests {
5898
5927
// Create Node A's channel pointing to Node B's pubkey
5899
5928
let node_b_node_id = PublicKey :: from_secret_key ( & secp_ctx, & SecretKey :: from_slice ( & [ 42 ; 32 ] ) . unwrap ( ) ) ;
5900
5929
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 ( ) ;
5902
5931
5903
5932
// Create Node B's channel by receiving Node A's open_channel message
5904
5933
let open_channel_msg = node_a_chan. get_open_channel ( chain_hash) ;
5905
5934
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 ( ) ;
5907
5936
5908
5937
// Node B --> Node A: accept channel
5909
5938
let accept_channel_msg = node_b_chan. get_accept_channel ( ) ;
@@ -5960,7 +5989,7 @@ mod tests {
5960
5989
// Create a channel.
5961
5990
let node_b_node_id = PublicKey :: from_secret_key ( & secp_ctx, & SecretKey :: from_slice ( & [ 42 ; 32 ] ) . unwrap ( ) ) ;
5962
5991
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 ( ) ;
5964
5993
assert ! ( node_a_chan. counterparty_forwarding_info. is_none( ) ) ;
5965
5994
assert_eq ! ( node_a_chan. holder_htlc_minimum_msat, 1 ) ; // the default
5966
5995
assert ! ( node_a_chan. counterparty_forwarding_info( ) . is_none( ) ) ;
@@ -6024,7 +6053,7 @@ mod tests {
6024
6053
let counterparty_node_id = PublicKey :: from_secret_key ( & secp_ctx, & SecretKey :: from_slice ( & [ 42 ; 32 ] ) . unwrap ( ) ) ;
6025
6054
let mut config = UserConfig :: default ( ) ;
6026
6055
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
6028
6057
chan. holder_dust_limit_satoshis = 546 ;
6029
6058
chan. counterparty_selected_channel_reserve_satoshis = Some ( 0 ) ; // Filled in in accept_channel
6030
6059
0 commit comments