mirror of
https://github.com/lightningdevkit/rust-lightning.git
synced 2025-02-24 15:02:20 +01:00
Implement routing against the netgraph in tests
This commit is contained in:
parent
2e06efe2ff
commit
3a274e0415
5 changed files with 55 additions and 42 deletions
|
@ -620,7 +620,7 @@ mod tests {
|
|||
type RGS = Arc<RapidGossipSync<Arc<NetworkGraph<Arc<test_utils::TestLogger>>>, Arc<test_utils::TestLogger>>>;
|
||||
|
||||
struct Node {
|
||||
node: Arc<SimpleArcChannelManager<ChainMonitor, test_utils::TestBroadcaster, test_utils::TestFeeEstimator, test_utils::TestRouter, test_utils::TestLogger>>,
|
||||
node: Arc<SimpleArcChannelManager<ChainMonitor, test_utils::TestBroadcaster, test_utils::TestFeeEstimator, DefaultRouter<Arc<NetworkGraph<Arc<test_utils::TestLogger>>>, Arc<test_utils::TestLogger>, Arc<Mutex<FixedPenaltyScorer>>>, test_utils::TestLogger>>,
|
||||
p2p_gossip_sync: PGS,
|
||||
rapid_gossip_sync: RGS,
|
||||
peer_manager: Arc<PeerManager<TestDescriptor, Arc<test_utils::TestChannelMessageHandler>, Arc<test_utils::TestRoutingMessageHandler>, IgnoringMessageHandler, Arc<test_utils::TestLogger>, IgnoringMessageHandler>>,
|
||||
|
@ -727,25 +727,25 @@ mod tests {
|
|||
for i in 0..num_nodes {
|
||||
let tx_broadcaster = Arc::new(test_utils::TestBroadcaster{txn_broadcasted: Mutex::new(Vec::new()), blocks: Arc::new(Mutex::new(Vec::new()))});
|
||||
let fee_estimator = Arc::new(test_utils::TestFeeEstimator { sat_per_kw: Mutex::new(253) });
|
||||
let router = Arc::new(test_utils::TestRouter { });
|
||||
let chain_source = Arc::new(test_utils::TestChainSource::new(Network::Testnet));
|
||||
let logger = Arc::new(test_utils::TestLogger::with_id(format!("node {}", i)));
|
||||
let persister = Arc::new(FilesystemPersister::new(format!("{}_persister_{}", persist_dir, i)));
|
||||
let seed = [i as u8; 32];
|
||||
let network = Network::Testnet;
|
||||
let genesis_block = genesis_block(network);
|
||||
let network_graph = Arc::new(NetworkGraph::new(genesis_block.header.block_hash(), logger.clone()));
|
||||
let scorer = Arc::new(Mutex::new(test_utils::TestScorer::with_penalty(0)));
|
||||
let seed = [i as u8; 32];
|
||||
let router = Arc::new(DefaultRouter::new(network_graph.clone(), logger.clone(), seed, scorer.clone()));
|
||||
let chain_source = Arc::new(test_utils::TestChainSource::new(Network::Testnet));
|
||||
let persister = Arc::new(FilesystemPersister::new(format!("{}_persister_{}", persist_dir, i)));
|
||||
let now = Duration::from_secs(genesis_block.header.time as u64);
|
||||
let keys_manager = Arc::new(KeysManager::new(&seed, now.as_secs(), now.subsec_nanos()));
|
||||
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_genesis(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(), UserConfig::default(), params));
|
||||
let network_graph = Arc::new(NetworkGraph::new(genesis_block.header.block_hash(), logger.clone()));
|
||||
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()));
|
||||
let msg_handler = MessageHandler { chan_handler: Arc::new(test_utils::TestChannelMessageHandler::new()), route_handler: Arc::new(test_utils::TestRoutingMessageHandler::new()), onion_message_handler: IgnoringMessageHandler{}};
|
||||
let peer_manager = Arc::new(PeerManager::new(msg_handler, keys_manager.get_node_secret(Recipient::Node).unwrap(), 0, &seed, logger.clone(), IgnoringMessageHandler{}));
|
||||
let scorer = Arc::new(Mutex::new(test_utils::TestScorer::with_penalty(0)));
|
||||
let node = Node { node: manager, p2p_gossip_sync, rapid_gossip_sync, peer_manager, chain_monitor, persister, tx_broadcaster, network_graph, logger, best_block, scorer };
|
||||
nodes.push(node);
|
||||
}
|
||||
|
|
|
@ -7512,7 +7512,7 @@ mod tests {
|
|||
final_value_msat: 10_000,
|
||||
final_cltv_expiry_delta: 40,
|
||||
};
|
||||
let network_graph = nodes[0].network_graph;
|
||||
let network_graph = nodes[0].network_graph.clone();
|
||||
let first_hops = nodes[0].node.list_usable_channels();
|
||||
let scorer = test_utils::TestScorer::with_penalty(0);
|
||||
let random_seed_bytes = chanmon_cfgs[1].keys_manager.get_secure_random_bytes();
|
||||
|
@ -7557,7 +7557,7 @@ mod tests {
|
|||
final_value_msat: 10_000,
|
||||
final_cltv_expiry_delta: 40,
|
||||
};
|
||||
let network_graph = nodes[0].network_graph;
|
||||
let network_graph = nodes[0].network_graph.clone();
|
||||
let first_hops = nodes[0].node.list_usable_channels();
|
||||
let scorer = test_utils::TestScorer::with_penalty(0);
|
||||
let random_seed_bytes = chanmon_cfgs[1].keys_manager.get_secure_random_bytes();
|
||||
|
@ -7785,7 +7785,7 @@ pub mod bench {
|
|||
&'a test_utils::TestBroadcaster, &'a test_utils::TestFeeEstimator,
|
||||
&'a test_utils::TestLogger, &'a P>,
|
||||
&'a test_utils::TestBroadcaster, &'a KeysManager,
|
||||
&'a test_utils::TestFeeEstimator, &'a test_utils::TestRouter,
|
||||
&'a test_utils::TestFeeEstimator, &'a test_utils::TestRouter<'a>,
|
||||
&'a test_utils::TestLogger>,
|
||||
}
|
||||
|
||||
|
@ -7804,12 +7804,12 @@ pub mod bench {
|
|||
|
||||
let tx_broadcaster = test_utils::TestBroadcaster{txn_broadcasted: Mutex::new(Vec::new()), blocks: Arc::new(Mutex::new(Vec::new()))};
|
||||
let fee_estimator = test_utils::TestFeeEstimator { sat_per_kw: Mutex::new(253) };
|
||||
let router = test_utils::TestRouter {};
|
||||
let logger_a = test_utils::TestLogger::with_id("node a".to_owned());
|
||||
let router = test_utils::TestRouter::new(Arc::new(NetworkGraph::new(genesis_hash, &logger_a)));
|
||||
|
||||
let mut config: UserConfig = Default::default();
|
||||
config.channel_handshake_config.minimum_depth = 1;
|
||||
|
||||
let logger_a = test_utils::TestLogger::with_id("node a".to_owned());
|
||||
let chain_monitor_a = ChainMonitor::new(None, &tx_broadcaster, &logger_a, &fee_estimator, &persister_a);
|
||||
let seed_a = [1u8; 32];
|
||||
let keys_manager_a = KeysManager::new(&seed_a, 42, 42);
|
||||
|
|
|
@ -301,11 +301,11 @@ pub struct NodeCfg<'a> {
|
|||
pub chain_source: &'a test_utils::TestChainSource,
|
||||
pub tx_broadcaster: &'a test_utils::TestBroadcaster,
|
||||
pub fee_estimator: &'a test_utils::TestFeeEstimator,
|
||||
pub router: test_utils::TestRouter,
|
||||
pub router: test_utils::TestRouter<'a>,
|
||||
pub chain_monitor: test_utils::TestChainMonitor<'a>,
|
||||
pub keys_manager: &'a test_utils::TestKeysInterface,
|
||||
pub logger: &'a test_utils::TestLogger,
|
||||
pub network_graph: NetworkGraph<&'a test_utils::TestLogger>,
|
||||
pub network_graph: Arc<NetworkGraph<&'a test_utils::TestLogger>>,
|
||||
pub node_seed: [u8; 32],
|
||||
pub features: InitFeatures,
|
||||
}
|
||||
|
@ -314,11 +314,11 @@ pub struct Node<'a, 'b: 'a, 'c: 'b> {
|
|||
pub chain_source: &'c test_utils::TestChainSource,
|
||||
pub tx_broadcaster: &'c test_utils::TestBroadcaster,
|
||||
pub fee_estimator: &'c test_utils::TestFeeEstimator,
|
||||
pub router: &'b test_utils::TestRouter,
|
||||
pub router: &'b test_utils::TestRouter<'c>,
|
||||
pub chain_monitor: &'b test_utils::TestChainMonitor<'c>,
|
||||
pub keys_manager: &'b test_utils::TestKeysInterface,
|
||||
pub node: &'a ChannelManager<&'b TestChainMonitor<'c>, &'c test_utils::TestBroadcaster, &'b test_utils::TestKeysInterface, &'c test_utils::TestFeeEstimator, &'c test_utils::TestRouter, &'c test_utils::TestLogger>,
|
||||
pub network_graph: &'b NetworkGraph<&'c test_utils::TestLogger>,
|
||||
pub node: &'a ChannelManager<&'b TestChainMonitor<'c>, &'c test_utils::TestBroadcaster, &'b test_utils::TestKeysInterface, &'c test_utils::TestFeeEstimator, &'b test_utils::TestRouter<'c>, &'c test_utils::TestLogger>,
|
||||
pub network_graph: &'a NetworkGraph<&'c test_utils::TestLogger>,
|
||||
pub gossip_sync: P2PGossipSync<&'b NetworkGraph<&'c test_utils::TestLogger>, &'c test_utils::TestChainSource, &'c test_utils::TestLogger>,
|
||||
pub node_seed: [u8; 32],
|
||||
pub network_payment_count: Rc<RefCell<u8>>,
|
||||
|
@ -356,8 +356,8 @@ impl<'a, 'b, 'c> Drop for Node<'a, 'b, 'c> {
|
|||
panic!("Had {} excess added monitors on node {}", added_monitors.len(), self.logger.id);
|
||||
}
|
||||
|
||||
// Check that if we serialize the Router, we can deserialize it again.
|
||||
{
|
||||
// Check that if we serialize the network graph, we can deserialize it again.
|
||||
let network_graph = {
|
||||
let mut w = test_utils::TestVecWriter(Vec::new());
|
||||
self.network_graph.write(&mut w).unwrap();
|
||||
let network_graph_deser = <NetworkGraph<_>>::read(&mut io::Cursor::new(&w.0), self.logger).unwrap();
|
||||
|
@ -385,7 +385,8 @@ impl<'a, 'b, 'c> Drop for Node<'a, 'b, 'c> {
|
|||
None => break,
|
||||
};
|
||||
}
|
||||
}
|
||||
network_graph_deser
|
||||
};
|
||||
|
||||
// Check that if we serialize and then deserialize all our channel monitors we get the
|
||||
// same set of outputs to watch for on chain as we have now. Note that if we write
|
||||
|
@ -421,7 +422,7 @@ impl<'a, 'b, 'c> Drop for Node<'a, 'b, 'c> {
|
|||
default_config: *self.node.get_current_default_configuration(),
|
||||
keys_manager: self.keys_manager,
|
||||
fee_estimator: &test_utils::TestFeeEstimator { sat_per_kw: Mutex::new(253) },
|
||||
router: &test_utils::TestRouter {},
|
||||
router: &test_utils::TestRouter::new(Arc::new(network_graph)),
|
||||
chain_monitor: self.chain_monitor,
|
||||
tx_broadcaster: &broadcaster,
|
||||
logger: &self.logger,
|
||||
|
@ -658,7 +659,7 @@ macro_rules! check_added_monitors {
|
|||
}
|
||||
}
|
||||
|
||||
pub fn _reload_node<'a, 'b, 'c, 'd>(node: &'a Node<'b, 'c, 'd>, default_config: UserConfig, chanman_encoded: &[u8], monitors_encoded: &[&[u8]]) -> ChannelManager<&'b TestChainMonitor<'c>, &'c test_utils::TestBroadcaster, &'b test_utils::TestKeysInterface, &'c test_utils::TestFeeEstimator, &'c test_utils::TestRouter, &'c test_utils::TestLogger> {
|
||||
pub fn _reload_node<'a, 'b, 'c, 'd>(node: &'a Node<'b, 'c, 'd>, default_config: UserConfig, chanman_encoded: &[u8], monitors_encoded: &[&[u8]]) -> ChannelManager<&'b TestChainMonitor<'c>, &'c test_utils::TestBroadcaster, &'b test_utils::TestKeysInterface, &'c test_utils::TestFeeEstimator, &'b test_utils::TestRouter<'c>, &'c test_utils::TestLogger> {
|
||||
let mut monitors_read = Vec::with_capacity(monitors_encoded.len());
|
||||
for encoded in monitors_encoded {
|
||||
let mut monitor_read = &encoded[..];
|
||||
|
@ -2156,7 +2157,7 @@ pub fn create_chanmon_cfgs(node_count: usize) -> Vec<TestChanMonCfg> {
|
|||
let seed = [i as u8; 32];
|
||||
let keys_manager = test_utils::TestKeysInterface::new(&seed, Network::Testnet);
|
||||
|
||||
chan_mon_cfgs.push(TestChanMonCfg{ tx_broadcaster, fee_estimator, chain_source, logger, persister, keys_manager });
|
||||
chan_mon_cfgs.push(TestChanMonCfg { tx_broadcaster, fee_estimator, chain_source, logger, persister, keys_manager });
|
||||
}
|
||||
|
||||
chan_mon_cfgs
|
||||
|
@ -2167,18 +2168,19 @@ pub fn create_node_cfgs<'a>(node_count: usize, chanmon_cfgs: &'a Vec<TestChanMon
|
|||
|
||||
for i in 0..node_count {
|
||||
let chain_monitor = test_utils::TestChainMonitor::new(Some(&chanmon_cfgs[i].chain_source), &chanmon_cfgs[i].tx_broadcaster, &chanmon_cfgs[i].logger, &chanmon_cfgs[i].fee_estimator, &chanmon_cfgs[i].persister, &chanmon_cfgs[i].keys_manager);
|
||||
let network_graph = Arc::new(NetworkGraph::new(chanmon_cfgs[i].chain_source.genesis_hash, &chanmon_cfgs[i].logger));
|
||||
let seed = [i as u8; 32];
|
||||
nodes.push(NodeCfg {
|
||||
chain_source: &chanmon_cfgs[i].chain_source,
|
||||
logger: &chanmon_cfgs[i].logger,
|
||||
tx_broadcaster: &chanmon_cfgs[i].tx_broadcaster,
|
||||
fee_estimator: &chanmon_cfgs[i].fee_estimator,
|
||||
router: test_utils::TestRouter {},
|
||||
router: test_utils::TestRouter::new(network_graph.clone()),
|
||||
chain_monitor,
|
||||
keys_manager: &chanmon_cfgs[i].keys_manager,
|
||||
node_seed: seed,
|
||||
features: channelmanager::provided_init_features(),
|
||||
network_graph: NetworkGraph::new(chanmon_cfgs[i].chain_source.genesis_hash, &chanmon_cfgs[i].logger),
|
||||
network_graph,
|
||||
});
|
||||
}
|
||||
|
||||
|
@ -2201,7 +2203,7 @@ pub fn test_default_channel_config() -> UserConfig {
|
|||
default_config
|
||||
}
|
||||
|
||||
pub fn create_node_chanmgrs<'a, 'b>(node_count: usize, cfgs: &'a Vec<NodeCfg<'b>>, node_config: &[Option<UserConfig>]) -> Vec<ChannelManager<&'a TestChainMonitor<'b>, &'b test_utils::TestBroadcaster, &'a test_utils::TestKeysInterface, &'b test_utils::TestFeeEstimator, &'a test_utils::TestRouter, &'b test_utils::TestLogger>> {
|
||||
pub fn create_node_chanmgrs<'a, 'b>(node_count: usize, cfgs: &'a Vec<NodeCfg<'b>>, node_config: &[Option<UserConfig>]) -> Vec<ChannelManager<&'a TestChainMonitor<'b>, &'b test_utils::TestBroadcaster, &'a test_utils::TestKeysInterface, &'b test_utils::TestFeeEstimator, &'a test_utils::TestRouter<'b>, &'b test_utils::TestLogger>> {
|
||||
let mut chanmgrs = Vec::new();
|
||||
for i in 0..node_count {
|
||||
let network = Network::Testnet;
|
||||
|
@ -2224,12 +2226,12 @@ pub fn create_network<'a, 'b: 'a, 'c: 'b>(node_count: usize, cfgs: &'b Vec<NodeC
|
|||
let connect_style = Rc::new(RefCell::new(ConnectStyle::random_style()));
|
||||
|
||||
for i in 0..node_count {
|
||||
let gossip_sync = P2PGossipSync::new(&cfgs[i].network_graph, None, cfgs[i].logger);
|
||||
let gossip_sync = P2PGossipSync::new(cfgs[i].network_graph.as_ref(), None, cfgs[i].logger);
|
||||
nodes.push(Node{
|
||||
chain_source: cfgs[i].chain_source, tx_broadcaster: cfgs[i].tx_broadcaster,
|
||||
fee_estimator: cfgs[i].fee_estimator, router: &cfgs[i].router,
|
||||
chain_monitor: &cfgs[i].chain_monitor, keys_manager: &cfgs[i].keys_manager,
|
||||
node: &chan_mgrs[i], network_graph: &cfgs[i].network_graph, gossip_sync,
|
||||
node: &chan_mgrs[i], network_graph: cfgs[i].network_graph.as_ref(), gossip_sync,
|
||||
node_seed: cfgs[i].node_seed, network_chan_count: chan_count.clone(),
|
||||
network_payment_count: payment_count.clone(), logger: cfgs[i].logger,
|
||||
blocks: Arc::clone(&cfgs[i].tx_broadcaster.blocks),
|
||||
|
|
|
@ -56,7 +56,7 @@ use alloc::collections::BTreeSet;
|
|||
use core::default::Default;
|
||||
use core::iter::repeat;
|
||||
use bitcoin::hashes::Hash;
|
||||
use crate::sync::Mutex;
|
||||
use crate::sync::{Arc, Mutex};
|
||||
|
||||
use crate::ln::functional_test_utils::*;
|
||||
use crate::ln::chan_utils::CommitmentTransaction;
|
||||
|
@ -5214,8 +5214,8 @@ fn test_key_derivation_params() {
|
|||
let seed = [42; 32];
|
||||
let keys_manager = test_utils::TestKeysInterface::new(&seed, Network::Testnet);
|
||||
let chain_monitor = test_utils::TestChainMonitor::new(Some(&chanmon_cfgs[0].chain_source), &chanmon_cfgs[0].tx_broadcaster, &chanmon_cfgs[0].logger, &chanmon_cfgs[0].fee_estimator, &chanmon_cfgs[0].persister, &keys_manager);
|
||||
let router = test_utils::TestRouter {};
|
||||
let network_graph = NetworkGraph::new(chanmon_cfgs[0].chain_source.genesis_hash, &chanmon_cfgs[0].logger);
|
||||
let network_graph = Arc::new(NetworkGraph::new(chanmon_cfgs[0].chain_source.genesis_hash, &chanmon_cfgs[0].logger));
|
||||
let router = test_utils::TestRouter::new(network_graph.clone());
|
||||
let node = NodeCfg { chain_source: &chanmon_cfgs[0].chain_source, logger: &chanmon_cfgs[0].logger, tx_broadcaster: &chanmon_cfgs[0].tx_broadcaster, fee_estimator: &chanmon_cfgs[0].fee_estimator, router, chain_monitor, keys_manager: &keys_manager, network_graph, node_seed: seed, features: channelmanager::provided_init_features() };
|
||||
let mut node_cfgs = create_node_cfgs(3, &chanmon_cfgs);
|
||||
node_cfgs.remove(0);
|
||||
|
@ -9073,7 +9073,7 @@ fn test_keysend_payments_to_public_node() {
|
|||
let nodes = create_network(2, &node_cfgs, &node_chanmgrs);
|
||||
|
||||
let _chan = create_announced_chan_between_nodes_with_value(&nodes, 0, 1, 100000, 10001, channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
let network_graph = nodes[0].network_graph;
|
||||
let network_graph = nodes[0].network_graph.clone();
|
||||
let payer_pubkey = nodes[0].node.get_our_node_id();
|
||||
let payee_pubkey = nodes[1].node.get_our_node_id();
|
||||
let route_params = RouteParameters {
|
||||
|
@ -9114,7 +9114,7 @@ fn test_keysend_payments_to_private_node() {
|
|||
final_value_msat: 10000,
|
||||
final_cltv_expiry_delta: 40,
|
||||
};
|
||||
let network_graph = nodes[0].network_graph;
|
||||
let network_graph = nodes[0].network_graph.clone();
|
||||
let first_hops = nodes[0].node.list_usable_channels();
|
||||
let scorer = test_utils::TestScorer::with_penalty(0);
|
||||
let random_seed_bytes = chanmon_cfgs[1].keys_manager.get_secure_random_bytes();
|
||||
|
|
|
@ -21,7 +21,8 @@ use crate::ln::channelmanager;
|
|||
use crate::ln::features::{ChannelFeatures, InitFeatures, NodeFeatures};
|
||||
use crate::ln::{msgs, wire};
|
||||
use crate::ln::script::ShutdownScript;
|
||||
use crate::routing::router::{InFlightHtlcs, Route, RouteHop, RouteParameters, Router};
|
||||
use crate::routing::gossip::NetworkGraph;
|
||||
use crate::routing::router::{find_route, InFlightHtlcs, Route, RouteHop, RouteParameters, Router, ScorerAccountingForInFlightHtlcs};
|
||||
use crate::routing::scoring::FixedPenaltyScorer;
|
||||
use crate::util::enforcing_trait_impls::{EnforcingSigner, EnforcementState};
|
||||
use crate::util::events;
|
||||
|
@ -72,17 +73,27 @@ impl chaininterface::FeeEstimator for TestFeeEstimator {
|
|||
}
|
||||
}
|
||||
|
||||
pub struct TestRouter {}
|
||||
pub struct TestRouter<'a> {
|
||||
pub network_graph: Arc<NetworkGraph<&'a TestLogger>>,
|
||||
}
|
||||
|
||||
impl Router for TestRouter {
|
||||
impl<'a> TestRouter<'a> {
|
||||
pub fn new(network_graph: Arc<NetworkGraph<&'a TestLogger>>) -> Self {
|
||||
Self { network_graph }
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a> Router for TestRouter<'a> {
|
||||
fn find_route(
|
||||
&self, _payer: &PublicKey, _params: &RouteParameters, _first_hops: Option<&[&channelmanager::ChannelDetails]>,
|
||||
_inflight_htlcs: InFlightHtlcs
|
||||
&self, payer: &PublicKey, params: &RouteParameters, first_hops: Option<&[&channelmanager::ChannelDetails]>,
|
||||
inflight_htlcs: InFlightHtlcs
|
||||
) -> Result<Route, msgs::LightningError> {
|
||||
Err(msgs::LightningError {
|
||||
err: String::from("Not implemented"),
|
||||
action: msgs::ErrorAction::IgnoreError
|
||||
})
|
||||
let logger = TestLogger::new();
|
||||
find_route(
|
||||
payer, params, &self.network_graph, first_hops, &logger,
|
||||
&ScorerAccountingForInFlightHtlcs::new(TestScorer::with_penalty(0), inflight_htlcs),
|
||||
&[42; 32]
|
||||
)
|
||||
}
|
||||
fn notify_payment_path_failed(&self, _path: &[&RouteHop], _short_channel_id: u64) {}
|
||||
fn notify_payment_path_successful(&self, _path: &[&RouteHop]) {}
|
||||
|
|
Loading…
Add table
Reference in a new issue