@@ -44,53 +44,81 @@ use std::sync::Mutex;
44
44
use std:: mem;
45
45
use std:: collections:: HashMap ;
46
46
47
- pub const CHAN_CONFIRM_DEPTH : u32 = 100 ;
47
+ pub const CHAN_CONFIRM_DEPTH : u32 = 10 ;
48
48
49
+ /// Mine the given transaction in the next block and then mine CHAN_CONFIRM_DEPTH - 1 blocks on
50
+ /// top, giving the given transaction CHAN_CONFIRM_DEPTH confirmations.
49
51
pub fn confirm_transaction < ' a , ' b , ' c , ' d > ( node : & ' a Node < ' b , ' c , ' d > , tx : & Transaction ) {
50
- let dummy_tx = Transaction { version : 0 , lock_time : 0 , input : Vec :: new ( ) , output : Vec :: new ( ) } ;
51
- let dummy_tx_count = tx. version as usize ;
52
+ confirm_transaction_at ( node, tx, node. best_block_info ( ) . 1 + 1 ) ;
53
+ connect_blocks ( node, CHAN_CONFIRM_DEPTH - 1 ) ;
54
+ }
55
+ /// Mine a signle block containing the given transaction
56
+ pub fn mine_transaction < ' a , ' b , ' c , ' d > ( node : & ' a Node < ' b , ' c , ' d > , tx : & Transaction ) {
57
+ let height = node. best_block_info ( ) . 1 + 1 ;
58
+ confirm_transaction_at ( node, tx, height) ;
59
+ }
60
+ /// Mine the given transaction at the given height, mining blocks as required to build to that
61
+ /// height
62
+ pub fn confirm_transaction_at < ' a , ' b , ' c , ' d > ( node : & ' a Node < ' b , ' c , ' d > , tx : & Transaction , conf_height : u32 ) {
63
+ let starting_block = node. best_block_info ( ) ;
52
64
let mut block = Block {
53
- header : BlockHeader { version : 0x20000000 , prev_blockhash : Default :: default ( ) , merkle_root : Default :: default ( ) , time : 42 , bits : 42 , nonce : 42 } ,
54
- txdata : vec ! [ dummy_tx ; dummy_tx_count ] ,
65
+ header : BlockHeader { version : 0x20000000 , prev_blockhash : starting_block . 0 , merkle_root : Default :: default ( ) , time : 42 , bits : 42 , nonce : 42 } ,
66
+ txdata : Vec :: new ( ) ,
55
67
} ;
56
- block. txdata . push ( tx. clone ( ) ) ;
57
- connect_block ( node, & block, 1 ) ;
58
- for i in 2 ..CHAN_CONFIRM_DEPTH {
68
+ let height = starting_block. 1 + 1 ;
69
+ assert ! ( height <= conf_height) ;
70
+ for _ in height..conf_height {
71
+ connect_block ( node, & block) ;
59
72
block = Block {
60
73
header : BlockHeader { version : 0x20000000 , prev_blockhash : block. header . block_hash ( ) , merkle_root : Default :: default ( ) , time : 42 , bits : 42 , nonce : 42 } ,
61
74
txdata : vec ! [ ] ,
62
75
} ;
63
- connect_block ( node, & block, i) ;
64
76
}
77
+
78
+ for _ in 0 ..* node. network_chan_count . borrow ( ) { // Make sure we don't end up with channels at the same short id by offsetting by chan_count
79
+ block. txdata . push ( Transaction { version : 0 , lock_time : 0 , input : Vec :: new ( ) , output : Vec :: new ( ) } ) ;
80
+ }
81
+ block. txdata . push ( tx. clone ( ) ) ;
82
+ connect_block ( node, & block) ;
65
83
}
66
84
67
- pub fn connect_blocks < ' a , ' b , ' c , ' d > ( node : & ' a Node < ' b , ' c , ' d > , depth : u32 , height : u32 , parent : bool , prev_blockhash : BlockHash ) -> BlockHash {
85
+ pub fn connect_blocks < ' a , ' b , ' c , ' d > ( node : & ' a Node < ' b , ' c , ' d > , depth : u32 ) -> BlockHash {
68
86
let mut block = Block {
69
- header : BlockHeader { version : 0x2000000 , prev_blockhash : if parent { prev_blockhash } else { Default :: default ( ) } , merkle_root : Default :: default ( ) , time : 42 , bits : 42 , nonce : 42 } ,
87
+ header : BlockHeader { version : 0x2000000 , prev_blockhash : node . best_block_hash ( ) , merkle_root : Default :: default ( ) , time : 42 , bits : 42 , nonce : 42 } ,
70
88
txdata : vec ! [ ] ,
71
89
} ;
72
- connect_block ( node, & block, height + 1 ) ;
73
- for i in 2 ..depth + 1 {
90
+ connect_block ( node, & block) ;
91
+ for _ in 2 ..depth + 1 {
74
92
block = Block {
75
93
header : BlockHeader { version : 0x20000000 , prev_blockhash : block. header . block_hash ( ) , merkle_root : Default :: default ( ) , time : 42 , bits : 42 , nonce : 42 } ,
76
94
txdata : vec ! [ ] ,
77
95
} ;
78
- connect_block ( node, & block, height + i ) ;
96
+ connect_block ( node, & block) ;
79
97
}
80
98
block. header . block_hash ( )
81
99
}
82
100
83
- pub fn connect_block < ' a , ' b , ' c , ' d > ( node : & ' a Node < ' b , ' c , ' d > , block : & Block , height : u32 ) {
101
+ pub fn connect_block < ' a , ' b , ' c , ' d > ( node : & ' a Node < ' b , ' c , ' d > , block : & Block ) {
84
102
let txdata: Vec < _ > = block. txdata . iter ( ) . enumerate ( ) . collect ( ) ;
103
+ let height = node. best_block_info ( ) . 1 + 1 ;
85
104
node. chain_monitor . chain_monitor . block_connected ( & block. header , & txdata, height) ;
86
105
node. node . block_connected ( & block. header , & txdata, height) ;
87
106
node. node . test_process_background_events ( ) ;
107
+ node. blocks . borrow_mut ( ) . push ( ( block. header , height) ) ;
88
108
}
89
109
90
- pub fn disconnect_block < ' a , ' b , ' c , ' d > ( node : & ' a Node < ' b , ' c , ' d > , header : & BlockHeader , height : u32 ) {
91
- node. chain_monitor . chain_monitor . block_disconnected ( header, height) ;
92
- node. node . block_disconnected ( header) ;
93
- node. node . test_process_background_events ( ) ;
110
+ pub fn disconnect_blocks < ' a , ' b , ' c , ' d > ( node : & ' a Node < ' b , ' c , ' d > , count : u32 ) {
111
+ for _ in 0 ..count {
112
+ let orig_header = node. blocks . borrow_mut ( ) . pop ( ) . unwrap ( ) ;
113
+ assert ! ( orig_header. 1 > 0 ) ; // Cannot disconnect genesis
114
+ node. chain_monitor . chain_monitor . block_disconnected ( & orig_header. 0 , orig_header. 1 ) ;
115
+ node. node . block_disconnected ( & orig_header. 0 ) ;
116
+ }
117
+ }
118
+
119
+ pub fn disconnect_all_blocks < ' a , ' b , ' c , ' d > ( node : & ' a Node < ' b , ' c , ' d > ) {
120
+ let count = node. blocks . borrow_mut ( ) . len ( ) as u32 - 1 ;
121
+ disconnect_blocks ( node, count) ;
94
122
}
95
123
96
124
pub struct TestChanMonCfg {
@@ -123,6 +151,15 @@ pub struct Node<'a, 'b: 'a, 'c: 'b> {
123
151
pub network_payment_count : Rc < RefCell < u8 > > ,
124
152
pub network_chan_count : Rc < RefCell < u32 > > ,
125
153
pub logger : & ' c test_utils:: TestLogger ,
154
+ pub blocks : RefCell < Vec < ( BlockHeader , u32 ) > > ,
155
+ }
156
+ impl < ' a , ' b , ' c > Node < ' a , ' b , ' c > {
157
+ pub fn best_block_hash ( & self ) -> BlockHash {
158
+ self . blocks . borrow_mut ( ) . last ( ) . unwrap ( ) . 0 . block_hash ( )
159
+ }
160
+ pub fn best_block_info ( & self ) -> ( BlockHash , u32 ) {
161
+ self . blocks . borrow_mut ( ) . last ( ) . map ( |( a, b) | ( a. block_hash ( ) , * b) ) . unwrap ( )
162
+ }
126
163
}
127
164
128
165
impl < ' a , ' b , ' c > Drop for Node < ' a , ' b , ' c > {
@@ -416,8 +453,9 @@ pub fn create_chan_between_nodes_with_value_init<'a, 'b, 'c>(node_a: &Node<'a, '
416
453
tx
417
454
}
418
455
419
- pub fn create_chan_between_nodes_with_value_confirm_first < ' a , ' b , ' c , ' d > ( node_recv : & ' a Node < ' b , ' c , ' c > , node_conf : & ' a Node < ' b , ' c , ' d > , tx : & Transaction ) {
420
- confirm_transaction ( node_conf, tx) ;
456
+ pub fn create_chan_between_nodes_with_value_confirm_first < ' a , ' b , ' c , ' d > ( node_recv : & ' a Node < ' b , ' c , ' c > , node_conf : & ' a Node < ' b , ' c , ' d > , tx : & Transaction , conf_height : u32 ) {
457
+ confirm_transaction_at ( node_conf, tx, conf_height) ;
458
+ connect_blocks ( node_conf, CHAN_CONFIRM_DEPTH - 1 ) ;
421
459
node_recv. node . handle_funding_locked ( & node_conf. node . get_our_node_id ( ) , & get_event_msg ! ( node_conf, MessageSendEvent :: SendFundingLocked , node_recv. node. get_our_node_id( ) ) ) ;
422
460
}
423
461
@@ -442,8 +480,10 @@ pub fn create_chan_between_nodes_with_value_confirm_second<'a, 'b, 'c>(node_recv
442
480
}
443
481
444
482
pub fn create_chan_between_nodes_with_value_confirm < ' a , ' b , ' c , ' d > ( node_a : & ' a Node < ' b , ' c , ' d > , node_b : & ' a Node < ' b , ' c , ' d > , tx : & Transaction ) -> ( ( msgs:: FundingLocked , msgs:: AnnouncementSignatures ) , [ u8 ; 32 ] ) {
445
- create_chan_between_nodes_with_value_confirm_first ( node_a, node_b, tx) ;
446
- confirm_transaction ( node_a, tx) ;
483
+ let conf_height = std:: cmp:: max ( node_a. best_block_info ( ) . 1 + 1 , node_b. best_block_info ( ) . 1 + 1 ) ;
484
+ create_chan_between_nodes_with_value_confirm_first ( node_a, node_b, tx, conf_height) ;
485
+ confirm_transaction_at ( node_a, tx, conf_height) ;
486
+ connect_blocks ( node_a, CHAN_CONFIRM_DEPTH - 1 ) ;
447
487
create_chan_between_nodes_with_value_confirm_second ( node_b, node_a)
448
488
}
449
489
@@ -843,13 +883,13 @@ macro_rules! expect_payment_failed {
843
883
assert_eq!( events. len( ) , 1 ) ;
844
884
match events[ 0 ] {
845
885
Event :: PaymentFailed { ref payment_hash, rejected_by_dest, ref error_code, ref error_data } => {
846
- assert_eq!( * payment_hash, $expected_payment_hash) ;
847
- assert_eq!( rejected_by_dest, $rejected_by_dest) ;
848
- assert!( error_code. is_some( ) ) ;
849
- assert!( error_data. is_some( ) ) ;
886
+ assert_eq!( * payment_hash, $expected_payment_hash, "unexpected payment_hash" ) ;
887
+ assert_eq!( rejected_by_dest, $rejected_by_dest, "unexpected rejected_by_dest value" ) ;
888
+ assert!( error_code. is_some( ) , "expected error_code.is_some() = true" ) ;
889
+ assert!( error_data. is_some( ) , "expected error_data.is_some() = true" ) ;
850
890
$(
851
- assert_eq!( error_code. unwrap( ) , $expected_error_code) ;
852
- assert_eq!( & error_data. as_ref( ) . unwrap( ) [ ..] , $expected_error_data) ;
891
+ assert_eq!( error_code. unwrap( ) , $expected_error_code, "unexpected error code" ) ;
892
+ assert_eq!( & error_data. as_ref( ) . unwrap( ) [ ..] , $expected_error_data, "unexpected error data" ) ;
853
893
) *
854
894
} ,
855
895
_ => panic!( "Unexpected event" ) ,
@@ -1020,7 +1060,7 @@ pub fn claim_payment<'a, 'b, 'c>(origin_node: &Node<'a, 'b, 'c>, expected_route:
1020
1060
claim_payment_along_route ( origin_node, expected_route, false , our_payment_preimage, expected_amount) ;
1021
1061
}
1022
1062
1023
- pub const TEST_FINAL_CLTV : u32 = 32 ;
1063
+ pub const TEST_FINAL_CLTV : u32 = 50 ;
1024
1064
1025
1065
pub fn route_payment < ' a , ' b , ' c > ( origin_node : & Node < ' a , ' b , ' c > , expected_route : & [ & Node < ' a , ' b , ' c > ] , recv_value : u64 ) -> ( PaymentPreimage , PaymentHash ) {
1026
1066
let net_graph_msg_handler = & origin_node. net_graph_msg_handler ;
@@ -1161,6 +1201,9 @@ pub fn create_node_chanmgrs<'a, 'b>(node_count: usize, cfgs: &'a Vec<NodeCfg<'b>
1161
1201
let mut chanmgrs = Vec :: new ( ) ;
1162
1202
for i in 0 ..node_count {
1163
1203
let mut default_config = UserConfig :: default ( ) ;
1204
+ // Set cltv_expiry_delta slightly lower to keep the final CLTV values inside one byte in our
1205
+ // tests so that our script-length checks don't fail (see ACCEPTED_HTLC_SCRIPT_WEIGHT).
1206
+ default_config. channel_options . cltv_expiry_delta = 6 * 6 ;
1164
1207
default_config. channel_options . announced_channel = true ;
1165
1208
default_config. peer_channel_config_limits . force_announced_channel_preference = false ;
1166
1209
default_config. own_channel_config . our_htlc_minimum_msat = 1000 ; // sanitization being done by the sender, to exerce receiver logic we need to lift of limit
@@ -1189,13 +1232,15 @@ pub fn create_network<'a, 'b: 'a, 'c: 'b>(node_count: usize, cfgs: &'b Vec<NodeC
1189
1232
keys_manager : & cfgs[ i] . keys_manager , node : & chan_mgrs[ i] , net_graph_msg_handler,
1190
1233
node_seed : cfgs[ i] . node_seed , network_chan_count : chan_count. clone ( ) ,
1191
1234
network_payment_count : payment_count. clone ( ) , logger : cfgs[ i] . logger ,
1235
+ blocks : RefCell :: new ( vec ! [ ( genesis_block( Network :: Testnet ) . header, 0 ) ] )
1192
1236
} )
1193
1237
}
1194
1238
1195
1239
nodes
1196
1240
}
1197
1241
1198
- pub const ACCEPTED_HTLC_SCRIPT_WEIGHT : usize = 138 ; //Here we have a diff due to HTLC CLTV expiry being < 2^15 in test
1242
+ // Note that the following only works for CLTV values up to 128
1243
+ pub const ACCEPTED_HTLC_SCRIPT_WEIGHT : usize = 137 ; //Here we have a diff due to HTLC CLTV expiry being < 2^15 in test
1199
1244
pub const OFFERED_HTLC_SCRIPT_WEIGHT : usize = 133 ;
1200
1245
1201
1246
#[ derive( PartialEq ) ]
0 commit comments