Skip to content

Commit aef6ac2

Browse files
committed
Require best block timestamp within ChannelManager::new
This ensures freshly initialized nodes can proceed to create unexpired invoices without a call to `best_block_updated`, since an invoice's expiration delta is applied to `highest_seen_timestamp`.
1 parent 15b1c9b commit aef6ac2

File tree

6 files changed

+16
-3
lines changed

6 files changed

+16
-3
lines changed

fuzz/src/chanmon_consistency.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -436,9 +436,11 @@ pub fn do_test<Out: Output>(data: &[u8], underlying_out: Out) {
436436
config.channel_config.forwarding_fee_proportional_millionths = 0;
437437
config.channel_handshake_config.announced_channel = true;
438438
let network = Network::Bitcoin;
439+
let best_block_timestamp = genesis_block(network).header.time;
439440
let params = ChainParameters {
440441
network,
441442
best_block: BestBlock::from_network(network),
443+
best_block_timestamp,
442444
};
443445
(ChannelManager::new($fee_estimator.clone(), monitor.clone(), broadcast.clone(), &router, Arc::clone(&logger), keys_manager.clone(), keys_manager.clone(), keys_manager.clone(), config, params),
444446
monitor, keys_manager)

fuzz/src/full_stack.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -441,9 +441,11 @@ pub fn do_test(data: &[u8], logger: &Arc<dyn Logger>) {
441441
config.channel_config.forwarding_fee_proportional_millionths = slice_to_be32(get_slice!(4));
442442
config.channel_handshake_config.announced_channel = get_slice!(1)[0] != 0;
443443
let network = Network::Bitcoin;
444+
let best_block_timestamp = genesis_block(network).header.time;
444445
let params = ChainParameters {
445446
network,
446447
best_block: BestBlock::from_network(network),
448+
best_block_timestamp,
447449
};
448450
let channelmanager = Arc::new(ChannelManager::new(fee_est.clone(), monitor.clone(), broadcast.clone(), &router, Arc::clone(&logger), keys_manager.clone(), keys_manager.clone(), keys_manager.clone(), config, params));
449451
// Adding new calls to `EntropySource::get_secure_random_bytes` during startup can change all the

lightning-background-processor/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1142,7 +1142,7 @@ mod tests {
11421142
let keys_manager = Arc::new(KeysManager::new(&seed, now.as_secs(), now.subsec_nanos()));
11431143
let chain_monitor = Arc::new(chainmonitor::ChainMonitor::new(Some(chain_source.clone()), tx_broadcaster.clone(), logger.clone(), fee_estimator.clone(), persister.clone()));
11441144
let best_block = BestBlock::from_network(network);
1145-
let params = ChainParameters { network, best_block };
1145+
let params = ChainParameters { network, best_block, best_block_timestamp: genesis_block.header.time };
11461146
let manager = Arc::new(ChannelManager::new(fee_estimator.clone(), chain_monitor.clone(), tx_broadcaster.clone(), router.clone(), logger.clone(), keys_manager.clone(), keys_manager.clone(), keys_manager.clone(), UserConfig::default(), params));
11471147
let p2p_gossip_sync = Arc::new(P2PGossipSync::new(network_graph.clone(), Some(chain_source.clone()), logger.clone()));
11481148
let rapid_gossip_sync = Arc::new(RapidGossipSync::new(network_graph.clone(), logger.clone()));

lightning-invoice/src/utils.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1299,13 +1299,14 @@ mod test {
12991299
} else {
13001300
None
13011301
};
1302+
let genesis_timestamp = bitcoin::blockdata::constants::genesis_block(bitcoin::Network::Testnet).header.time as u64;
13021303
let non_default_invoice_expiry_secs = 4200;
13031304

13041305
let invoice =
13051306
crate::utils::create_phantom_invoice::<&test_utils::TestKeysInterface, &test_utils::TestKeysInterface, &test_utils::TestLogger>(
13061307
Some(payment_amt), payment_hash, "test".to_string(), non_default_invoice_expiry_secs,
13071308
route_hints, nodes[1].keys_manager, nodes[1].keys_manager, nodes[1].logger,
1308-
Currency::BitcoinTestnet, None, Duration::from_secs(1234567)
1309+
Currency::BitcoinTestnet, None, Duration::from_secs(genesis_timestamp)
13091310
).unwrap();
13101311
let (payment_hash, payment_secret) = (PaymentHash(invoice.payment_hash().into_inner()), *invoice.payment_secret());
13111312
let payment_preimage = if user_generated_pmt_hash {

lightning/src/ln/channelmanager.rs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1116,6 +1116,9 @@ pub struct ChainParameters {
11161116
///
11171117
/// Used to track on-chain channel funding outputs and send payments with reliable timelocks.
11181118
pub best_block: BestBlock,
1119+
1120+
/// The timestamp of the latest block successfully connected.
1121+
pub best_block_timestamp: u32,
11191122
}
11201123

11211124
#[derive(Copy, Clone, PartialEq)]
@@ -2018,7 +2021,7 @@ where
20182021

20192022
probing_cookie_secret: entropy_source.get_secure_random_bytes(),
20202023

2021-
highest_seen_timestamp: AtomicUsize::new(0),
2024+
highest_seen_timestamp: AtomicUsize::new(params.best_block_timestamp as usize),
20222025

20232026
per_peer_state: FairRwLock::new(HashMap::new()),
20242027

@@ -9874,6 +9877,7 @@ pub mod bench {
98749877
// Note that this is unrealistic as each payment send will require at least two fsync
98759878
// calls per node.
98769879
let network = bitcoin::Network::Testnet;
9880+
let genesis_block = bitcoin::blockdata::constants::genesis_block(network);
98779881

98789882
let tx_broadcaster = test_utils::TestBroadcaster::new(network);
98799883
let fee_estimator = test_utils::TestFeeEstimator { sat_per_kw: Mutex::new(253) };
@@ -9890,6 +9894,7 @@ pub mod bench {
98909894
let node_a = ChannelManager::new(&fee_estimator, &chain_monitor_a, &tx_broadcaster, &router, &logger_a, &keys_manager_a, &keys_manager_a, &keys_manager_a, config.clone(), ChainParameters {
98919895
network,
98929896
best_block: BestBlock::from_network(network),
9897+
best_block_timestamp: genesis_block.header.time,
98939898
});
98949899
let node_a_holder = ANodeHolder { node: &node_a };
98959900

@@ -9900,6 +9905,7 @@ pub mod bench {
99009905
let node_b = ChannelManager::new(&fee_estimator, &chain_monitor_b, &tx_broadcaster, &router, &logger_b, &keys_manager_b, &keys_manager_b, &keys_manager_b, config.clone(), ChainParameters {
99019906
network,
99029907
best_block: BestBlock::from_network(network),
9908+
best_block_timestamp: genesis_block.header.time,
99039909
});
99049910
let node_b_holder = ANodeHolder { node: &node_b };
99059911

lightning/src/ln/functional_test_utils.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2572,9 +2572,11 @@ pub fn create_node_chanmgrs<'a, 'b>(node_count: usize, cfgs: &'a Vec<NodeCfg<'b>
25722572
let mut chanmgrs = Vec::new();
25732573
for i in 0..node_count {
25742574
let network = Network::Testnet;
2575+
let genesis_block = bitcoin::blockdata::constants::genesis_block(network);
25752576
let params = ChainParameters {
25762577
network,
25772578
best_block: BestBlock::from_network(network),
2579+
best_block_timestamp: genesis_block.header.time,
25782580
};
25792581
let node = ChannelManager::new(cfgs[i].fee_estimator, &cfgs[i].chain_monitor, cfgs[i].tx_broadcaster, &cfgs[i].router, cfgs[i].logger, cfgs[i].keys_manager,
25802582
cfgs[i].keys_manager, cfgs[i].keys_manager, if node_config[i].is_some() { node_config[i].clone().unwrap() } else { test_default_channel_config() }, params);

0 commit comments

Comments
 (0)