Skip to content

Commit e985334

Browse files
Fix block connection ordering in a number of functional tests
Many functional tests rely on being able to call block_connected arbitrarily, jumping back in time to confirm a transaction at a specific height. Instead, this takes us one step towards having a well-formed blockchain in the functional tests. We also take this opportunity to reduce the number of blocks connected during tests, requiring a number of constant tweaks in various functional tests. Co-authored-by: Valentine Wallace <[email protected]> Co-authored-by: Matt Corallo <[email protected]>
1 parent b2c5e3a commit e985334

File tree

4 files changed

+156
-117
lines changed

4 files changed

+156
-117
lines changed

lightning-persister/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -248,7 +248,7 @@ mod tests {
248248
assert_eq!(node_txn.len(), 1);
249249

250250
let header = BlockHeader { version: 0x20000000, prev_blockhash: nodes[0].best_block_hash(), merkle_root: Default::default(), time: 42, bits: 42, nonce: 42 };
251-
connect_block(&nodes[1], &Block { header, txdata: vec![node_txn[0].clone(), node_txn[0].clone()]}, CHAN_CONFIRM_DEPTH);
251+
connect_block(&nodes[1], &Block { header, txdata: vec![node_txn[0].clone(), node_txn[0].clone()]}, CHAN_CONFIRM_DEPTH + 1);
252252
check_closed_broadcast!(nodes[1], false);
253253
check_added_monitors!(nodes[1], 1);
254254

lightning/src/ln/functional_test_utils.rs

Lines changed: 62 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -44,29 +44,47 @@ use std::sync::Mutex;
4444
use std::mem;
4545
use std::collections::HashMap;
4646

47-
pub const CHAN_CONFIRM_DEPTH: u32 = 100;
47+
pub const CHAN_CONFIRM_DEPTH: u32 = 10;
4848

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.
4951
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, node.best_block_info().1, false, Default::default());
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();
5264
let mut block = Block {
53-
header: BlockHeader { version: 0x20000000, prev_blockhash: node.best_block_hash(), 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(),
5567
};
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 i in height..conf_height {
71+
connect_block(node, &block, i);
5972
block = Block {
6073
header: BlockHeader { version: 0x20000000, prev_blockhash: block.header.block_hash(), merkle_root: Default::default(), time: 42, bits: 42, nonce: 42 },
6174
txdata: vec![],
6275
};
63-
connect_block(node, &block, i);
6476
}
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, conf_height);
6583
}
6684

6785
pub fn connect_blocks<'a, 'b, 'c, 'd>(node: &'a Node<'b, 'c, 'd>, depth: u32, height: u32, parent: bool, prev_blockhash: BlockHash) -> BlockHash {
6886
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: if parent { prev_blockhash } else { node.best_block_hash() }, merkle_root: Default::default(), time: 42, bits: 42, nonce: 42 },
7088
txdata: vec![],
7189
};
7290
connect_block(node, &block, height + 1);
@@ -91,9 +109,23 @@ pub fn connect_block<'a, 'b, 'c, 'd>(node: &'a Node<'b, 'c, 'd>, block: &Block,
91109
pub fn disconnect_block<'a, 'b, 'c, 'd>(node: &'a Node<'b, 'c, 'd>, header: &BlockHeader, height: u32) {
92110
node.chain_monitor.chain_monitor.block_disconnected(header, height);
93111
node.node.block_disconnected(header);
94-
node.node.test_process_background_events();
95112
node.blocks.borrow_mut().pop();
96113
}
114+
pub fn disconnect_blocks<'a, 'b, 'c, 'd>(node: &'a Node<'b, 'c, 'd>, count: u32) {
115+
assert!(node.blocks.borrow_mut().len() as u32 > count); // Cannot disconnect genesis
116+
for _ in 0..count {
117+
let (block_header, height) = {
118+
let blocks = node.blocks.borrow_mut();
119+
(blocks[blocks.len() - 1].0, blocks[blocks.len() - 1].1)
120+
};
121+
disconnect_block(&node, &block_header, height);
122+
}
123+
}
124+
125+
pub fn disconnect_all_blocks<'a, 'b, 'c, 'd>(node: &'a Node<'b, 'c, 'd>) {
126+
let count = node.blocks.borrow_mut().len() as u32 - 1;
127+
disconnect_blocks(node, count);
128+
}
97129

98130
pub struct TestChanMonCfg {
99131
pub tx_broadcaster: test_utils::TestBroadcaster,
@@ -427,8 +459,9 @@ pub fn create_chan_between_nodes_with_value_init<'a, 'b, 'c>(node_a: &Node<'a, '
427459
tx
428460
}
429461

430-
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) {
431-
confirm_transaction(node_conf, tx);
462+
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) {
463+
confirm_transaction_at(node_conf, tx, conf_height);
464+
connect_blocks(node_conf, CHAN_CONFIRM_DEPTH - 1, node_conf.best_block_info().1, false, Default::default());
432465
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()));
433466
}
434467

