@@ -1344,157 +1344,6 @@ impl SendEvent {
13441344 }
13451345}
13461346
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-
14981347#[ macro_export]
14991348macro_rules! expect_pending_htlcs_forwardable_conditions {
15001349 ( $node: expr, $expected_failures: expr) => { {
@@ -1585,6 +1434,164 @@ macro_rules! expect_pending_htlcs_forwardable_from_events {
15851434 }
15861435 } }
15871436}
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+
15881595#[ macro_export]
15891596#[ cfg( any( test, feature = "_bench_unstable" , feature = "_test_utils" ) ) ]
15901597macro_rules! expect_payment_claimable {
0 commit comments