@@ -23,7 +23,7 @@ use secp256k1;
23
23
use chain:: chaininterface:: { BroadcasterInterface , ChainListener , ChainWatchInterface , FeeEstimator } ;
24
24
use chain:: transaction:: OutPoint ;
25
25
use ln:: channel:: { Channel , ChannelError , ChannelKeys } ;
26
- use ln:: channelmonitor:: ManyChannelMonitor ;
26
+ use ln:: channelmonitor:: { ManyChannelMonitor , CLTV_CLAIM_BUFFER , HTLC_FAIL_TIMEOUT_BLOCKS } ;
27
27
use ln:: router:: { Route , RouteHop } ;
28
28
use ln:: msgs;
29
29
use ln:: msgs:: { HandleError , ChannelMessageHandler } ;
@@ -290,8 +290,27 @@ pub struct ChannelManager {
290
290
logger : Arc < Logger > ,
291
291
}
292
292
293
+ /// The minimum number of blocks between an inbound HTLC's CLTV and the corresponding outbound
294
+ /// HTLC's CLTV. This should always be a few blocks greater than channelmonitor::CLTV_CLAIM_BUFFER,
295
+ /// ie the node we forwarded the payment on to should always have enough room to reliably time out
296
+ /// the HTLC via a full update_fail_htlc/commitment_signed dance before we hit the
297
+ /// CLTV_CLAIM_BUFFER point (we static assert that its at least 3 blocks more).
293
298
const CLTV_EXPIRY_DELTA : u16 = 6 * 24 * 2 ; //TODO?
294
299
300
+ // Check that our CLTV_EXPIRY is at least CLTV_CLAIM_BUFFER + 2*HTLC_FAIL_TIMEOUT_BLOCKS, ie that
301
+ // if the next-hop peer fails the HTLC within HTLC_FAIL_TIMEOUT_BLOCKS then we'll still have
302
+ // HTLC_FAIL_TIMEOUT_BLOCKS left to fail it backwards ourselves before hitting the
303
+ // CLTV_CLAIM_BUFFER point and failing the channel on-chain to time out the HTLC.
304
+ #[ deny( const_err) ]
305
+ #[ allow( dead_code) ]
306
+ const CHECK_CLTV_EXPIRY_SANITY : u32 = CLTV_EXPIRY_DELTA as u32 - 2 * HTLC_FAIL_TIMEOUT_BLOCKS - CLTV_CLAIM_BUFFER ;
307
+
308
+ // Check for ability of an attacker to make us fail on-chain by delaying inbound claim. See
309
+ // ChannelMontior::would_broadcast_at_height for a description of why this is needed.
310
+ #[ deny( const_err) ]
311
+ #[ allow( dead_code) ]
312
+ const CHECK_CLTV_EXPIRY_SANITY_2 : u32 = CLTV_EXPIRY_DELTA as u32 - HTLC_FAIL_TIMEOUT_BLOCKS - 2 * CLTV_CLAIM_BUFFER ;
313
+
295
314
macro_rules! secp_call {
296
315
( $res: expr, $err: expr ) => {
297
316
match $res {
@@ -2352,6 +2371,7 @@ mod tests {
2352
2371
use chain:: transaction:: OutPoint ;
2353
2372
use chain:: chaininterface:: ChainListener ;
2354
2373
use ln:: channelmanager:: { ChannelManager , OnionKeys } ;
2374
+ use ln:: channelmonitor:: { CLTV_CLAIM_BUFFER , HTLC_FAIL_TIMEOUT_BLOCKS } ;
2355
2375
use ln:: router:: { Route , RouteHop , Router } ;
2356
2376
use ln:: msgs;
2357
2377
use ln:: msgs:: { ChannelMessageHandler , RoutingMessageHandler } ;
@@ -2384,6 +2404,7 @@ mod tests {
2384
2404
use std:: default:: Default ;
2385
2405
use std:: rc:: Rc ;
2386
2406
use std:: sync:: { Arc , Mutex } ;
2407
+ use std:: sync:: atomic:: Ordering ;
2387
2408
use std:: time:: Instant ;
2388
2409
use std:: mem;
2389
2410
@@ -4269,13 +4290,22 @@ mod tests {
4269
4290
assert_eq ! ( nodes[ 2 ] . node. list_channels( ) . len( ) , 0 ) ;
4270
4291
assert_eq ! ( nodes[ 3 ] . node. list_channels( ) . len( ) , 1 ) ;
4271
4292
4293
+ { // Cheat and reset nodes[4]'s height to 1
4294
+ let header = BlockHeader { version : 0x20000000 , prev_blockhash : Default :: default ( ) , merkle_root : Default :: default ( ) , time : 42 , bits : 42 , nonce : 42 } ;
4295
+ nodes[ 4 ] . chain_monitor . block_connected_with_filtering ( & Block { header, txdata : vec ! [ ] } , 1 ) ;
4296
+ }
4297
+
4298
+ assert_eq ! ( nodes[ 3 ] . node. latest_block_height. load( Ordering :: Acquire ) , 1 ) ;
4299
+ assert_eq ! ( nodes[ 4 ] . node. latest_block_height. load( Ordering :: Acquire ) , 1 ) ;
4272
4300
// One pending HTLC to time out:
4273
4301
let payment_preimage_2 = route_payment ( & nodes[ 3 ] , & vec ! ( & nodes[ 4 ] ) [ ..] , 3000000 ) . 0 ;
4302
+ // CLTV expires at TEST_FINAL_CLTV + 1 (current height) + 1 (added in send_payment for
4303
+ // buffer space).
4274
4304
4275
4305
{
4276
4306
let mut header = BlockHeader { version : 0x20000000 , prev_blockhash : Default :: default ( ) , merkle_root : Default :: default ( ) , time : 42 , bits : 42 , nonce : 42 } ;
4277
- nodes[ 3 ] . chain_monitor . block_connected_checked ( & header, 1 , & Vec :: new ( ) [ ..] , & [ 0 ; 0 ] ) ;
4278
- for i in 2 ..TEST_FINAL_CLTV - 3 {
4307
+ nodes[ 3 ] . chain_monitor . block_connected_checked ( & header, 2 , & Vec :: new ( ) [ ..] , & [ 0 ; 0 ] ) ;
4308
+ for i in 3 ..TEST_FINAL_CLTV + 2 + HTLC_FAIL_TIMEOUT_BLOCKS + 1 {
4279
4309
header = BlockHeader { version : 0x20000000 , prev_blockhash : header. bitcoin_hash ( ) , merkle_root : Default :: default ( ) , time : 42 , bits : 42 , nonce : 42 } ;
4280
4310
nodes[ 3 ] . chain_monitor . block_connected_checked ( & header, i, & Vec :: new ( ) [ ..] , & [ 0 ; 0 ] ) ;
4281
4311
}
@@ -4286,8 +4316,8 @@ mod tests {
4286
4316
claim_funds ! ( nodes[ 4 ] , nodes[ 3 ] , payment_preimage_2) ;
4287
4317
4288
4318
header = BlockHeader { version : 0x20000000 , prev_blockhash : Default :: default ( ) , merkle_root : Default :: default ( ) , time : 42 , bits : 42 , nonce : 42 } ;
4289
- nodes[ 4 ] . chain_monitor . block_connected_checked ( & header, 1 , & Vec :: new ( ) [ ..] , & [ 0 ; 0 ] ) ;
4290
- for i in 2 ..TEST_FINAL_CLTV - 3 {
4319
+ nodes[ 4 ] . chain_monitor . block_connected_checked ( & header, 2 , & Vec :: new ( ) [ ..] , & [ 0 ; 0 ] ) ;
4320
+ for i in 3 ..TEST_FINAL_CLTV + 2 - CLTV_CLAIM_BUFFER + 1 {
4291
4321
header = BlockHeader { version : 0x20000000 , prev_blockhash : header. bitcoin_hash ( ) , merkle_root : Default :: default ( ) , time : 42 , bits : 42 , nonce : 42 } ;
4292
4322
nodes[ 4 ] . chain_monitor . block_connected_checked ( & header, i, & Vec :: new ( ) [ ..] , & [ 0 ; 0 ] ) ;
4293
4323
}
0 commit comments