@@ -1344,157 +1344,6 @@ impl SendEvent {
1344
1344
}
1345
1345
}
1346
1346
1347
- #[ macro_export]
1348
- /// Performs the "commitment signed dance" - the series of message exchanges which occur after a
1349
- /// commitment update.
1350
- macro_rules! commitment_signed_dance {
1351
- ( $node_a: expr, $node_b: expr, $commitment_signed: expr, $fail_backwards: expr, true /* skip last step */ ) => {
1352
- {
1353
- check_added_monitors!( $node_a, 0 ) ;
1354
- assert!( $node_a. node. get_and_clear_pending_msg_events( ) . is_empty( ) ) ;
1355
- $node_a. node. handle_commitment_signed( & $node_b. node. get_our_node_id( ) , & $commitment_signed) ;
1356
- check_added_monitors!( $node_a, 1 ) ;
1357
- commitment_signed_dance!( $node_a, $node_b, ( ) , $fail_backwards, true , false ) ;
1358
- }
1359
- } ;
1360
- ( $node_a: expr, $node_b: expr, ( ) , $fail_backwards: expr, true /* skip last step */ , true /* return extra message */ , true /* return last RAA */ ) => {
1361
- {
1362
- let ( as_revoke_and_ack, as_commitment_signed) = get_revoke_commit_msgs!( $node_a, $node_b. node. get_our_node_id( ) ) ;
1363
- check_added_monitors!( $node_b, 0 ) ;
1364
- assert!( $node_b. node. get_and_clear_pending_msg_events( ) . is_empty( ) ) ;
1365
- $node_b. node. handle_revoke_and_ack( & $node_a. node. get_our_node_id( ) , & as_revoke_and_ack) ;
1366
- assert!( $node_b. node. get_and_clear_pending_msg_events( ) . is_empty( ) ) ;
1367
- check_added_monitors!( $node_b, 1 ) ;
1368
- $node_b. node. handle_commitment_signed( & $node_a. node. get_our_node_id( ) , & as_commitment_signed) ;
1369
- let ( bs_revoke_and_ack, extra_msg_option) = {
1370
- let events = $node_b. node. get_and_clear_pending_msg_events( ) ;
1371
- assert!( events. len( ) <= 2 ) ;
1372
- let ( node_a_event, events) = remove_first_msg_event_to_node( & $node_a. node. get_our_node_id( ) , & events) ;
1373
- ( match node_a_event {
1374
- MessageSendEvent :: SendRevokeAndACK { ref node_id, ref msg } => {
1375
- assert_eq!( * node_id, $node_a. node. get_our_node_id( ) ) ;
1376
- ( * msg) . clone( )
1377
- } ,
1378
- _ => panic!( "Unexpected event" ) ,
1379
- } , events. get( 0 ) . map( |e| e. clone( ) ) )
1380
- } ;
1381
- check_added_monitors!( $node_b, 1 ) ;
1382
- if $fail_backwards {
1383
- assert!( $node_a. node. get_and_clear_pending_events( ) . is_empty( ) ) ;
1384
- assert!( $node_a. node. get_and_clear_pending_msg_events( ) . is_empty( ) ) ;
1385
- }
1386
- ( extra_msg_option, bs_revoke_and_ack)
1387
- }
1388
- } ;
1389
- ( $node_a: expr, $node_b: expr, $commitment_signed: expr, $fail_backwards: expr, true /* skip last step */ , false /* return extra message */ , true /* return last RAA */ ) => {
1390
- {
1391
- check_added_monitors!( $node_a, 0 ) ;
1392
- assert!( $node_a. node. get_and_clear_pending_msg_events( ) . is_empty( ) ) ;
1393
- $node_a. node. handle_commitment_signed( & $node_b. node. get_our_node_id( ) , & $commitment_signed) ;
1394
- check_added_monitors!( $node_a, 1 ) ;
1395
- let ( extra_msg_option, bs_revoke_and_ack) = commitment_signed_dance!( $node_a, $node_b, ( ) , $fail_backwards, true , true , true ) ;
1396
- assert!( extra_msg_option. is_none( ) ) ;
1397
- bs_revoke_and_ack
1398
- }
1399
- } ;
1400
- ( $node_a: expr, $node_b: expr, ( ) , $fail_backwards: expr, true /* skip last step */ , true /* return extra message */ ) => {
1401
- {
1402
- let ( extra_msg_option, bs_revoke_and_ack) = commitment_signed_dance!( $node_a, $node_b, ( ) , $fail_backwards, true , true , true ) ;
1403
- $node_a. node. handle_revoke_and_ack( & $node_b. node. get_our_node_id( ) , & bs_revoke_and_ack) ;
1404
- check_added_monitors!( $node_a, 1 ) ;
1405
- extra_msg_option
1406
- }
1407
- } ;
1408
- ( $node_a: expr, $node_b: expr, ( ) , $fail_backwards: expr, true /* skip last step */ , false /* no extra message */ ) => {
1409
- {
1410
- assert!( commitment_signed_dance!( $node_a, $node_b, ( ) , $fail_backwards, true , true ) . is_none( ) ) ;
1411
- }
1412
- } ;
1413
- ( $node_a: expr, $node_b: expr, $commitment_signed: expr, $fail_backwards: expr) => {
1414
- {
1415
- commitment_signed_dance!( $node_a, $node_b, $commitment_signed, $fail_backwards, true ) ;
1416
- if $fail_backwards {
1417
- expect_pending_htlcs_forwardable_and_htlc_handling_failed!( $node_a, vec![ $crate:: util:: events:: HTLCDestination :: NextHopChannel { node_id: Some ( $node_b. node. get_our_node_id( ) ) , channel_id: $commitment_signed. channel_id } ] ) ;
1418
- check_added_monitors!( $node_a, 1 ) ;
1419
-
1420
- let node_a_per_peer_state = $node_a. node. per_peer_state. read( ) . unwrap( ) ;
1421
- let mut number_of_msg_events = 0 ;
1422
- for ( cp_id, peer_state_mutex) in node_a_per_peer_state. iter( ) {
1423
- let peer_state = peer_state_mutex. lock( ) . unwrap( ) ;
1424
- let cp_pending_msg_events = & peer_state. pending_msg_events;
1425
- number_of_msg_events += cp_pending_msg_events. len( ) ;
1426
- if cp_pending_msg_events. len( ) == 1 {
1427
- if let MessageSendEvent :: UpdateHTLCs { .. } = cp_pending_msg_events[ 0 ] {
1428
- assert_ne!( * cp_id, $node_b. node. get_our_node_id( ) ) ;
1429
- } else { panic!( "Unexpected event" ) ; }
1430
- }
1431
- }
1432
- // Expecting the failure backwards event to the previous hop (not `node_b`)
1433
- assert_eq!( number_of_msg_events, 1 ) ;
1434
- } else {
1435
- assert!( $node_a. node. get_and_clear_pending_msg_events( ) . is_empty( ) ) ;
1436
- }
1437
- }
1438
- }
1439
- }
1440
-
1441
- /// Get a payment preimage and hash.
1442
- #[ macro_export]
1443
- macro_rules! get_payment_preimage_hash {
1444
- ( $dest_node: expr) => {
1445
- {
1446
- get_payment_preimage_hash!( $dest_node, None )
1447
- }
1448
- } ;
1449
- ( $dest_node: expr, $min_value_msat: expr) => {
1450
- {
1451
- crate :: get_payment_preimage_hash!( $dest_node, $min_value_msat, None )
1452
- }
1453
- } ;
1454
- ( $dest_node: expr, $min_value_msat: expr, $min_final_cltv_expiry_delta: expr) => {
1455
- {
1456
- use bitcoin:: hashes:: Hash as _;
1457
- let mut payment_count = $dest_node. network_payment_count. borrow_mut( ) ;
1458
- let payment_preimage = $crate:: ln:: PaymentPreimage ( [ * payment_count; 32 ] ) ;
1459
- * payment_count += 1 ;
1460
- let payment_hash = $crate:: ln:: PaymentHash (
1461
- bitcoin:: hashes:: sha256:: Hash :: hash( & payment_preimage. 0 [ ..] ) . into_inner( ) ) ;
1462
- let payment_secret = $dest_node. node. create_inbound_payment_for_hash( payment_hash, $min_value_msat, 7200 , $min_final_cltv_expiry_delta) . unwrap( ) ;
1463
- ( payment_preimage, payment_hash, payment_secret)
1464
- }
1465
- } ;
1466
- }
1467
-
1468
- #[ macro_export]
1469
- macro_rules! get_route {
1470
- ( $send_node: expr, $payment_params: expr, $recv_value: expr, $cltv: expr) => { {
1471
- use $crate:: chain:: keysinterface:: EntropySource ;
1472
- let scorer = $crate:: util:: test_utils:: TestScorer :: with_penalty( 0 ) ;
1473
- let keys_manager = $crate:: util:: test_utils:: TestKeysInterface :: new( & [ 0u8 ; 32 ] , bitcoin:: network:: constants:: Network :: Testnet ) ;
1474
- let random_seed_bytes = keys_manager. get_secure_random_bytes( ) ;
1475
- $crate:: routing:: router:: get_route(
1476
- & $send_node. node. get_our_node_id( ) , & $payment_params, & $send_node. network_graph. read_only( ) ,
1477
- Some ( & $send_node. node. list_usable_channels( ) . iter( ) . collect:: <Vec <_>>( ) ) ,
1478
- $recv_value, $cltv, $send_node. logger, & scorer, & random_seed_bytes
1479
- )
1480
- } }
1481
- }
1482
-
1483
- #[ cfg( test) ]
1484
- #[ macro_export]
1485
- macro_rules! get_route_and_payment_hash {
1486
- ( $send_node: expr, $recv_node: expr, $recv_value: expr) => { {
1487
- let payment_params = $crate:: routing:: router:: PaymentParameters :: from_node_id( $recv_node. node. get_our_node_id( ) , TEST_FINAL_CLTV )
1488
- . with_features( $recv_node. node. invoice_features( ) ) ;
1489
- $crate:: get_route_and_payment_hash!( $send_node, $recv_node, payment_params, $recv_value, TEST_FINAL_CLTV )
1490
- } } ;
1491
- ( $send_node: expr, $recv_node: expr, $payment_params: expr, $recv_value: expr, $cltv: expr) => { {
1492
- let ( payment_preimage, payment_hash, payment_secret) = $crate:: get_payment_preimage_hash!( $recv_node, Some ( $recv_value) ) ;
1493
- let route = $crate:: get_route!( $send_node, $payment_params, $recv_value, $cltv) ;
1494
- ( route. unwrap( ) , payment_hash, payment_preimage, payment_secret)
1495
- } }
1496
- }
1497
-
1498
1347
#[ macro_export]
1499
1348
macro_rules! expect_pending_htlcs_forwardable_conditions {
1500
1349
( $node: expr, $expected_failures: expr) => { {
@@ -1585,6 +1434,164 @@ macro_rules! expect_pending_htlcs_forwardable_from_events {
1585
1434
}
1586
1435
} }
1587
1436
}
1437
+
1438
+ #[ macro_export]
1439
+ /// Performs the "commitment signed dance" - the series of message exchanges which occur after a
1440
+ /// commitment update.
1441
+ macro_rules! commitment_signed_dance {
1442
+ ( $node_a: expr, $node_b: expr, $commitment_signed: expr, $fail_backwards: expr, true /* skip last step */ ) => {
1443
+ $crate:: ln:: functional_test_utils:: do_commitment_signed_dance( & $node_a, & $node_b, & $commitment_signed, $fail_backwards, true ) ;
1444
+ } ;
1445
+ ( $node_a: expr, $node_b: expr, ( ) , $fail_backwards: expr, true /* skip last step */ , true /* return extra message */ , true /* return last RAA */ ) => {
1446
+ $crate:: ln:: functional_test_utils:: do_main_commitment_signed_dance( & $node_a, & $node_b, $fail_backwards)
1447
+ } ;
1448
+ ( $node_a: expr, $node_b: expr, $commitment_signed: expr, $fail_backwards: expr, true /* skip last step */ , false /* return extra message */ , true /* return last RAA */ ) => {
1449
+ {
1450
+ check_added_monitors!( $node_a, 0 ) ;
1451
+ assert!( $node_a. node. get_and_clear_pending_msg_events( ) . is_empty( ) ) ;
1452
+ $node_a. node. handle_commitment_signed( & $node_b. node. get_our_node_id( ) , & $commitment_signed) ;
1453
+ check_added_monitors!( $node_a, 1 ) ;
1454
+ let ( extra_msg_option, bs_revoke_and_ack) = $crate:: ln:: functional_test_utils:: do_main_commitment_signed_dance( & $node_a, & $node_b, $fail_backwards) ;
1455
+ assert!( extra_msg_option. is_none( ) ) ;
1456
+ bs_revoke_and_ack
1457
+ }
1458
+ } ;
1459
+ ( $node_a: expr, $node_b: expr, ( ) , $fail_backwards: expr, true /* skip last step */ , true /* return extra message */ ) => {
1460
+ {
1461
+ let ( extra_msg_option, bs_revoke_and_ack) = $crate:: ln:: functional_test_utils:: do_main_commitment_signed_dance( & $node_a, & $node_b, $fail_backwards) ;
1462
+ $node_a. node. handle_revoke_and_ack( & $node_b. node. get_our_node_id( ) , & bs_revoke_and_ack) ;
1463
+ check_added_monitors!( $node_a, 1 ) ;
1464
+ extra_msg_option
1465
+ }
1466
+ } ;
1467
+ ( $node_a: expr, $node_b: expr, ( ) , $fail_backwards: expr, true /* skip last step */ , false /* no extra message */ ) => {
1468
+ assert!( commitment_signed_dance!( $node_a, $node_b, ( ) , $fail_backwards, true , true ) . is_none( ) ) ;
1469
+ } ;
1470
+ ( $node_a: expr, $node_b: expr, $commitment_signed: expr, $fail_backwards: expr) => {
1471
+ $crate:: ln:: functional_test_utils:: do_commitment_signed_dance( & $node_a, & $node_b, & $commitment_signed, $fail_backwards, false ) ;
1472
+ }
1473
+ }
1474
+
1475
+
1476
+ pub fn do_main_commitment_signed_dance ( node_a : & Node < ' _ , ' _ , ' _ > , node_b : & Node < ' _ , ' _ , ' _ > , fail_backwards : bool ) -> ( Option < MessageSendEvent > , msgs:: RevokeAndACK ) {
1477
+ let ( as_revoke_and_ack, as_commitment_signed) = get_revoke_commit_msgs ! ( node_a, node_b. node. get_our_node_id( ) ) ;
1478
+ check_added_monitors ! ( node_b, 0 ) ;
1479
+ assert ! ( node_b. node. get_and_clear_pending_msg_events( ) . is_empty( ) ) ;
1480
+ node_b. node . handle_revoke_and_ack ( & node_a. node . get_our_node_id ( ) , & as_revoke_and_ack) ;
1481
+ assert ! ( node_b. node. get_and_clear_pending_msg_events( ) . is_empty( ) ) ;
1482
+ check_added_monitors ! ( node_b, 1 ) ;
1483
+ node_b. node . handle_commitment_signed ( & node_a. node . get_our_node_id ( ) , & as_commitment_signed) ;
1484
+ let ( bs_revoke_and_ack, extra_msg_option) = {
1485
+ let events = node_b. node . get_and_clear_pending_msg_events ( ) ;
1486
+ assert ! ( events. len( ) <= 2 ) ;
1487
+ let ( node_a_event, events) = remove_first_msg_event_to_node ( & node_a. node . get_our_node_id ( ) , & events) ;
1488
+ ( match node_a_event {
1489
+ MessageSendEvent :: SendRevokeAndACK { ref node_id, ref msg } => {
1490
+ assert_eq ! ( * node_id, node_a. node. get_our_node_id( ) ) ;
1491
+ ( * msg) . clone ( )
1492
+ } ,
1493
+ _ => panic ! ( "Unexpected event" ) ,
1494
+ } , events. get ( 0 ) . map ( |e| e. clone ( ) ) )
1495
+ } ;
1496
+ check_added_monitors ! ( node_b, 1 ) ;
1497
+ if fail_backwards {
1498
+ assert ! ( node_a. node. get_and_clear_pending_events( ) . is_empty( ) ) ;
1499
+ assert ! ( node_a. node. get_and_clear_pending_msg_events( ) . is_empty( ) ) ;
1500
+ }
1501
+ ( extra_msg_option, bs_revoke_and_ack)
1502
+ }
1503
+
1504
+ pub fn do_commitment_signed_dance ( node_a : & Node < ' _ , ' _ , ' _ > , node_b : & Node < ' _ , ' _ , ' _ > , commitment_signed : & msgs:: CommitmentSigned , fail_backwards : bool , skip_last_step : bool ) {
1505
+ check_added_monitors ! ( node_a, 0 ) ;
1506
+ assert ! ( node_a. node. get_and_clear_pending_msg_events( ) . is_empty( ) ) ;
1507
+ node_a. node . handle_commitment_signed ( & node_b. node . get_our_node_id ( ) , commitment_signed) ;
1508
+ check_added_monitors ! ( node_a, 1 ) ;
1509
+
1510
+ commitment_signed_dance ! ( node_a, node_b, ( ) , fail_backwards, true , false ) ;
1511
+
1512
+ if skip_last_step { return ; }
1513
+
1514
+ if fail_backwards {
1515
+ expect_pending_htlcs_forwardable_and_htlc_handling_failed ! ( node_a,
1516
+ vec![ crate :: util:: events:: HTLCDestination :: NextHopChannel { node_id: Some ( node_b. node. get_our_node_id( ) ) , channel_id: commitment_signed. channel_id } ] ) ;
1517
+ check_added_monitors ! ( node_a, 1 ) ;
1518
+
1519
+ let node_a_per_peer_state = node_a. node . per_peer_state . read ( ) . unwrap ( ) ;
1520
+ let mut number_of_msg_events = 0 ;
1521
+ for ( cp_id, peer_state_mutex) in node_a_per_peer_state. iter ( ) {
1522
+ let peer_state = peer_state_mutex. lock ( ) . unwrap ( ) ;
1523
+ let cp_pending_msg_events = & peer_state. pending_msg_events ;
1524
+ number_of_msg_events += cp_pending_msg_events. len ( ) ;
1525
+ if cp_pending_msg_events. len ( ) == 1 {
1526
+ if let MessageSendEvent :: UpdateHTLCs { .. } = cp_pending_msg_events[ 0 ] {
1527
+ assert_ne ! ( * cp_id, node_b. node. get_our_node_id( ) ) ;
1528
+ } else { panic ! ( "Unexpected event" ) ; }
1529
+ }
1530
+ }
1531
+ // Expecting the failure backwards event to the previous hop (not `node_b`)
1532
+ assert_eq ! ( number_of_msg_events, 1 ) ;
1533
+ } else {
1534
+ assert ! ( node_a. node. get_and_clear_pending_msg_events( ) . is_empty( ) ) ;
1535
+ }
1536
+ }
1537
+
1538
+ /// Get a payment preimage and hash.
1539
+ #[ macro_export]
1540
+ macro_rules! get_payment_preimage_hash {
1541
+ ( $dest_node: expr) => {
1542
+ {
1543
+ get_payment_preimage_hash!( $dest_node, None )
1544
+ }
1545
+ } ;
1546
+ ( $dest_node: expr, $min_value_msat: expr) => {
1547
+ {
1548
+ crate :: get_payment_preimage_hash!( $dest_node, $min_value_msat, None )
1549
+ }
1550
+ } ;
1551
+ ( $dest_node: expr, $min_value_msat: expr, $min_final_cltv_expiry_delta: expr) => {
1552
+ {
1553
+ use bitcoin:: hashes:: Hash as _;
1554
+ let mut payment_count = $dest_node. network_payment_count. borrow_mut( ) ;
1555
+ let payment_preimage = $crate:: ln:: PaymentPreimage ( [ * payment_count; 32 ] ) ;
1556
+ * payment_count += 1 ;
1557
+ let payment_hash = $crate:: ln:: PaymentHash (
1558
+ bitcoin:: hashes:: sha256:: Hash :: hash( & payment_preimage. 0 [ ..] ) . into_inner( ) ) ;
1559
+ let payment_secret = $dest_node. node. create_inbound_payment_for_hash( payment_hash, $min_value_msat, 7200 , $min_final_cltv_expiry_delta) . unwrap( ) ;
1560
+ ( payment_preimage, payment_hash, payment_secret)
1561
+ }
1562
+ } ;
1563
+ }
1564
+
1565
+ #[ macro_export]
1566
+ macro_rules! get_route {
1567
+ ( $send_node: expr, $payment_params: expr, $recv_value: expr, $cltv: expr) => { {
1568
+ use $crate:: chain:: keysinterface:: EntropySource ;
1569
+ let scorer = $crate:: util:: test_utils:: TestScorer :: with_penalty( 0 ) ;
1570
+ let keys_manager = $crate:: util:: test_utils:: TestKeysInterface :: new( & [ 0u8 ; 32 ] , bitcoin:: network:: constants:: Network :: Testnet ) ;
1571
+ let random_seed_bytes = keys_manager. get_secure_random_bytes( ) ;
1572
+ $crate:: routing:: router:: get_route(
1573
+ & $send_node. node. get_our_node_id( ) , & $payment_params, & $send_node. network_graph. read_only( ) ,
1574
+ Some ( & $send_node. node. list_usable_channels( ) . iter( ) . collect:: <Vec <_>>( ) ) ,
1575
+ $recv_value, $cltv, $send_node. logger, & scorer, & random_seed_bytes
1576
+ )
1577
+ } }
1578
+ }
1579
+
1580
+ #[ cfg( test) ]
1581
+ #[ macro_export]
1582
+ macro_rules! get_route_and_payment_hash {
1583
+ ( $send_node: expr, $recv_node: expr, $recv_value: expr) => { {
1584
+ let payment_params = $crate:: routing:: router:: PaymentParameters :: from_node_id( $recv_node. node. get_our_node_id( ) , TEST_FINAL_CLTV )
1585
+ . with_features( $recv_node. node. invoice_features( ) ) ;
1586
+ $crate:: get_route_and_payment_hash!( $send_node, $recv_node, payment_params, $recv_value, TEST_FINAL_CLTV )
1587
+ } } ;
1588
+ ( $send_node: expr, $recv_node: expr, $payment_params: expr, $recv_value: expr, $cltv: expr) => { {
1589
+ let ( payment_preimage, payment_hash, payment_secret) = $crate:: get_payment_preimage_hash!( $recv_node, Some ( $recv_value) ) ;
1590
+ let route = $crate:: get_route!( $send_node, $payment_params, $recv_value, $cltv) ;
1591
+ ( route. unwrap( ) , payment_hash, payment_preimage, payment_secret)
1592
+ } }
1593
+ }
1594
+
1588
1595
#[ macro_export]
1589
1596
#[ cfg( any( test, feature = "_bench_unstable" , feature = "_test_utils" ) ) ]
1590
1597
macro_rules! expect_payment_claimable {
0 commit comments