@@ -453,8 +486,10 @@ pub fn create_chan_between_nodes_with_value_confirm_second<'a, 'b, 'c>(node_recv
453486
}
454487

455488
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]) {
456-
create_chan_between_nodes_with_value_confirm_first(node_a, node_b, tx);
457-
confirm_transaction(node_a, tx);
489+
let conf_height = std::cmp::max(node_a.best_block_info().1 + 1, node_b.best_block_info().1 + 1);
490+
create_chan_between_nodes_with_value_confirm_first(node_a, node_b, tx, conf_height);
491+
confirm_transaction_at(node_a, tx, conf_height);
492+
connect_blocks(node_a, CHAN_CONFIRM_DEPTH - 1, node_a.best_block_info().1, false, Default::default());
458493
create_chan_between_nodes_with_value_confirm_second(node_b, node_a)
459494
}
460495

@@ -854,13 +889,13 @@ macro_rules! expect_payment_failed {
854889
assert_eq!(events.len(), 1);
855890
match events[0] {
856891
Event::PaymentFailed { ref payment_hash, rejected_by_dest, ref error_code, ref error_data } => {
857-
assert_eq!(*payment_hash, $expected_payment_hash);
858-
assert_eq!(rejected_by_dest, $rejected_by_dest);
859-
assert!(error_code.is_some());
860-
assert!(error_data.is_some());
892+
assert_eq!(*payment_hash, $expected_payment_hash, "unexpected payment_hash");
893+
assert_eq!(rejected_by_dest, $rejected_by_dest, "unexpected rejected_by_dest value");
894+
assert!(error_code.is_some(), "expected error_code.is_some() = true");
895+
assert!(error_data.is_some(), "expected error_data.is_some() = true");
861896
$(
862-
assert_eq!(error_code.unwrap(), $expected_error_code);
863-
assert_eq!(&error_data.as_ref().unwrap()[..], $expected_error_data);
897+
assert_eq!(error_code.unwrap(), $expected_error_code, "unexpected error code");
898+
assert_eq!(&error_data.as_ref().unwrap()[..], $expected_error_data, "unexpected error data");
864899
)*
865900
},
866901
_ => panic!("Unexpected event"),
@@ -1031,7 +1066,7 @@ pub fn claim_payment<'a, 'b, 'c>(origin_node: &Node<'a, 'b, 'c>, expected_route:
10311066
claim_payment_along_route(origin_node, expected_route, false, our_payment_preimage, expected_amount);
10321067
}
10331068

1034-
pub const TEST_FINAL_CLTV: u32 = 32;
1069+
pub const TEST_FINAL_CLTV: u32 = 50;
10351070

10361071
pub fn route_payment<'a, 'b, 'c>(origin_node: &Node<'a, 'b, 'c>, expected_route: &[&Node<'a, 'b, 'c>], recv_value: u64) -> (PaymentPreimage, PaymentHash) {
10371072
let net_graph_msg_handler = &origin_node.net_graph_msg_handler;
@@ -1172,6 +1207,9 @@ pub fn create_node_chanmgrs<'a, 'b>(node_count: usize, cfgs: &'a Vec<NodeCfg<'b>
11721207
let mut chanmgrs = Vec::new();
11731208
for i in 0..node_count {
11741209
let mut default_config = UserConfig::default();
1210+
// Set cltv_expiry_delta slightly lower to keep the final CLTV values inside one byte in our
1211+
// tests so that our script-length checks don't fail (see ACCEPTED_HTLC_SCRIPT_WEIGHT).
1212+
default_config.channel_options.cltv_expiry_delta = 6*6;
11751213
default_config.channel_options.announced_channel = true;
11761214
default_config.peer_channel_config_limits.force_announced_channel_preference = false;
11771215
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
@@ -1207,7 +1245,8 @@ pub fn create_network<'a, 'b: 'a, 'c: 'b>(node_count: usize, cfgs: &'b Vec<NodeC
12071245
nodes
12081246
}
12091247

1210-
pub const ACCEPTED_HTLC_SCRIPT_WEIGHT: usize = 138; //Here we have a diff due to HTLC CLTV expiry being < 2^15 in test
1248+
// Note that the following only works for CLTV values up to 128
1249+
pub const ACCEPTED_HTLC_SCRIPT_WEIGHT: usize = 137; //Here we have a diff due to HTLC CLTV expiry being < 2^15 in test
12111250
pub const OFFERED_HTLC_SCRIPT_WEIGHT: usize = 133;
12121251

12131252
#[derive(PartialEq)]

0 commit comments

Comments
 (0)