@@ -23,7 +23,7 @@ use secp256k1;
2323use chain:: chaininterface:: { BroadcasterInterface , ChainListener , ChainWatchInterface , FeeEstimator } ;
2424use chain:: transaction:: OutPoint ;
2525use ln:: channel:: { Channel , ChannelError , ChannelKeys } ;
26- use ln:: channelmonitor:: ManyChannelMonitor ;
26+ use ln:: channelmonitor:: { ManyChannelMonitor , CLTV_CLAIM_BUFFER , HTLC_FAIL_TIMEOUT_BLOCKS } ;
2727use ln:: router:: { Route , RouteHop } ;
2828use ln:: msgs;
2929use ln:: msgs:: { HandleError , ChannelMessageHandler } ;
@@ -300,7 +300,27 @@ pub struct ChannelManager {
300300 logger : Arc < Logger > ,
301301}
302302
303+ /// The minimum number of blocks between an inbound HTLC's CLTV and the corresponding outbound
304+ /// HTLC's CLTV. This should always be a few blocks greater than channelmonitor::CLTV_CLAIM_BUFFER,
305+ /// ie the node we forwarded the payment on to should always have enough room to reliably time out
306+ /// the HTLC via a full update_fail_htlc/commitment_signed dance before we hit the
307+ /// CLTV_CLAIM_BUFFER point (we static assert that its at least 3 blocks more).
303308const CLTV_EXPIRY_DELTA : u16 = 6 * 24 * 2 ; //TODO?
309+
310+ // Check that our CLTV_EXPIRY is at least CLTV_CLAIM_BUFFER + 2*HTLC_FAIL_TIMEOUT_BLOCKS, ie that
311+ // if the next-hop peer fails the HTLC within HTLC_FAIL_TIMEOUT_BLOCKS then we'll still have
312+ // HTLC_FAIL_TIMEOUT_BLOCKS left to fail it backwards ourselves before hitting the
313+ // CLTV_CLAIM_BUFFER point and failing the channel on-chain to time out the HTLC.
314+ #[ deny( const_err) ]
315+ #[ allow( dead_code) ]
316+ const CHECK_CLTV_EXPIRY_SANITY : u32 = CLTV_EXPIRY_DELTA as u32 - 2 * HTLC_FAIL_TIMEOUT_BLOCKS - CLTV_CLAIM_BUFFER ;
317+
318+ // Check for ability of an attacker to make us fail on-chain by delaying inbound claim. See
319+ // ChannelMontior::would_broadcast_at_height for a description of why this is needed.
320+ #[ deny( const_err) ]
321+ #[ allow( dead_code) ]
322+ const CHECK_CLTV_EXPIRY_SANITY_2 : u32 = CLTV_EXPIRY_DELTA as u32 - HTLC_FAIL_TIMEOUT_BLOCKS - 2 * CLTV_CLAIM_BUFFER ;
323+
304324const CLTV_FAR_FAR_AWAY : u16 = 6 * 24 * 7 ; //TODO?
305325const FINAL_NODE_TIMEOUT : u16 = 3 ; //TODO?
306326
@@ -2542,6 +2562,7 @@ mod tests {
25422562 use chain:: transaction:: OutPoint ;
25432563 use chain:: chaininterface:: ChainListener ;
25442564 use ln:: channelmanager:: { ChannelManager , OnionKeys } ;
2565+ use ln:: channelmonitor:: { CLTV_CLAIM_BUFFER , HTLC_FAIL_TIMEOUT_BLOCKS } ;
25452566 use ln:: router:: { Route , RouteHop , Router } ;
25462567 use ln:: msgs;
25472568 use ln:: msgs:: { ChannelMessageHandler , RoutingMessageHandler } ;
@@ -2574,6 +2595,7 @@ mod tests {
25742595 use std:: default:: Default ;
25752596 use std:: rc:: Rc ;
25762597 use std:: sync:: { Arc , Mutex } ;
2598+ use std:: sync:: atomic:: Ordering ;
25772599 use std:: time:: Instant ;
25782600 use std:: mem;
25792601
@@ -4468,13 +4490,17 @@ mod tests {
44684490 assert_eq ! ( nodes[ 2 ] . node. list_channels( ) . len( ) , 0 ) ;
44694491 assert_eq ! ( nodes[ 3 ] . node. list_channels( ) . len( ) , 1 ) ;
44704492
4493+ assert_eq ! ( nodes[ 3 ] . node. latest_block_height. load( Ordering :: Acquire ) , 1 ) ;
4494+ assert_eq ! ( nodes[ 4 ] . node. latest_block_height. load( Ordering :: Acquire ) , 1 ) ;
44714495 // One pending HTLC to time out:
44724496 let payment_preimage_2 = route_payment ( & nodes[ 3 ] , & vec ! ( & nodes[ 4 ] ) [ ..] , 3000000 ) . 0 ;
4497+ // CLTV expires at TEST_FINAL_CLTV + 1 (current height) + 1 (added in send_payment for
4498+ // buffer space).
44734499
44744500 {
44754501 let mut header = BlockHeader { version : 0x20000000 , prev_blockhash : Default :: default ( ) , merkle_root : Default :: default ( ) , time : 42 , bits : 42 , nonce : 42 } ;
4476- nodes[ 3 ] . chain_monitor . block_connected_checked ( & header, 1 , & Vec :: new ( ) [ ..] , & [ 0 ; 0 ] ) ;
4477- for i in 2 ..TEST_FINAL_CLTV - 3 {
4502+ nodes[ 3 ] . chain_monitor . block_connected_checked ( & header, 2 , & Vec :: new ( ) [ ..] , & [ 0 ; 0 ] ) ;
4503+ for i in 3 ..TEST_FINAL_CLTV + 2 + HTLC_FAIL_TIMEOUT_BLOCKS + 1 {
44784504 header = BlockHeader { version : 0x20000000 , prev_blockhash : header. bitcoin_hash ( ) , merkle_root : Default :: default ( ) , time : 42 , bits : 42 , nonce : 42 } ;
44794505 nodes[ 3 ] . chain_monitor . block_connected_checked ( & header, i, & Vec :: new ( ) [ ..] , & [ 0 ; 0 ] ) ;
44804506 }
@@ -4485,8 +4511,8 @@ mod tests {
44854511 claim_funds ! ( nodes[ 4 ] , nodes[ 3 ] , payment_preimage_2) ;
44864512
44874513 header = BlockHeader { version : 0x20000000 , prev_blockhash : Default :: default ( ) , merkle_root : Default :: default ( ) , time : 42 , bits : 42 , nonce : 42 } ;
4488- nodes[ 4 ] . chain_monitor . block_connected_checked ( & header, 1 , & Vec :: new ( ) [ ..] , & [ 0 ; 0 ] ) ;
4489- for i in 2 ..TEST_FINAL_CLTV - 3 {
4514+ nodes[ 4 ] . chain_monitor . block_connected_checked ( & header, 2 , & Vec :: new ( ) [ ..] , & [ 0 ; 0 ] ) ;
4515+ for i in 3 ..TEST_FINAL_CLTV + 2 - CLTV_CLAIM_BUFFER + 1 {
44904516 header = BlockHeader { version : 0x20000000 , prev_blockhash : header. bitcoin_hash ( ) , merkle_root : Default :: default ( ) , time : 42 , bits : 42 , nonce : 42 } ;
44914517 nodes[ 4 ] . chain_monitor . block_connected_checked ( & header, i, & Vec :: new ( ) [ ..] , & [ 0 ; 0 ] ) ;
44924518 }
0 commit comments