Merge pull request #1124 from jkczyz/2021-10-default-channel-scoring
authorMatt Corallo <649246+TheBlueMatt@users.noreply.github.com>
Sat, 16 Oct 2021 01:58:15 +0000 (01:58 +0000)
committerGitHub <noreply@github.com>
Sat, 16 Oct 2021 01:58:15 +0000 (01:58 +0000)
Add channel scoring to get_route

1  2 
fuzz/src/full_stack.rs
lightning/src/ln/channelmanager.rs
lightning/src/ln/functional_test_utils.rs
lightning/src/ln/functional_tests.rs

diff --combined fuzz/src/full_stack.rs
index f371a7eae6d444a54e4fbb274f8e9ea57a0b1f77,06ec9548873e70bd51e8d6011fc03816ab8eedcd..84ba7bab502ea4f44ec2bca37ee83a01b1a5e404
@@@ -37,8 -37,9 +37,9 @@@ use lightning::ln::channelmanager::{Cha
  use lightning::ln::peer_handler::{MessageHandler,PeerManager,SocketDescriptor,IgnoringMessageHandler};
  use lightning::ln::msgs::DecodeError;
  use lightning::ln::script::ShutdownScript;
- use lightning::routing::router::get_route;
  use lightning::routing::network_graph::{NetGraphMsgHandler, NetworkGraph};
+ use lightning::routing::router::get_route;
+ use lightning::routing::scorer::Scorer;
  use lightning::util::config::UserConfig;
  use lightning::util::errors::APIError;
  use lightning::util::events::Event;
@@@ -365,8 -366,7 +366,8 @@@ pub fn do_test(data: &[u8], logger: &Ar
        };
  
        let broadcast = Arc::new(TestBroadcaster{ txn_broadcasted: Mutex::new(Vec::new()) });
 -      let monitor = Arc::new(chainmonitor::ChainMonitor::new(None, broadcast.clone(), Arc::clone(&logger), fee_est.clone(), Arc::new(TestPersister{})));
 +      let monitor = Arc::new(chainmonitor::ChainMonitor::new(None, broadcast.clone(), Arc::clone(&logger), fee_est.clone(),
 +              Arc::new(TestPersister { update_ret: Mutex::new(Ok(())) })));
  
        let keys_manager = Arc::new(KeyProvider { node_secret: our_network_key.clone(), counter: AtomicU64::new(0) });
        let mut config = UserConfig::default();
        let our_id = PublicKey::from_secret_key(&Secp256k1::signing_only(), &keys_manager.get_node_secret());
        let network_graph = NetworkGraph::new(genesis_block(network).block_hash());
        let net_graph_msg_handler = Arc::new(NetGraphMsgHandler::new(network_graph, None, Arc::clone(&logger)));
+       let scorer = Scorer::new(0);
  
        let peers = RefCell::new([false; 256]);
        let mut loss_detector = MoneyLossDetector::new(&peers, channelmanager.clone(), monitor.clone(), PeerManager::new(MessageHandler {
                        },
                        4 => {
                                let value = slice_to_be24(get_slice!(3)) as u64;
-                               let route = match get_route(&our_id, &net_graph_msg_handler.network_graph, &get_pubkey!(), None, None, &Vec::new(), value, 42, Arc::clone(&logger)) {
+                               let route = match get_route(&our_id, &net_graph_msg_handler.network_graph, &get_pubkey!(), None, None, &Vec::new(), value, 42, Arc::clone(&logger), &scorer) {
                                        Ok(route) => route,
                                        Err(_) => return,
                                };
                        },
                        15 => {
                                let value = slice_to_be24(get_slice!(3)) as u64;
-                               let mut route = match get_route(&our_id, &net_graph_msg_handler.network_graph, &get_pubkey!(), None, None, &Vec::new(), value, 42, Arc::clone(&logger)) {
+                               let mut route = match get_route(&our_id, &net_graph_msg_handler.network_graph, &get_pubkey!(), None, None, &Vec::new(), value, 42, Arc::clone(&logger), &scorer) {
                                        Ok(route) => route,
                                        Err(_) => return,
                                };
index 77faac0898fdc61b93b2cd688973a4a33be0649a,95f1d9b6ffaaebcbbc08c0f4b55cf60b9aff1472..fa0d12284a581fdff176ff1de38c52779a9356f4
@@@ -36,9 -36,9 +36,9 @@@ use bitcoin::secp256k1::ecdh::SharedSec
  use bitcoin::secp256k1;
  
  use chain;
 -use chain::{Confirm, Watch, BestBlock};
 +use chain::{Confirm, ChannelMonitorUpdateErr, Watch, BestBlock};
  use chain::chaininterface::{BroadcasterInterface, ConfirmationTarget, FeeEstimator};
 -use chain::channelmonitor::{ChannelMonitor, ChannelMonitorUpdate, ChannelMonitorUpdateStep, ChannelMonitorUpdateErr, HTLC_FAIL_BACK_BUFFER, CLTV_CLAIM_BUFFER, LATENCY_GRACE_PERIOD_BLOCKS, ANTI_REORG_DELAY, MonitorEvent, CLOSED_CHANNEL_UPDATE_ID};
 +use chain::channelmonitor::{ChannelMonitor, ChannelMonitorUpdate, ChannelMonitorUpdateStep, HTLC_FAIL_BACK_BUFFER, CLTV_CLAIM_BUFFER, LATENCY_GRACE_PERIOD_BLOCKS, ANTI_REORG_DELAY, MonitorEvent, CLOSED_CHANNEL_UPDATE_ID};
  use chain::transaction::{OutPoint, TransactionData};
  // Since this struct is returned in `list_channels` methods, expose it here in case users want to
  // construct one themselves.
@@@ -5804,6 -5804,7 +5804,7 @@@ mod tests 
        use ln::msgs;
        use ln::msgs::ChannelMessageHandler;
        use routing::router::{get_keysend_route, get_route};
+       use routing::scorer::Scorer;
        use util::errors::APIError;
        use util::events::{Event, MessageSendEvent, MessageSendEventsProvider};
        use util::test_utils;
                let nodes = create_network(2, &node_cfgs, &node_chanmgrs);
                create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::known(), InitFeatures::known());
                let logger = test_utils::TestLogger::new();
+               let scorer = Scorer::new(0);
  
                // To start (1), send a regular payment but don't claim it.
                let expected_route = [&nodes[1]];
                let (payment_preimage, payment_hash, _) = route_payment(&nodes[0], &expected_route, 100_000);
  
                // Next, attempt a keysend payment and make sure it fails.
-               let route = get_route(&nodes[0].node.get_our_node_id(), &nodes[0].net_graph_msg_handler.network_graph, &expected_route.last().unwrap().node.get_our_node_id(), Some(InvoiceFeatures::known()), None, &Vec::new(), 100_000, TEST_FINAL_CLTV, &logger).unwrap();
+               let route = get_route(&nodes[0].node.get_our_node_id(), &nodes[0].net_graph_msg_handler.network_graph, &expected_route.last().unwrap().node.get_our_node_id(), Some(InvoiceFeatures::known()), None, &Vec::new(), 100_000, TEST_FINAL_CLTV, &logger, &scorer).unwrap();
                nodes[0].node.send_spontaneous_payment(&route, Some(payment_preimage)).unwrap();
                check_added_monitors!(nodes[0], 1);
                let mut events = nodes[0].node.get_and_clear_pending_msg_events();
  
                // To start (2), send a keysend payment but don't claim it.
                let payment_preimage = PaymentPreimage([42; 32]);
-               let route = get_route(&nodes[0].node.get_our_node_id(), &nodes[0].net_graph_msg_handler.network_graph, &expected_route.last().unwrap().node.get_our_node_id(), Some(InvoiceFeatures::known()), None, &Vec::new(), 100_000, TEST_FINAL_CLTV, &logger).unwrap();
+               let route = get_route(&nodes[0].node.get_our_node_id(), &nodes[0].net_graph_msg_handler.network_graph, &expected_route.last().unwrap().node.get_our_node_id(), Some(InvoiceFeatures::known()), None, &Vec::new(), 100_000, TEST_FINAL_CLTV, &logger, &scorer).unwrap();
                let (payment_hash, _) = nodes[0].node.send_spontaneous_payment(&route, Some(payment_preimage)).unwrap();
                check_added_monitors!(nodes[0], 1);
                let mut events = nodes[0].node.get_and_clear_pending_msg_events();
                let _chan = create_chan_between_nodes(&nodes[0], &nodes[1], InitFeatures::known(), InitFeatures::known());
                let network_graph = &nodes[0].net_graph_msg_handler.network_graph;
                let first_hops = nodes[0].node.list_usable_channels();
+               let scorer = Scorer::new(0);
                let route = get_keysend_route(&payer_pubkey, network_graph, &payee_pubkey,
                                    Some(&first_hops.iter().collect::<Vec<_>>()), &vec![], 10000, 40,
-                                   nodes[0].logger).unwrap();
+                                   nodes[0].logger, &scorer).unwrap();
  
                let test_preimage = PaymentPreimage([42; 32]);
                let mismatch_payment_hash = PaymentHash([43; 32]);
                let _chan = create_chan_between_nodes(&nodes[0], &nodes[1], InitFeatures::known(), InitFeatures::known());
                let network_graph = &nodes[0].net_graph_msg_handler.network_graph;
                let first_hops = nodes[0].node.list_usable_channels();
+               let scorer = Scorer::new(0);
                let route = get_keysend_route(&payer_pubkey, network_graph, &payee_pubkey,
                                    Some(&first_hops.iter().collect::<Vec<_>>()), &vec![], 10000, 40,
-                                   nodes[0].logger).unwrap();
+                                   nodes[0].logger, &scorer).unwrap();
  
                let test_preimage = PaymentPreimage([42; 32]);
                let test_secret = PaymentSecret([43; 32]);
  #[cfg(all(any(test, feature = "_test_utils"), feature = "unstable"))]
  pub mod bench {
        use chain::Listen;
 -      use chain::chainmonitor::ChainMonitor;
 -      use chain::channelmonitor::Persist;
 +      use chain::chainmonitor::{ChainMonitor, Persist};
        use chain::keysinterface::{KeysManager, InMemorySigner};
        use ln::channelmanager::{BestBlock, ChainParameters, ChannelManager, PaymentHash, PaymentPreimage};
        use ln::features::{InitFeatures, InvoiceFeatures};
        use ln::msgs::{ChannelMessageHandler, Init};
        use routing::network_graph::NetworkGraph;
        use routing::router::get_route;
+       use routing::scorer::Scorer;
        use util::test_utils;
        use util::config::UserConfig;
        use util::events::{Event, MessageSendEvent, MessageSendEventsProvider, PaymentPurpose};
                macro_rules! send_payment {
                        ($node_a: expr, $node_b: expr) => {
                                let usable_channels = $node_a.list_usable_channels();
+                               let scorer = Scorer::new(0);
                                let route = get_route(&$node_a.get_our_node_id(), &dummy_graph, &$node_b.get_our_node_id(), Some(InvoiceFeatures::known()),
-                                       Some(&usable_channels.iter().map(|r| r).collect::<Vec<_>>()), &[], 10_000, TEST_FINAL_CLTV, &logger_a).unwrap();
+                                       Some(&usable_channels.iter().map(|r| r).collect::<Vec<_>>()), &[], 10_000, TEST_FINAL_CLTV, &logger_a, &scorer).unwrap();
  
                                let mut payment_preimage = PaymentPreimage([0; 32]);
                                payment_preimage.0[0..8].copy_from_slice(&payment_count.to_le_bytes());
index 137214f0c21e0458f5dc8c779b561c1fbc6b93bd,da334b45da8c465e0151a299bc5ffbce0effd599..f2ab55030e16b853535da7260ecea3bf3e56736f
@@@ -15,8 -15,9 +15,9 @@@ use chain::channelmonitor::ChannelMonit
  use chain::transaction::OutPoint;
  use ln::{PaymentPreimage, PaymentHash, PaymentSecret};
  use ln::channelmanager::{ChainParameters, ChannelManager, ChannelManagerReadArgs, RAACommitmentOrder, PaymentSendFailure};
- use routing::router::{Route, get_route};
  use routing::network_graph::{NetGraphMsgHandler, NetworkGraph};
+ use routing::router::{Route, get_route};
+ use routing::scorer::Scorer;
  use ln::features::{InitFeatures, InvoiceFeatures};
  use ln::msgs;
  use ln::msgs::{ChannelMessageHandler,RoutingMessageHandler};
@@@ -274,9 -275,10 +275,9 @@@ impl<'a, 'b, 'c> Drop for Node<'a, 'b, 
                        let feeest = test_utils::TestFeeEstimator { sat_per_kw: Mutex::new(253) };
                        let mut deserialized_monitors = Vec::new();
                        {
 -                              let old_monitors = self.chain_monitor.chain_monitor.monitors.read().unwrap();
 -                              for (_, old_monitor) in old_monitors.iter() {
 +                              for outpoint in self.chain_monitor.chain_monitor.list_monitors() {
                                        let mut w = test_utils::TestVecWriter(Vec::new());
 -                                      old_monitor.write(&mut w).unwrap();
 +                                      self.chain_monitor.chain_monitor.get_monitor(outpoint).unwrap().write(&mut w).unwrap();
                                        let (_, deserialized_monitor) = <(BlockHash, ChannelMonitor<EnforcingSigner>)>::read(
                                                &mut io::Cursor::new(&w.0), self.keys_manager).unwrap();
                                        deserialized_monitors.push(deserialized_monitor);
@@@ -436,35 -438,20 +437,35 @@@ macro_rules! get_feerate 
        }
  }
  
 -/// Returns any local commitment transactions for the channel.
 +/// Returns a channel monitor given a channel id, making some naive assumptions
  #[macro_export]
 -macro_rules! get_local_commitment_txn {
 +macro_rules! get_monitor {
        ($node: expr, $channel_id: expr) => {
                {
 -                      let monitors = $node.chain_monitor.chain_monitor.monitors.read().unwrap();
 -                      let mut commitment_txn = None;
 -                      for (funding_txo, monitor) in monitors.iter() {
 -                              if funding_txo.to_channel_id() == $channel_id {
 -                                      commitment_txn = Some(monitor.unsafe_get_latest_holder_commitment_txn(&$node.logger));
 +                      use bitcoin::hashes::Hash;
 +                      let mut monitor = None;
 +                      // Assume funding vout is either 0 or 1 blindly
 +                      for index in 0..2 {
 +                              if let Ok(mon) = $node.chain_monitor.chain_monitor.get_monitor(
 +                                      $crate::chain::transaction::OutPoint {
 +                                              txid: bitcoin::Txid::from_slice(&$channel_id[..]).unwrap(), index
 +                                      })
 +                              {
 +                                      monitor = Some(mon);
                                        break;
                                }
                        }
 -                      commitment_txn.unwrap()
 +                      monitor.unwrap()
 +              }
 +      }
 +}
 +
 +/// Returns any local commitment transactions for the channel.
 +#[macro_export]
 +macro_rules! get_local_commitment_txn {
 +      ($node: expr, $channel_id: expr) => {
 +              {
 +                      $crate::get_monitor!($node, $channel_id).unsafe_get_latest_holder_commitment_txn(&$node.logger)
                }
        }
  }
@@@ -1010,11 -997,12 +1011,12 @@@ macro_rules! get_route_and_payment_has
        ($send_node: expr, $recv_node: expr, $last_hops: expr, $recv_value: expr, $cltv: expr) => {{
                let (payment_preimage, payment_hash, payment_secret) = get_payment_preimage_hash!($recv_node, Some($recv_value));
                let net_graph_msg_handler = &$send_node.net_graph_msg_handler;
+               let scorer = ::routing::scorer::Scorer::new(0);
                let route = ::routing::router::get_route(
                        &$send_node.node.get_our_node_id(), &net_graph_msg_handler.network_graph,
                        &$recv_node.node.get_our_node_id(), Some(::ln::features::InvoiceFeatures::known()),
                        Some(&$send_node.node.list_usable_channels().iter().collect::<Vec<_>>()),
-                       &$last_hops, $recv_value, $cltv, $send_node.logger
+                       &$last_hops, $recv_value, $cltv, $send_node.logger, &scorer
                ).unwrap();
                (route, payment_hash, payment_preimage, payment_secret)
        }}
@@@ -1325,10 -1313,11 +1327,11 @@@ pub const TEST_FINAL_CLTV: u32 = 70
  
  pub fn route_payment<'a, 'b, 'c>(origin_node: &Node<'a, 'b, 'c>, expected_route: &[&Node<'a, 'b, 'c>], recv_value: u64) -> (PaymentPreimage, PaymentHash, PaymentSecret) {
        let net_graph_msg_handler = &origin_node.net_graph_msg_handler;
+       let scorer = Scorer::new(0);
        let route = get_route(&origin_node.node.get_our_node_id(), &net_graph_msg_handler.network_graph,
                &expected_route.last().unwrap().node.get_our_node_id(), Some(InvoiceFeatures::known()),
                Some(&origin_node.node.list_usable_channels().iter().collect::<Vec<_>>()), &[],
-               recv_value, TEST_FINAL_CLTV, origin_node.logger).unwrap();
+               recv_value, TEST_FINAL_CLTV, origin_node.logger, &scorer).unwrap();
        assert_eq!(route.paths.len(), 1);
        assert_eq!(route.paths[0].len(), expected_route.len());
        for (node, hop) in expected_route.iter().zip(route.paths[0].iter()) {
  
  pub fn route_over_limit<'a, 'b, 'c>(origin_node: &Node<'a, 'b, 'c>, expected_route: &[&Node<'a, 'b, 'c>], recv_value: u64)  {
        let net_graph_msg_handler = &origin_node.net_graph_msg_handler;
-       let route = get_route(&origin_node.node.get_our_node_id(), &net_graph_msg_handler.network_graph, &expected_route.last().unwrap().node.get_our_node_id(), Some(InvoiceFeatures::known()), None, &Vec::new(), recv_value, TEST_FINAL_CLTV, origin_node.logger).unwrap();
+       let scorer = Scorer::new(0);
+       let route = get_route(&origin_node.node.get_our_node_id(), &net_graph_msg_handler.network_graph, &expected_route.last().unwrap().node.get_our_node_id(), Some(InvoiceFeatures::known()), None, &Vec::new(), recv_value, TEST_FINAL_CLTV, origin_node.logger, &scorer).unwrap();
        assert_eq!(route.paths.len(), 1);
        assert_eq!(route.paths[0].len(), expected_route.len());
        for (node, hop) in expected_route.iter().zip(route.paths[0].iter()) {
index ca4fa3b3563baf8cc041886429cebe554d17c5ee,2a9ec272727d38a55cefe72491fe541fd1a40af9..a8a0e32f1b554660b3458d579e28f6de937357ea
@@@ -25,6 -25,7 +25,7 @@@ use ln::{chan_utils, onion_utils}
  use ln::chan_utils::HTLC_SUCCESS_TX_WEIGHT;
  use routing::network_graph::{NetworkUpdate, RoutingFees};
  use routing::router::{Route, RouteHop, RouteHint, RouteHintHop, get_route, get_keysend_route};
+ use routing::scorer::Scorer;
  use ln::features::{ChannelFeatures, InitFeatures, InvoiceFeatures, NodeFeatures};
  use ln::msgs;
  use ln::msgs::{ChannelMessageHandler, RoutingMessageHandler, ErrorAction};
@@@ -35,7 -36,7 +36,7 @@@ use util::errors::APIError
  use util::ser::{Writeable, ReadableArgs};
  use util::config::UserConfig;
  
 -use bitcoin::hash_types::{Txid, BlockHash};
 +use bitcoin::hash_types::BlockHash;
  use bitcoin::blockdata::block::{Block, BlockHeader};
  use bitcoin::blockdata::script::Builder;
  use bitcoin::blockdata::opcodes;
@@@ -2104,7 -2105,7 +2105,7 @@@ fn channel_monitor_network_test() 
  
        // Drop the ChannelMonitor for the previous channel to avoid it broadcasting transactions and
        // confusing us in the following tests.
 -      let chan_3_mon = nodes[3].chain_monitor.chain_monitor.monitors.write().unwrap().remove(&OutPoint { txid: chan_3.3.txid(), index: 0 }).unwrap();
 +      let chan_3_mon = nodes[3].chain_monitor.chain_monitor.remove_monitor(&OutPoint { txid: chan_3.3.txid(), index: 0 });
  
        // One pending HTLC to time out:
        let payment_preimage_2 = route_payment(&nodes[3], &vec!(&nodes[4])[..], 3000000).0;
        assert_eq!(nodes[3].node.list_channels().len(), 0);
        assert_eq!(nodes[4].node.list_channels().len(), 0);
  
 -      nodes[3].chain_monitor.chain_monitor.monitors.write().unwrap().insert(OutPoint { txid: chan_3.3.txid(), index: 0 }, chan_3_mon);
 +      nodes[3].chain_monitor.chain_monitor.watch_channel(OutPoint { txid: chan_3.3.txid(), index: 0 }, chan_3_mon).unwrap();
        check_closed_event!(nodes[3], 1, ClosureReason::CommitmentTxConfirmed);
        check_closed_event!(nodes[4], 1, ClosureReason::CommitmentTxConfirmed);
  }
@@@ -3268,7 -3269,8 +3269,7 @@@ fn test_force_close_fail_back() 
  
        // Now check that if we add the preimage to ChannelMonitor it broadcasts our HTLC-Success..
        {
 -              let mut monitors = nodes[2].chain_monitor.chain_monitor.monitors.read().unwrap();
 -              monitors.get(&OutPoint{ txid: Txid::from_slice(&payment_event.commitment_msg.channel_id[..]).unwrap(), index: 0 }).unwrap()
 +              get_monitor!(nodes[2], payment_event.commitment_msg.channel_id)
                        .provide_payment_preimage(&our_payment_hash, &our_payment_preimage, &node_cfgs[2].tx_broadcaster, &node_cfgs[2].fee_estimator, &node_cfgs[2].logger);
        }
        mine_transaction(&nodes[2], &tx);
@@@ -3620,12 -3622,10 +3621,12 @@@ fn test_funding_peer_disconnect() 
  
        confirm_transaction(&nodes[0], &tx);
        let events_1 = nodes[0].node.get_and_clear_pending_msg_events();
 +      let chan_id;
        assert_eq!(events_1.len(), 1);
        match events_1[0] {
 -              MessageSendEvent::SendFundingLocked { ref node_id, msg: _ } => {
 +              MessageSendEvent::SendFundingLocked { ref node_id, ref msg } => {
                        assert_eq!(*node_id, nodes[1].node.get_our_node_id());
 +                      chan_id = msg.channel_id;
                },
                _ => panic!("Unexpected event"),
        }
  
        let nodes_0_serialized = nodes[0].node.encode();
        let mut chan_0_monitor_serialized = test_utils::TestVecWriter(Vec::new());
 -      nodes[0].chain_monitor.chain_monitor.monitors.read().unwrap().iter().next().unwrap().1.write(&mut chan_0_monitor_serialized).unwrap();
 +      get_monitor!(nodes[0], chan_id).write(&mut chan_0_monitor_serialized).unwrap();
  
        persister = test_utils::TestPersister::new();
        let keys_manager = &chanmon_cfgs[0].keys_manager;
@@@ -4041,8 -4041,7 +4042,8 @@@ fn test_no_txn_manager_serialize_deseri
  
        let nodes_0_serialized = nodes[0].node.encode();
        let mut chan_0_monitor_serialized = test_utils::TestVecWriter(Vec::new());
 -      nodes[0].chain_monitor.chain_monitor.monitors.read().unwrap().iter().next().unwrap().1.write(&mut chan_0_monitor_serialized).unwrap();
 +      get_monitor!(nodes[0], OutPoint { txid: tx.txid(), index: 0 }.to_channel_id())
 +              .write(&mut chan_0_monitor_serialized).unwrap();
  
        logger = test_utils::TestLogger::new();
        fee_estimator = test_utils::TestFeeEstimator { sat_per_kw: Mutex::new(253) };
@@@ -4122,7 -4121,7 +4123,7 @@@ fn test_dup_htlc_onchain_fails_on_reloa
        let nodes_0_deserialized: ChannelManager<EnforcingSigner, &test_utils::TestChainMonitor, &test_utils::TestBroadcaster, &test_utils::TestKeysInterface, &test_utils::TestFeeEstimator, &test_utils::TestLogger>;
        let mut nodes = create_network(2, &node_cfgs, &node_chanmgrs);
  
 -      create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::known(), InitFeatures::known());
 +      let chan_id = create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::known(), InitFeatures::known()).2;
  
        // Route a payment, but force-close the channel before the HTLC fulfill message arrives at
        // nodes[0].
        // fairly normal behavior as ChannelMonitor(s) are often not re-serialized when on-chain events
        // happen, unlike ChannelManager which tends to be re-serialized after any relevant event(s).
        let mut chan_0_monitor_serialized = test_utils::TestVecWriter(Vec::new());
 -      nodes[0].chain_monitor.chain_monitor.monitors.read().unwrap().iter().next().unwrap().1.write(&mut chan_0_monitor_serialized).unwrap();
 +      get_monitor!(nodes[0], chan_id).write(&mut chan_0_monitor_serialized).unwrap();
  
        header.prev_blockhash = nodes[0].best_block_hash();
        let claim_block = Block { header, txdata: claim_txn};
@@@ -4245,8 -4244,7 +4246,8 @@@ fn test_manager_serialize_deserialize_e
                added_monitors.clear();
        }
  
 -      node_a.node.handle_funding_signed(&node_b.node.get_our_node_id(), &get_event_msg!(node_b, MessageSendEvent::SendFundingSigned, node_a.node.get_our_node_id()));
 +      let bs_funding_signed = get_event_msg!(node_b, MessageSendEvent::SendFundingSigned, node_a.node.get_our_node_id());
 +      node_a.node.handle_funding_signed(&node_b.node.get_our_node_id(), &bs_funding_signed);
        {
                let mut added_monitors = node_a.chain_monitor.added_monitors.lock().unwrap();
                assert_eq!(added_monitors.len(), 1);
        // Start the de/seriailization process mid-channel creation to check that the channel manager will hold onto events that are serialized
        let nodes_0_serialized = nodes[0].node.encode();
        let mut chan_0_monitor_serialized = test_utils::TestVecWriter(Vec::new());
 -      nodes[0].chain_monitor.chain_monitor.monitors.read().unwrap().iter().next().unwrap().1.write(&mut chan_0_monitor_serialized).unwrap();
 +      get_monitor!(nodes[0], bs_funding_signed.channel_id).write(&mut chan_0_monitor_serialized).unwrap();
  
        fee_estimator = test_utils::TestFeeEstimator { sat_per_kw: Mutex::new(253) };
        logger = test_utils::TestLogger::new();
@@@ -4339,7 -4337,7 +4340,7 @@@ fn test_simple_manager_serialize_deseri
        let new_chain_monitor: test_utils::TestChainMonitor;
        let nodes_0_deserialized: ChannelManager<EnforcingSigner, &test_utils::TestChainMonitor, &test_utils::TestBroadcaster, &test_utils::TestKeysInterface, &test_utils::TestFeeEstimator, &test_utils::TestLogger>;
        let mut nodes = create_network(2, &node_cfgs, &node_chanmgrs);
 -      create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::known(), InitFeatures::known());
 +      let chan_id = create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::known(), InitFeatures::known()).2;
  
        let (our_payment_preimage, _, _) = route_payment(&nodes[0], &[&nodes[1]], 1000000);
        let (_, our_payment_hash, _) = route_payment(&nodes[0], &[&nodes[1]], 1000000);
  
        let nodes_0_serialized = nodes[0].node.encode();
        let mut chan_0_monitor_serialized = test_utils::TestVecWriter(Vec::new());
 -      nodes[0].chain_monitor.chain_monitor.monitors.read().unwrap().iter().next().unwrap().1.write(&mut chan_0_monitor_serialized).unwrap();
 +      get_monitor!(nodes[0], chan_id).write(&mut chan_0_monitor_serialized).unwrap();
  
        logger = test_utils::TestLogger::new();
        fee_estimator = test_utils::TestFeeEstimator { sat_per_kw: Mutex::new(253) };
@@@ -4400,14 -4398,14 +4401,14 @@@ fn test_manager_serialize_deserialize_i
        let new_chain_monitor: test_utils::TestChainMonitor;
        let nodes_0_deserialized: ChannelManager<EnforcingSigner, &test_utils::TestChainMonitor, &test_utils::TestBroadcaster, &test_utils::TestKeysInterface, &test_utils::TestFeeEstimator, &test_utils::TestLogger>;
        let mut nodes = create_network(4, &node_cfgs, &node_chanmgrs);
 -      create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::known(), InitFeatures::known());
 -      create_announced_chan_between_nodes(&nodes, 2, 0, InitFeatures::known(), InitFeatures::known());
 +      let chan_id_1 = create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::known(), InitFeatures::known()).2;
 +      let chan_id_2 = create_announced_chan_between_nodes(&nodes, 2, 0, InitFeatures::known(), InitFeatures::known()).2;
        let (_, _, channel_id, funding_tx) = create_announced_chan_between_nodes(&nodes, 0, 3, InitFeatures::known(), InitFeatures::known());
  
        let mut node_0_stale_monitors_serialized = Vec::new();
 -      for monitor in nodes[0].chain_monitor.chain_monitor.monitors.read().unwrap().iter() {
 +      for chan_id_iter in &[chan_id_1, chan_id_2, channel_id] {
                let mut writer = test_utils::TestVecWriter(Vec::new());
 -              monitor.1.write(&mut writer).unwrap();
 +              get_monitor!(nodes[0], chan_id_iter).write(&mut writer).unwrap();
                node_0_stale_monitors_serialized.push(writer.0);
        }
  
        // Now the ChannelMonitor (which is now out-of-sync with ChannelManager for channel w/
        // nodes[3])
        let mut node_0_monitors_serialized = Vec::new();
 -      for monitor in nodes[0].chain_monitor.chain_monitor.monitors.read().unwrap().iter() {
 +      for chan_id_iter in &[chan_id_1, chan_id_2, channel_id] {
                let mut writer = test_utils::TestVecWriter(Vec::new());
 -              monitor.1.write(&mut writer).unwrap();
 +              get_monitor!(nodes[0], chan_id_iter).write(&mut writer).unwrap();
                node_0_monitors_serialized.push(writer.0);
        }
  
@@@ -7166,7 -7164,7 +7167,7 @@@ fn test_data_loss_protect() 
        // Cache node A state before any channel update
        let previous_node_state = nodes[0].node.encode();
        let mut previous_chain_monitor_state = test_utils::TestVecWriter(Vec::new());
 -      nodes[0].chain_monitor.chain_monitor.monitors.read().unwrap().iter().next().unwrap().1.write(&mut previous_chain_monitor_state).unwrap();
 +      get_monitor!(nodes[0], chan.2).write(&mut previous_chain_monitor_state).unwrap();
  
        send_payment(&nodes[0], &vec!(&nodes[1])[..], 8000000);
        send_payment(&nodes[0], &vec!(&nodes[1])[..], 8000000);
@@@ -7267,7 -7265,8 +7268,8 @@@ fn test_check_htlc_underpaying() 
        // Create some initial channels
        create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::known(), InitFeatures::known());
  
-       let route = get_route(&nodes[0].node.get_our_node_id(), &nodes[0].net_graph_msg_handler.network_graph, &nodes[1].node.get_our_node_id(), Some(InvoiceFeatures::known()), None, &Vec::new(), 10_000, TEST_FINAL_CLTV, nodes[0].logger).unwrap();
+       let scorer = Scorer::new(0);
+       let route = get_route(&nodes[0].node.get_our_node_id(), &nodes[0].net_graph_msg_handler.network_graph, &nodes[1].node.get_our_node_id(), Some(InvoiceFeatures::known()), None, &Vec::new(), 10_000, TEST_FINAL_CLTV, nodes[0].logger, &scorer).unwrap();
        let (_, our_payment_hash, _) = get_payment_preimage_hash!(nodes[0]);
        let our_payment_secret = nodes[1].node.create_inbound_payment_for_hash(our_payment_hash, Some(100_000), 7200, 0).unwrap();
        nodes[0].node.send_payment(&route, our_payment_hash, &Some(our_payment_secret)).unwrap();
@@@ -7407,7 -7406,7 +7409,7 @@@ fn test_priv_forwarding_rejection() 
        let nodes_1_deserialized: ChannelManager<EnforcingSigner, &test_utils::TestChainMonitor, &test_utils::TestBroadcaster, &test_utils::TestKeysInterface, &test_utils::TestFeeEstimator, &test_utils::TestLogger>;
        let mut nodes = create_network(3, &node_cfgs, &node_chanmgrs);
  
 -      create_announced_chan_between_nodes_with_value(&nodes, 0, 1, 1_000_000, 500_000_000, InitFeatures::known(), InitFeatures::known());
 +      let chan_id_1 = create_announced_chan_between_nodes_with_value(&nodes, 0, 1, 1_000_000, 500_000_000, InitFeatures::known(), InitFeatures::known()).2;
  
        // Note that the create_*_chan functions in utils requires announcement_signatures, which we do
        // not send for private channels.
        nodes[2].node.handle_funding_created(&nodes[1].node.get_our_node_id(), &get_event_msg!(nodes[1], MessageSendEvent::SendFundingCreated, nodes[2].node.get_our_node_id()));
        check_added_monitors!(nodes[2], 1);
  
 -      nodes[1].node.handle_funding_signed(&nodes[2].node.get_our_node_id(), &get_event_msg!(nodes[2], MessageSendEvent::SendFundingSigned, nodes[1].node.get_our_node_id()));
 +      let cs_funding_signed = get_event_msg!(nodes[2], MessageSendEvent::SendFundingSigned, nodes[1].node.get_our_node_id());
 +      nodes[1].node.handle_funding_signed(&nodes[2].node.get_our_node_id(), &cs_funding_signed);
        check_added_monitors!(nodes[1], 1);
  
        let conf_height = core::cmp::max(nodes[1].best_block_info().1 + 1, nodes[2].best_block_info().1 + 1);
        let nodes_1_serialized = nodes[1].node.encode();
        let mut monitor_a_serialized = test_utils::TestVecWriter(Vec::new());
        let mut monitor_b_serialized = test_utils::TestVecWriter(Vec::new());
 -      {
 -              let mons = nodes[1].chain_monitor.chain_monitor.monitors.read().unwrap();
 -              let mut mon_iter = mons.iter();
 -              mon_iter.next().unwrap().1.write(&mut monitor_a_serialized).unwrap();
 -              mon_iter.next().unwrap().1.write(&mut monitor_b_serialized).unwrap();
 -      }
 +      get_monitor!(nodes[1], chan_id_1).write(&mut monitor_a_serialized).unwrap();
 +      get_monitor!(nodes[1], cs_funding_signed.channel_id).write(&mut monitor_b_serialized).unwrap();
  
        persister = test_utils::TestPersister::new();
        let keys_manager = &chanmon_cfgs[1].keys_manager;
@@@ -7664,11 -7666,12 +7666,12 @@@ fn test_bump_penalty_txn_on_revoked_htl
  
        let chan = create_announced_chan_between_nodes_with_value(&nodes, 0, 1, 1000000, 59000000, InitFeatures::known(), InitFeatures::known());
        // Lock HTLC in both directions (using a slightly lower CLTV delay to provide timely RBF bumps)
+       let scorer = Scorer::new(0);
        let route = get_route(&nodes[0].node.get_our_node_id(), &nodes[0].net_graph_msg_handler.network_graph,
-               &nodes[1].node.get_our_node_id(), Some(InvoiceFeatures::known()), None, &Vec::new(), 3_000_000, 50, nodes[0].logger).unwrap();
+               &nodes[1].node.get_our_node_id(), Some(InvoiceFeatures::known()), None, &Vec::new(), 3_000_000, 50, nodes[0].logger, &scorer).unwrap();
        let payment_preimage = send_along_route(&nodes[0], route, &[&nodes[1]], 3_000_000).0;
        let route = get_route(&nodes[1].node.get_our_node_id(), &nodes[1].net_graph_msg_handler.network_graph,
-               &nodes[0].node.get_our_node_id(), Some(InvoiceFeatures::known()), None, &Vec::new(), 3_000_000, 50, nodes[0].logger).unwrap();
+               &nodes[0].node.get_our_node_id(), Some(InvoiceFeatures::known()), None, &Vec::new(), 3_000_000, 50, nodes[0].logger, &scorer).unwrap();
        send_along_route(&nodes[1], route, &[&nodes[0]], 3_000_000);
  
        let revoked_local_txn = get_local_commitment_txn!(nodes[1], chan.2);
@@@ -8004,9 -8007,11 +8007,9 @@@ fn test_bump_txn_sanitize_tracking_maps
        connect_block(&nodes[0], &Block { header: header_130, txdata: penalty_txn });
        connect_blocks(&nodes[0], ANTI_REORG_DELAY - 1);
        {
 -              let monitors = nodes[0].chain_monitor.chain_monitor.monitors.read().unwrap();
 -              if let Some(monitor) = monitors.get(&OutPoint { txid: chan.3.txid(), index: 0 }) {
 -                      assert!(monitor.inner.lock().unwrap().onchain_tx_handler.pending_claim_requests.is_empty());
 -                      assert!(monitor.inner.lock().unwrap().onchain_tx_handler.claimable_outpoints.is_empty());
 -              }
 +              let monitor = nodes[0].chain_monitor.chain_monitor.get_monitor(OutPoint { txid: chan.3.txid(), index: 0 }).unwrap();
 +              assert!(monitor.inner.lock().unwrap().onchain_tx_handler.pending_claim_requests.is_empty());
 +              assert!(monitor.inner.lock().unwrap().onchain_tx_handler.claimable_outpoints.is_empty());
        }
  }
  
@@@ -8271,7 -8276,8 +8274,7 @@@ fn test_update_err_monitor_lockdown() 
        let logger = test_utils::TestLogger::with_id(format!("node {}", 0));
        let persister = test_utils::TestPersister::new();
        let watchtower = {
 -              let monitors = nodes[0].chain_monitor.chain_monitor.monitors.read().unwrap();
 -              let monitor = monitors.get(&outpoint).unwrap();
 +              let monitor = nodes[0].chain_monitor.chain_monitor.get_monitor(outpoint).unwrap();
                let mut w = test_utils::TestVecWriter(Vec::new());
                monitor.write(&mut w).unwrap();
                let new_monitor = <(BlockHash, channelmonitor::ChannelMonitor<EnforcingSigner>)>::read(
@@@ -8332,7 -8338,8 +8335,7 @@@ fn test_concurrent_monitor_claim() 
        let logger = test_utils::TestLogger::with_id(format!("node {}", "Alice"));
        let persister = test_utils::TestPersister::new();
        let watchtower_alice = {
 -              let monitors = nodes[0].chain_monitor.chain_monitor.monitors.read().unwrap();
 -              let monitor = monitors.get(&outpoint).unwrap();
 +              let monitor = nodes[0].chain_monitor.chain_monitor.get_monitor(outpoint).unwrap();
                let mut w = test_utils::TestVecWriter(Vec::new());
                monitor.write(&mut w).unwrap();
                let new_monitor = <(BlockHash, channelmonitor::ChannelMonitor<EnforcingSigner>)>::read(
        let logger = test_utils::TestLogger::with_id(format!("node {}", "Bob"));
        let persister = test_utils::TestPersister::new();
        let watchtower_bob = {
 -              let monitors = nodes[0].chain_monitor.chain_monitor.monitors.read().unwrap();
 -              let monitor = monitors.get(&outpoint).unwrap();
 +              let monitor = nodes[0].chain_monitor.chain_monitor.get_monitor(outpoint).unwrap();
                let mut w = test_utils::TestVecWriter(Vec::new());
                monitor.write(&mut w).unwrap();
                let new_monitor = <(BlockHash, channelmonitor::ChannelMonitor<EnforcingSigner>)>::read(
@@@ -9045,8 -9053,8 +9048,8 @@@ fn test_forwardable_regen() 
        let new_chain_monitor: test_utils::TestChainMonitor;
        let nodes_1_deserialized: ChannelManager<EnforcingSigner, &test_utils::TestChainMonitor, &test_utils::TestBroadcaster, &test_utils::TestKeysInterface, &test_utils::TestFeeEstimator, &test_utils::TestLogger>;
        let mut nodes = create_network(3, &node_cfgs, &node_chanmgrs);
 -      create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::known(), InitFeatures::known());
 -      create_announced_chan_between_nodes(&nodes, 1, 2, InitFeatures::known(), InitFeatures::known());
 +      let chan_id_1 = create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::known(), InitFeatures::known()).2;
 +      let chan_id_2 = create_announced_chan_between_nodes(&nodes, 1, 2, InitFeatures::known(), InitFeatures::known()).2;
  
        // First send a payment to nodes[1]
        let (route, payment_hash, payment_preimage, payment_secret) = get_route_and_payment_hash!(nodes[0], nodes[1], 100_000);
        let nodes_1_serialized = nodes[1].node.encode();
        let mut chan_0_monitor_serialized = test_utils::TestVecWriter(Vec::new());
        let mut chan_1_monitor_serialized = test_utils::TestVecWriter(Vec::new());
 -      {
 -              let monitors = nodes[1].chain_monitor.chain_monitor.monitors.read().unwrap();
 -              let mut monitor_iter = monitors.iter();
 -              monitor_iter.next().unwrap().1.write(&mut chan_0_monitor_serialized).unwrap();
 -              monitor_iter.next().unwrap().1.write(&mut chan_1_monitor_serialized).unwrap();
 -      }
 +      get_monitor!(nodes[1], chan_id_1).write(&mut chan_0_monitor_serialized).unwrap();
 +      get_monitor!(nodes[1], chan_id_2).write(&mut chan_1_monitor_serialized).unwrap();
  
        persister = test_utils::TestPersister::new();
        let keys_manager = &chanmon_cfgs[1].keys_manager;
@@@ -9157,8 -9169,9 +9160,9 @@@ fn test_keysend_payments_to_public_node
        let network_graph = &nodes[0].net_graph_msg_handler.network_graph;
        let payer_pubkey = nodes[0].node.get_our_node_id();
        let payee_pubkey = nodes[1].node.get_our_node_id();
+       let scorer = Scorer::new(0);
        let route = get_keysend_route(
-               &payer_pubkey, &network_graph, &payee_pubkey, None, &vec![], 10000, 40, nodes[0].logger
+               &payer_pubkey, &network_graph, &payee_pubkey, None, &vec![], 10000, 40, nodes[0].logger, &scorer
        ).unwrap();
  
        let test_preimage = PaymentPreimage([42; 32]);
@@@ -9187,9 -9200,10 +9191,10 @@@ fn test_keysend_payments_to_private_nod
        let _chan = create_chan_between_nodes(&nodes[0], &nodes[1], InitFeatures::known(), InitFeatures::known());
        let network_graph = &nodes[0].net_graph_msg_handler.network_graph;
        let first_hops = nodes[0].node.list_usable_channels();
+       let scorer = Scorer::new(0);
        let route = get_keysend_route(
                &payer_pubkey, &network_graph, &payee_pubkey, Some(&first_hops.iter().collect::<Vec<_>>()),
-               &vec![], 10000, 40, nodes[0].logger
+               &vec![], 10000, 40, nodes[0].logger, &scorer
        ).unwrap();
  
        let test_preimage = PaymentPreimage([42; 32]);