@@ -3501,11 +3501,63 @@ impl<Signer: Sign> Channel<Signer> {
3501
3501
self . network_sync == UpdateStatus :: DisabledMarked
3502
3502
}
3503
3503
3504
+ fn check_get_funding_locked ( & mut self , height : u32 ) -> Option < msgs:: FundingLocked > {
3505
+ if self . funding_tx_confirmation_height == 0 {
3506
+ return None ;
3507
+ }
3508
+
3509
+ let funding_tx_confirmations = height as i64 - self . funding_tx_confirmation_height as i64 + 1 ;
3510
+ if funding_tx_confirmations <= 0 {
3511
+ self . funding_tx_confirmation_height = 0 ;
3512
+ }
3513
+
3514
+ if funding_tx_confirmations < self . minimum_depth as i64 {
3515
+ return None ;
3516
+ }
3517
+
3518
+ let non_shutdown_state = self . channel_state & ( !MULTI_STATE_FLAGS ) ;
3519
+ let need_commitment_update = if non_shutdown_state == ChannelState :: FundingSent as u32 {
3520
+ self . channel_state |= ChannelState :: OurFundingLocked as u32 ;
3521
+ true
3522
+ } else if non_shutdown_state == ( ChannelState :: FundingSent as u32 | ChannelState :: TheirFundingLocked as u32 ) {
3523
+ self . channel_state = ChannelState :: ChannelFunded as u32 | ( self . channel_state & MULTI_STATE_FLAGS ) ;
3524
+ self . update_time_counter += 1 ;
3525
+ true
3526
+ } else if non_shutdown_state == ( ChannelState :: FundingSent as u32 | ChannelState :: OurFundingLocked as u32 ) {
3527
+ // We got a reorg but not enough to trigger a force close, just update
3528
+ // funding_tx_confirmed_in and return.
3529
+ false
3530
+ } else if self . channel_state < ChannelState :: ChannelFunded as u32 {
3531
+ panic ! ( "Started confirming a channel in a state pre-FundingSent?: {}" , self . channel_state) ;
3532
+ } else {
3533
+ // We got a reorg but not enough to trigger a force close, just update
3534
+ // funding_tx_confirmed_in and return.
3535
+ false
3536
+ } ;
3537
+
3538
+ //TODO: Note that this must be a duplicate of the previous commitment point they sent us,
3539
+ //as otherwise we will have a commitment transaction that they can't revoke (well, kinda,
3540
+ //they can by sending two revoke_and_acks back-to-back, but not really). This appears to be
3541
+ //a protocol oversight, but I assume I'm just missing something.
3542
+ if need_commitment_update {
3543
+ if self . channel_state & ( ChannelState :: MonitorUpdateFailed as u32 ) == 0 {
3544
+ let next_per_commitment_point = self . holder_signer . get_per_commitment_point ( self . cur_holder_commitment_transaction_number , & self . secp_ctx ) ;
3545
+ return Some ( msgs:: FundingLocked {
3546
+ channel_id : self . channel_id ,
3547
+ next_per_commitment_point,
3548
+ } ) ;
3549
+ } else {
3550
+ self . monitor_pending_funding_locked = true ;
3551
+ }
3552
+ }
3553
+ None
3554
+ }
3555
+
3504
3556
/// When a transaction is confirmed, we check whether it is or spends the funding transaction
3505
3557
/// In the first case, we store the confirmation height and calculating the short channel id.
3506
3558
/// In the second, we simply return an Err indicating we need to be force-closed now.
3507
3559
pub fn transactions_confirmed < L : Deref > ( & mut self , block_hash : & BlockHash , height : u32 , txdata : & TransactionData , logger : & L )
3508
- -> Result < ( ) , msgs:: ErrorMessage > where L :: Target : Logger {
3560
+ -> Result < Option < msgs :: FundingLocked > , msgs:: ErrorMessage > where L :: Target : Logger {
3509
3561
let non_shutdown_state = self . channel_state & ( !MULTI_STATE_FLAGS ) ;
3510
3562
for & ( index_in_block, tx) in txdata. iter ( ) {
3511
3563
if let Some ( funding_txo) = self . get_funding_txo ( ) {
@@ -3550,6 +3602,12 @@ impl<Signer: Sign> Channel<Signer> {
3550
3602
}
3551
3603
}
3552
3604
}
3605
+ // If we allow 1-conf funding, we may need to check for funding_locked here and
3606
+ // send it immediately instead of waiting for an update_best_block call (which
3607
+ // may have already happened for this block).
3608
+ if let Some ( funding_locked) = self . check_get_funding_locked ( height) {
3609
+ return Ok ( Some ( funding_locked) ) ;
3610
+ }
3553
3611
}
3554
3612
for inp in tx. input . iter ( ) {
3555
3613
if inp. previous_output == funding_txo. into_bitcoin_outpoint ( ) {
@@ -3562,7 +3620,7 @@ impl<Signer: Sign> Channel<Signer> {
3562
3620
}
3563
3621
}
3564
3622
}
3565
- Ok ( ( ) )
3623
+ Ok ( None )
3566
3624
}
3567
3625
3568
3626
/// When a new block is connected, we check the height of the block against outbound holding
@@ -3592,59 +3650,28 @@ impl<Signer: Sign> Channel<Signer> {
3592
3650
} ) ;
3593
3651
3594
3652
self . update_time_counter = cmp:: max ( self . update_time_counter , highest_header_time) ;
3595
- if self . funding_tx_confirmation_height > 0 {
3596
- let funding_tx_confirmations = height as i64 - self . funding_tx_confirmation_height as i64 + 1 ;
3597
- if funding_tx_confirmations <= 0 {
3598
- self . funding_tx_confirmation_height = 0 ;
3653
+
3654
+ if let Some ( funding_locked) = self . check_get_funding_locked ( height) {
3655
+ return Ok ( ( Some ( funding_locked) , timed_out_htlcs) ) ;
3656
+ }
3657
+
3658
+ let non_shutdown_state = self . channel_state & ( !MULTI_STATE_FLAGS ) ;
3659
+ if non_shutdown_state >= ChannelState :: ChannelFunded as u32 ||
3660
+ ( non_shutdown_state & ChannelState :: OurFundingLocked as u32 ) == ChannelState :: OurFundingLocked as u32 {
3661
+ let mut funding_tx_confirmations = height as i64 - self . funding_tx_confirmation_height as i64 + 1 ;
3662
+ if self . funding_tx_confirmation_height == 0 {
3663
+ // Note that check_get_funding_locked may reset funding_tx_confirmation_height to
3664
+ // zero if it has been reorged out, however in either case, our state flags
3665
+ // indicate we've already sent a funding_locked
3666
+ funding_tx_confirmations = 0 ;
3599
3667
}
3600
3668
3601
- let non_shutdown_state = self . channel_state & ( !MULTI_STATE_FLAGS ) ;
3602
- if ( non_shutdown_state >= ChannelState :: ChannelFunded as u32 ||
3603
- ( non_shutdown_state & ChannelState :: OurFundingLocked as u32 ) == ChannelState :: OurFundingLocked as u32 ) &&
3604
- funding_tx_confirmations < self . minimum_depth as i64 / 2 {
3669
+ if funding_tx_confirmations < self . minimum_depth as i64 / 2 {
3605
3670
return Err ( msgs:: ErrorMessage {
3606
3671
channel_id : self . channel_id ( ) ,
3607
3672
data : format ! ( "Funding transaction was un-confirmed. Locked at {} confs, now have {} confs." , self . minimum_depth, funding_tx_confirmations) ,
3608
3673
} ) ;
3609
3674
}
3610
-
3611
- if funding_tx_confirmations == self . minimum_depth as i64 {
3612
- let need_commitment_update = if non_shutdown_state == ChannelState :: FundingSent as u32 {
3613
- self . channel_state |= ChannelState :: OurFundingLocked as u32 ;
3614
- true
3615
- } else if non_shutdown_state == ( ChannelState :: FundingSent as u32 | ChannelState :: TheirFundingLocked as u32 ) {
3616
- self . channel_state = ChannelState :: ChannelFunded as u32 | ( self . channel_state & MULTI_STATE_FLAGS ) ;
3617
- self . update_time_counter += 1 ;
3618
- true
3619
- } else if non_shutdown_state == ( ChannelState :: FundingSent as u32 | ChannelState :: OurFundingLocked as u32 ) {
3620
- // We got a reorg but not enough to trigger a force close, just update
3621
- // funding_tx_confirmed_in and return.
3622
- false
3623
- } else if self . channel_state < ChannelState :: ChannelFunded as u32 {
3624
- panic ! ( "Started confirming a channel in a state pre-FundingSent?: {}" , self . channel_state) ;
3625
- } else {
3626
- // We got a reorg but not enough to trigger a force close, just update
3627
- // funding_tx_confirmed_in and return.
3628
- false
3629
- } ;
3630
-
3631
- //TODO: Note that this must be a duplicate of the previous commitment point they sent us,
3632
- //as otherwise we will have a commitment transaction that they can't revoke (well, kinda,
3633
- //they can by sending two revoke_and_acks back-to-back, but not really). This appears to be
3634
- //a protocol oversight, but I assume I'm just missing something.
3635
- if need_commitment_update {
3636
- if self . channel_state & ( ChannelState :: MonitorUpdateFailed as u32 ) == 0 {
3637
- let next_per_commitment_point = self . holder_signer . get_per_commitment_point ( self . cur_holder_commitment_transaction_number , & self . secp_ctx ) ;
3638
- return Ok ( ( Some ( msgs:: FundingLocked {
3639
- channel_id : self . channel_id ,
3640
- next_per_commitment_point,
3641
- } ) , timed_out_htlcs) ) ;
3642
- } else {
3643
- self . monitor_pending_funding_locked = true ;
3644
- return Ok ( ( None , timed_out_htlcs) ) ;
3645
- }
3646
- }
3647
- }
3648
3675
}
3649
3676
3650
3677
Ok ( ( None , timed_out_htlcs) )
0 commit comments