mirror of
https://github.com/lightningdevkit/rust-lightning.git
synced 2025-02-24 23:08:36 +01:00
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`.
This commit is contained in:
parent
15b1c9b837
commit
82e0df5e4d
6 changed files with 20 additions and 9 deletions
|
@ -436,11 +436,12 @@ pub fn do_test<Out: Output>(data: &[u8], underlying_out: Out) {
|
|||
config.channel_config.forwarding_fee_proportional_millionths = 0;
|
||||
config.channel_handshake_config.announced_channel = true;
|
||||
let network = Network::Bitcoin;
|
||||
let best_block_timestamp = genesis_block(network).header.time;
|
||||
let params = ChainParameters {
|
||||
network,
|
||||
best_block: BestBlock::from_network(network),
|
||||
};
|
||||
(ChannelManager::new($fee_estimator.clone(), monitor.clone(), broadcast.clone(), &router, Arc::clone(&logger), keys_manager.clone(), keys_manager.clone(), keys_manager.clone(), config, params),
|
||||
(ChannelManager::new($fee_estimator.clone(), monitor.clone(), broadcast.clone(), &router, Arc::clone(&logger), keys_manager.clone(), keys_manager.clone(), keys_manager.clone(), config, params, best_block_timestamp),
|
||||
monitor, keys_manager)
|
||||
} }
|
||||
}
|
||||
|
|
|
@ -441,11 +441,12 @@ pub fn do_test(data: &[u8], logger: &Arc<dyn Logger>) {
|
|||
config.channel_config.forwarding_fee_proportional_millionths = slice_to_be32(get_slice!(4));
|
||||
config.channel_handshake_config.announced_channel = get_slice!(1)[0] != 0;
|
||||
let network = Network::Bitcoin;
|
||||
let best_block_timestamp = genesis_block(network).header.time;
|
||||
let params = ChainParameters {
|
||||
network,
|
||||
best_block: BestBlock::from_network(network),
|
||||
};
|
||||
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));
|
||||
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, best_block_timestamp));
|
||||
// Adding new calls to `EntropySource::get_secure_random_bytes` during startup can change all the
|
||||
// keys subsequently generated in this test. Rather than regenerating all the messages manually,
|
||||
// it's easier to just increment the counter here so the keys don't change.
|
||||
|
|
|
@ -1143,7 +1143,7 @@ mod tests {
|
|||
let chain_monitor = Arc::new(chainmonitor::ChainMonitor::new(Some(chain_source.clone()), tx_broadcaster.clone(), logger.clone(), fee_estimator.clone(), persister.clone()));
|
||||
let best_block = BestBlock::from_network(network);
|
||||
let params = ChainParameters { network, best_block };
|
||||
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));
|
||||
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, genesis_block.header.time));
|
||||
let p2p_gossip_sync = Arc::new(P2PGossipSync::new(network_graph.clone(), Some(chain_source.clone()), logger.clone()));
|
||||
let rapid_gossip_sync = Arc::new(RapidGossipSync::new(network_graph.clone(), logger.clone()));
|
||||
let msg_handler = MessageHandler {
|
||||
|
|
|
@ -1299,13 +1299,14 @@ mod test {
|
|||
} else {
|
||||
None
|
||||
};
|
||||
let genesis_timestamp = bitcoin::blockdata::constants::genesis_block(bitcoin::Network::Testnet).header.time as u64;
|
||||
let non_default_invoice_expiry_secs = 4200;
|
||||
|
||||
let invoice =
|
||||
crate::utils::create_phantom_invoice::<&test_utils::TestKeysInterface, &test_utils::TestKeysInterface, &test_utils::TestLogger>(
|
||||
Some(payment_amt), payment_hash, "test".to_string(), non_default_invoice_expiry_secs,
|
||||
route_hints, nodes[1].keys_manager, nodes[1].keys_manager, nodes[1].logger,
|
||||
Currency::BitcoinTestnet, None, Duration::from_secs(1234567)
|
||||
Currency::BitcoinTestnet, None, Duration::from_secs(genesis_timestamp)
|
||||
).unwrap();
|
||||
let (payment_hash, payment_secret) = (PaymentHash(invoice.payment_hash().into_inner()), *invoice.payment_secret());
|
||||
let payment_preimage = if user_generated_pmt_hash {
|
||||
|
|
|
@ -1973,6 +1973,8 @@ where
|
|||
{
|
||||
/// Constructs a new `ChannelManager` to hold several channels and route between them.
|
||||
///
|
||||
/// The current time or latest block header time can be provided as the `current_timestamp`.
|
||||
///
|
||||
/// This is the main "logic hub" for all channel-related actions, and implements
|
||||
/// [`ChannelMessageHandler`].
|
||||
///
|
||||
|
@ -1986,7 +1988,11 @@ where
|
|||
/// [`block_connected`]: chain::Listen::block_connected
|
||||
/// [`block_disconnected`]: chain::Listen::block_disconnected
|
||||
/// [`params.best_block.block_hash`]: chain::BestBlock::block_hash
|
||||
pub fn new(fee_est: F, chain_monitor: M, tx_broadcaster: T, router: R, logger: L, entropy_source: ES, node_signer: NS, signer_provider: SP, config: UserConfig, params: ChainParameters) -> Self {
|
||||
pub fn new(
|
||||
fee_est: F, chain_monitor: M, tx_broadcaster: T, router: R, logger: L, entropy_source: ES,
|
||||
node_signer: NS, signer_provider: SP, config: UserConfig, params: ChainParameters,
|
||||
current_timestamp: u32,
|
||||
) -> Self {
|
||||
let mut secp_ctx = Secp256k1::new();
|
||||
secp_ctx.seeded_randomize(&entropy_source.get_secure_random_bytes());
|
||||
let inbound_pmt_key_material = node_signer.get_inbound_payment_key_material();
|
||||
|
@ -2018,7 +2024,7 @@ where
|
|||
|
||||
probing_cookie_secret: entropy_source.get_secure_random_bytes(),
|
||||
|
||||
highest_seen_timestamp: AtomicUsize::new(0),
|
||||
highest_seen_timestamp: AtomicUsize::new(current_timestamp as usize),
|
||||
|
||||
per_peer_state: FairRwLock::new(HashMap::new()),
|
||||
|
||||
|
@ -9874,6 +9880,7 @@ pub mod bench {
|
|||
// Note that this is unrealistic as each payment send will require at least two fsync
|
||||
// calls per node.
|
||||
let network = bitcoin::Network::Testnet;
|
||||
let genesis_block = bitcoin::blockdata::constants::genesis_block(network);
|
||||
|
||||
let tx_broadcaster = test_utils::TestBroadcaster::new(network);
|
||||
let fee_estimator = test_utils::TestFeeEstimator { sat_per_kw: Mutex::new(253) };
|
||||
|
@ -9890,7 +9897,7 @@ pub mod bench {
|
|||
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 {
|
||||
network,
|
||||
best_block: BestBlock::from_network(network),
|
||||
});
|
||||
}, genesis_block.header.time);
|
||||
let node_a_holder = ANodeHolder { node: &node_a };
|
||||
|
||||
let logger_b = test_utils::TestLogger::with_id("node a".to_owned());
|
||||
|
@ -9900,7 +9907,7 @@ pub mod bench {
|
|||
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 {
|
||||
network,
|
||||
best_block: BestBlock::from_network(network),
|
||||
});
|
||||
}, genesis_block.header.time);
|
||||
let node_b_holder = ANodeHolder { node: &node_b };
|
||||
|
||||
node_a.peer_connected(&node_b.get_our_node_id(), &Init {
|
||||
|
|
|
@ -2572,12 +2572,13 @@ pub fn create_node_chanmgrs<'a, 'b>(node_count: usize, cfgs: &'a Vec<NodeCfg<'b>
|
|||
let mut chanmgrs = Vec::new();
|
||||
for i in 0..node_count {
|
||||
let network = Network::Testnet;
|
||||
let genesis_block = bitcoin::blockdata::constants::genesis_block(network);
|
||||
let params = ChainParameters {
|
||||
network,
|
||||
best_block: BestBlock::from_network(network),
|
||||
};
|
||||
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,
|
||||
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);
|
||||
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, genesis_block.header.time);
|
||||
chanmgrs.push(node);
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue