Skip to content

Commit 2b868c7

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 382c00e commit 2b868c7

File tree

5 files changed

+155
-114
lines changed

5 files changed

+155
-114
lines changed

lightning-persister/src/lib.rs

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

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

lightning/src/ln/channelmanager.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -520,7 +520,7 @@ pub(crate) const MAX_LOCAL_BREAKDOWN_TIMEOUT: u16 = 2 * 6 * 24 * 7;
520520
/// ie the node we forwarded the payment on to should always have enough room to reliably time out
521521
/// the HTLC via a full update_fail_htlc/commitment_signed dance before we hit the
522522
/// CLTV_CLAIM_BUFFER point (we static assert that it's at least 3 blocks more).
523-
const CLTV_EXPIRY_DELTA: u16 = 6 * 12; //TODO?
523+
const CLTV_EXPIRY_DELTA: u16 = 6 * 6; //TODO?
524524
pub(super) const CLTV_FAR_FAR_AWAY: u32 = 6 * 24 * 7; //TODO?
525525

526526
// Check that our CLTV_EXPIRY is at least CLTV_CLAIM_BUFFER + ANTI_REORG_DELAY + LATENCY_GRACE_PERIOD_BLOCKS,

lightning/src/ln/functional_test_utils.rs

Lines changed: 60 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -44,29 +44,51 @@ 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

4949
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;
50+
let starting_block = node.best_block_info();
5251
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],
52+
header: BlockHeader { version: 0x20000000, prev_blockhash: starting_block.0, merkle_root: Default::default(), time: 42, bits: 42, nonce: 42 },
53+
txdata: Vec::new(),
5554
};
5655
block.txdata.push(tx.clone());
57-
connect_block(node, &block, 1);
56+
let height = starting_block.1 + 1;
57+
connect_block(node, &block, height);
5858
for i in 2..CHAN_CONFIRM_DEPTH {
5959
block = Block {
6060
header: BlockHeader { version: 0x20000000, prev_blockhash: block.header.block_hash(), merkle_root: Default::default(), time: 42, bits: 42, nonce: 42 },
6161
txdata: vec![],
6262
};
63+
connect_block(node, &block, i + height);
64+
}
65+
}
66+
pub fn confirm_transaction_at<'a, 'b, 'c, 'd>(node: &'a Node<'b, 'c, 'd>, tx: &Transaction, conf_height: u32) {
67+
let starting_block = node.best_block_info();
68+
let mut block = Block {
69+
header: BlockHeader { version: 0x20000000, prev_blockhash: starting_block.0, merkle_root: Default::default(), time: 42, bits: 42, nonce: 42 },
70+
txdata: Vec::new(),
71+
};
72+
let height = starting_block.1 + 1;
73+
assert!(height <= conf_height);
74+
for i in height..conf_height {
6375
connect_block(node, &block, i);
76+
block = Block {
77+
header: BlockHeader { version: 0x20000000, prev_blockhash: block.header.block_hash(), merkle_root: Default::default(), time: 42, bits: 42, nonce: 42 },
78+
txdata: vec![],
79+
};
6480
}
81+
82+
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
83+
block.txdata.push(Transaction { version: 0, lock_time: 0, input: Vec::new(), output: Vec::new() });
84+
}
85+
block.txdata.push(tx.clone());
86+
connect_block(node, &block, conf_height);
6587
}
6688

6789
pub fn connect_blocks<'a, 'b, 'c, 'd>(node: &'a Node<'b, 'c, 'd>, depth: u32, height: u32, parent: bool, prev_blockhash: BlockHash) -> BlockHash {
6890
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 },
91+
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 },
7092
txdata: vec![],
7193
};
7294
connect_block(node, &block, height + 1);
@@ -93,6 +115,21 @@ pub fn disconnect_block<'a, 'b, 'c, 'd>(node: &'a Node<'b, 'c, 'd>, header: &Blo
93115
node.node.block_disconnected(header);
94116
node.blocks.lock().unwrap().pop();
95117
}
118+
pub fn disconnect_blocks<'a, 'b, 'c, 'd>(node: &'a Node<'b, 'c, 'd>, count: u32) {
119+
assert!(node.blocks.lock().unwrap().len() as u32 > count); // Cannot disconnect genesis
120+
for _ in 0..count {
121+
let (block_header, height) = {
122+
let blocks = node.blocks.lock().unwrap();
123+
(blocks[blocks.len() - 1].0, blocks[blocks.len() - 1].1)
124+
};
125+
disconnect_block(&node, &block_header, height);
126+
}
127+
}
128+
129+
pub fn disconnect_all_blocks<'a, 'b, 'c, 'd>(node: &'a Node<'b, 'c, 'd>) {
130+
let count = node.blocks.lock().unwrap().len() as u32 - 1;
131+
disconnect_blocks(node, count);
132+
}
96133

97134
pub struct TestChanMonCfg {
98135
pub tx_broadcaster: test_utils::TestBroadcaster,
@@ -426,8 +463,9 @@ pub fn create_chan_between_nodes_with_value_init<'a, 'b, 'c>(node_a: &Node<'a, '
426463
tx
427464
}
428465

429-
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) {
430-
confirm_transaction(node_conf, tx);
466+
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) {
467+
confirm_transaction_at(node_conf, tx, conf_height);
468+
connect_blocks(node_conf, CHAN_CONFIRM_DEPTH - 1, node_conf.best_block_info().1, false, Default::default());
431469
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()));
432470
}
433471

@@ -452,8 +490,10 @@ pub fn create_chan_between_nodes_with_value_confirm_second<'a, 'b, 'c>(node_recv
452490
}
453491

454492
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]) {
455-
create_chan_between_nodes_with_value_confirm_first(node_a, node_b, tx);
456-
confirm_transaction(node_a, tx);
493+
let conf_height = std::cmp::max(node_a.best_block_info().1 + 1, node_b.best_block_info().1 + 1);
494+
create_chan_between_nodes_with_value_confirm_first(node_a, node_b, tx, conf_height);
495+
confirm_transaction_at(node_a, tx, conf_height);
496+
connect_blocks(node_a, CHAN_CONFIRM_DEPTH - 1, node_a.best_block_info().1, false, Default::default());
457497
create_chan_between_nodes_with_value_confirm_second(node_b, node_a)
458498
}
459499

@@ -853,13 +893,13 @@ macro_rules! expect_payment_failed {
853893
assert_eq!(events.len(), 1);
854894
match events[0] {
855895
Event::PaymentFailed { ref payment_hash, rejected_by_dest, ref error_code, ref error_data } => {
856-
assert_eq!(*payment_hash, $expected_payment_hash);
857-
assert_eq!(rejected_by_dest, $rejected_by_dest);
858-
assert!(error_code.is_some());
859-
assert!(error_data.is_some());
896+
assert_eq!($expected_payment_hash, *payment_hash, "unexpected payment_hash");
897+
assert_eq!($rejected_by_dest, rejected_by_dest, "unexpected rejected_by_dest value");
898+
assert!(error_code.is_some(), "expected error_code.is_some() = true");
899+
assert!(error_data.is_some(), "expected error_data.is_some() = true");
860900
$(
861-
assert_eq!(error_code.unwrap(), $expected_error_code);
862-
assert_eq!(&error_data.as_ref().unwrap()[..], $expected_error_data);
901+
assert_eq!($expected_error_code, error_code.unwrap(), "unexpected error code");
902+
assert_eq!($expected_error_data, &error_data.as_ref().unwrap()[..], "unexpected error data");
863903
)*
864904
},
865905
_ => panic!("Unexpected event"),
@@ -1030,7 +1070,7 @@ pub fn claim_payment<'a, 'b, 'c>(origin_node: &Node<'a, 'b, 'c>, expected_route:
10301070
claim_payment_along_route(origin_node, expected_route, false, our_payment_preimage, expected_amount);
10311071
}
10321072

1033-
pub const TEST_FINAL_CLTV: u32 = 32;
1073+
pub const TEST_FINAL_CLTV: u32 = 50;
10341074

10351075
pub fn route_payment<'a, 'b, 'c>(origin_node: &Node<'a, 'b, 'c>, expected_route: &[&Node<'a, 'b, 'c>], recv_value: u64) -> (PaymentPreimage, PaymentHash) {
10361076
let net_graph_msg_handler = &origin_node.net_graph_msg_handler;
@@ -1206,7 +1246,8 @@ pub fn create_network<'a, 'b: 'a, 'c: 'b>(node_count: usize, cfgs: &'b Vec<NodeC
12061246
nodes
12071247
}
12081248

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

12121253
#[derive(PartialEq)]

0 commit comments

Comments
 (0)