mirror of
https://github.com/lightningdevkit/rust-lightning.git
synced 2025-02-24 15:02:20 +01:00
Merge pull request #1812 from valentinewallace/2022-10-chanman-router-param
Parameterize `ChannelManager` by a `Router`
This commit is contained in:
commit
b79ff71fe7
20 changed files with 393 additions and 222 deletions
|
@ -38,9 +38,9 @@ use lightning::chain::transaction::OutPoint;
|
|||
use lightning::chain::chaininterface::{BroadcasterInterface, ConfirmationTarget, FeeEstimator};
|
||||
use lightning::chain::keysinterface::{KeyMaterial, KeysInterface, InMemorySigner, Recipient, EntropySource, NodeSigner, SignerProvider};
|
||||
use lightning::ln::{PaymentHash, PaymentPreimage, PaymentSecret};
|
||||
use lightning::ln::channelmanager::{self, ChainParameters, ChannelManager, PaymentSendFailure, ChannelManagerReadArgs, PaymentId};
|
||||
use lightning::ln::channelmanager::{self, ChainParameters, ChannelDetails, ChannelManager, PaymentSendFailure, ChannelManagerReadArgs, PaymentId};
|
||||
use lightning::ln::channel::FEE_SPIKE_BUFFER_FEE_INCREASE_MULTIPLE;
|
||||
use lightning::ln::msgs::{CommitmentUpdate, ChannelMessageHandler, DecodeError, UpdateAddHTLC, Init};
|
||||
use lightning::ln::msgs::{self, CommitmentUpdate, ChannelMessageHandler, DecodeError, UpdateAddHTLC, Init};
|
||||
use lightning::ln::script::ShutdownScript;
|
||||
use lightning::util::enforcing_trait_impls::{EnforcingSigner, EnforcementState};
|
||||
use lightning::util::errors::APIError;
|
||||
|
@ -49,7 +49,7 @@ use lightning::util::logger::Logger;
|
|||
use lightning::util::config::UserConfig;
|
||||
use lightning::util::events::MessageSendEventsProvider;
|
||||
use lightning::util::ser::{Readable, ReadableArgs, Writeable, Writer};
|
||||
use lightning::routing::router::{Route, RouteHop};
|
||||
use lightning::routing::router::{InFlightHtlcs, Route, RouteHop, RouteParameters, Router};
|
||||
|
||||
use crate::utils::test_logger::{self, Output};
|
||||
use crate::utils::test_persister::TestPersister;
|
||||
|
@ -85,6 +85,24 @@ impl FeeEstimator for FuzzEstimator {
|
|||
}
|
||||
}
|
||||
|
||||
struct FuzzRouter {}
|
||||
|
||||
impl Router for FuzzRouter {
|
||||
fn find_route(
|
||||
&self, _payer: &PublicKey, _params: &RouteParameters, _first_hops: Option<&[&ChannelDetails]>,
|
||||
_inflight_htlcs: &InFlightHtlcs
|
||||
) -> Result<Route, msgs::LightningError> {
|
||||
Err(msgs::LightningError {
|
||||
err: String::from("Not implemented"),
|
||||
action: msgs::ErrorAction::IgnoreError
|
||||
})
|
||||
}
|
||||
fn notify_payment_path_failed(&self, _path: &[&RouteHop], _short_channel_id: u64) {}
|
||||
fn notify_payment_path_successful(&self, _path: &[&RouteHop]) {}
|
||||
fn notify_payment_probe_successful(&self, _path: &[&RouteHop]) {}
|
||||
fn notify_payment_probe_failed(&self, _path: &[&RouteHop], _short_channel_id: u64) {}
|
||||
}
|
||||
|
||||
pub struct TestBroadcaster {}
|
||||
impl BroadcasterInterface for TestBroadcaster {
|
||||
fn broadcast_transaction(&self, _tx: &Transaction) { }
|
||||
|
@ -310,7 +328,7 @@ fn check_payment_err(send_err: PaymentSendFailure) {
|
|||
}
|
||||
}
|
||||
|
||||
type ChanMan = ChannelManager<Arc<TestChainMonitor>, Arc<TestBroadcaster>, Arc<KeyProvider>, Arc<FuzzEstimator>, Arc<dyn Logger>>;
|
||||
type ChanMan<'a> = ChannelManager<Arc<TestChainMonitor>, Arc<TestBroadcaster>, Arc<KeyProvider>, Arc<FuzzEstimator>, &'a FuzzRouter, Arc<dyn Logger>>;
|
||||
|
||||
#[inline]
|
||||
fn get_payment_secret_hash(dest: &ChanMan, payment_id: &mut u8) -> Option<(PaymentSecret, PaymentHash)> {
|
||||
|
@ -381,6 +399,7 @@ fn send_hop_payment(source: &ChanMan, middle: &ChanMan, middle_chan_id: u64, des
|
|||
pub fn do_test<Out: Output>(data: &[u8], underlying_out: Out) {
|
||||
let out = SearchingOutput::new(underlying_out);
|
||||
let broadcast = Arc::new(TestBroadcaster{});
|
||||
let router = FuzzRouter {};
|
||||
|
||||
macro_rules! make_node {
|
||||
($node_id: expr, $fee_estimator: expr) => { {
|
||||
|
@ -399,7 +418,7 @@ pub fn do_test<Out: Output>(data: &[u8], underlying_out: Out) {
|
|||
network,
|
||||
best_block: BestBlock::from_genesis(network),
|
||||
};
|
||||
(ChannelManager::new($fee_estimator.clone(), monitor.clone(), broadcast.clone(), Arc::clone(&logger), keys_manager.clone(), config, params),
|
||||
(ChannelManager::new($fee_estimator.clone(), monitor.clone(), broadcast.clone(), &router, Arc::clone(&logger), keys_manager.clone(), config, params),
|
||||
monitor, keys_manager)
|
||||
} }
|
||||
}
|
||||
|
@ -433,6 +452,7 @@ pub fn do_test<Out: Output>(data: &[u8], underlying_out: Out) {
|
|||
fee_estimator: $fee_estimator.clone(),
|
||||
chain_monitor: chain_monitor.clone(),
|
||||
tx_broadcaster: broadcast.clone(),
|
||||
router: &router,
|
||||
logger,
|
||||
default_config: config,
|
||||
channel_monitors: monitor_refs,
|
||||
|
|
|
@ -35,12 +35,12 @@ use lightning::chain::chainmonitor;
|
|||
use lightning::chain::transaction::OutPoint;
|
||||
use lightning::chain::keysinterface::{InMemorySigner, Recipient, KeyMaterial, KeysInterface, EntropySource, NodeSigner, SignerProvider};
|
||||
use lightning::ln::{PaymentHash, PaymentPreimage, PaymentSecret};
|
||||
use lightning::ln::channelmanager::{ChainParameters, ChannelManager, PaymentId};
|
||||
use lightning::ln::channelmanager::{ChainParameters, ChannelDetails, ChannelManager, PaymentId};
|
||||
use lightning::ln::peer_handler::{MessageHandler,PeerManager,SocketDescriptor,IgnoringMessageHandler};
|
||||
use lightning::ln::msgs::DecodeError;
|
||||
use lightning::ln::msgs::{self, DecodeError};
|
||||
use lightning::ln::script::ShutdownScript;
|
||||
use lightning::routing::gossip::{P2PGossipSync, NetworkGraph};
|
||||
use lightning::routing::router::{find_route, PaymentParameters, RouteParameters};
|
||||
use lightning::routing::router::{find_route, InFlightHtlcs, PaymentParameters, Route, RouteHop, RouteParameters, Router};
|
||||
use lightning::routing::scoring::FixedPenaltyScorer;
|
||||
use lightning::util::config::UserConfig;
|
||||
use lightning::util::errors::APIError;
|
||||
|
@ -127,6 +127,24 @@ impl FeeEstimator for FuzzEstimator {
|
|||
}
|
||||
}
|
||||
|
||||
struct FuzzRouter {}
|
||||
|
||||
impl Router for FuzzRouter {
|
||||
fn find_route(
|
||||
&self, _payer: &PublicKey, _params: &RouteParameters, _first_hops: Option<&[&ChannelDetails]>,
|
||||
_inflight_htlcs: &InFlightHtlcs
|
||||
) -> Result<Route, msgs::LightningError> {
|
||||
Err(msgs::LightningError {
|
||||
err: String::from("Not implemented"),
|
||||
action: msgs::ErrorAction::IgnoreError
|
||||
})
|
||||
}
|
||||
fn notify_payment_path_failed(&self, _path: &[&RouteHop], _short_channel_id: u64) {}
|
||||
fn notify_payment_path_successful(&self, _path: &[&RouteHop]) {}
|
||||
fn notify_payment_probe_successful(&self, _path: &[&RouteHop]) {}
|
||||
fn notify_payment_probe_failed(&self, _path: &[&RouteHop], _short_channel_id: u64) {}
|
||||
}
|
||||
|
||||
struct TestBroadcaster {
|
||||
txn_broadcasted: Mutex<Vec<Transaction>>,
|
||||
}
|
||||
|
@ -162,13 +180,13 @@ impl<'a> std::hash::Hash for Peer<'a> {
|
|||
}
|
||||
}
|
||||
|
||||
type ChannelMan = ChannelManager<
|
||||
type ChannelMan<'a> = ChannelManager<
|
||||
Arc<chainmonitor::ChainMonitor<EnforcingSigner, Arc<dyn chain::Filter>, Arc<TestBroadcaster>, Arc<FuzzEstimator>, Arc<dyn Logger>, Arc<TestPersister>>>,
|
||||
Arc<TestBroadcaster>, Arc<KeyProvider>, Arc<FuzzEstimator>, Arc<dyn Logger>>;
|
||||
type PeerMan<'a> = PeerManager<Peer<'a>, Arc<ChannelMan>, Arc<P2PGossipSync<Arc<NetworkGraph<Arc<dyn Logger>>>, Arc<dyn chain::Access>, Arc<dyn Logger>>>, IgnoringMessageHandler, Arc<dyn Logger>, IgnoringMessageHandler>;
|
||||
Arc<TestBroadcaster>, Arc<KeyProvider>, Arc<FuzzEstimator>, &'a FuzzRouter, Arc<dyn Logger>>;
|
||||
type PeerMan<'a> = PeerManager<Peer<'a>, Arc<ChannelMan<'a>>, Arc<P2PGossipSync<Arc<NetworkGraph<Arc<dyn Logger>>>, Arc<dyn chain::Access>, Arc<dyn Logger>>>, IgnoringMessageHandler, Arc<dyn Logger>, IgnoringMessageHandler>;
|
||||
|
||||
struct MoneyLossDetector<'a> {
|
||||
manager: Arc<ChannelMan>,
|
||||
manager: Arc<ChannelMan<'a>>,
|
||||
monitor: Arc<chainmonitor::ChainMonitor<EnforcingSigner, Arc<dyn chain::Filter>, Arc<TestBroadcaster>, Arc<FuzzEstimator>, Arc<dyn Logger>, Arc<TestPersister>>>,
|
||||
handler: PeerMan<'a>,
|
||||
|
||||
|
@ -182,7 +200,7 @@ struct MoneyLossDetector<'a> {
|
|||
}
|
||||
impl<'a> MoneyLossDetector<'a> {
|
||||
pub fn new(peers: &'a RefCell<[bool; 256]>,
|
||||
manager: Arc<ChannelMan>,
|
||||
manager: Arc<ChannelMan<'a>>,
|
||||
monitor: Arc<chainmonitor::ChainMonitor<EnforcingSigner, Arc<dyn chain::Filter>, Arc<TestBroadcaster>, Arc<FuzzEstimator>, Arc<dyn Logger>, Arc<TestPersister>>>,
|
||||
handler: PeerMan<'a>) -> Self {
|
||||
MoneyLossDetector {
|
||||
|
@ -380,6 +398,7 @@ pub fn do_test(data: &[u8], logger: &Arc<dyn Logger>) {
|
|||
let fee_est = Arc::new(FuzzEstimator {
|
||||
input: input.clone(),
|
||||
});
|
||||
let router = FuzzRouter {};
|
||||
|
||||
macro_rules! get_slice {
|
||||
($len: expr) => {
|
||||
|
@ -424,7 +443,7 @@ pub fn do_test(data: &[u8], logger: &Arc<dyn Logger>) {
|
|||
network,
|
||||
best_block: BestBlock::from_genesis(network),
|
||||
};
|
||||
let channelmanager = Arc::new(ChannelManager::new(fee_est.clone(), monitor.clone(), broadcast.clone(), Arc::clone(&logger), 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(), config, params));
|
||||
// Adding new calls to `KeysInterface::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.
|
||||
|
|
|
@ -22,6 +22,7 @@ use lightning::ln::channelmanager::ChannelManager;
|
|||
use lightning::ln::msgs::{ChannelMessageHandler, OnionMessageHandler, RoutingMessageHandler};
|
||||
use lightning::ln::peer_handler::{CustomMessageHandler, PeerManager, SocketDescriptor};
|
||||
use lightning::routing::gossip::{NetworkGraph, P2PGossipSync};
|
||||
use lightning::routing::router::Router;
|
||||
use lightning::routing::scoring::WriteableScore;
|
||||
use lightning::util::events::{Event, EventHandler, EventsProvider};
|
||||
use lightning::util::logger::Logger;
|
||||
|
@ -342,6 +343,7 @@ pub async fn process_events_async<
|
|||
T: 'static + Deref + Send + Sync,
|
||||
K: 'static + Deref + Send + Sync,
|
||||
F: 'static + Deref + Send + Sync,
|
||||
R: 'static + Deref + Send + Sync,
|
||||
G: 'static + Deref<Target = NetworkGraph<L>> + Send + Sync,
|
||||
L: 'static + Deref + Send + Sync,
|
||||
P: 'static + Deref + Send + Sync,
|
||||
|
@ -353,7 +355,7 @@ pub async fn process_events_async<
|
|||
EventHandler: Fn(Event) -> EventHandlerFuture,
|
||||
PS: 'static + Deref + Send,
|
||||
M: 'static + Deref<Target = ChainMonitor<<K::Target as SignerProvider>::Signer, CF, T, F, L, P>> + Send + Sync,
|
||||
CM: 'static + Deref<Target = ChannelManager<CW, T, K, F, L>> + Send + Sync,
|
||||
CM: 'static + Deref<Target = ChannelManager<CW, T, K, F, R, L>> + Send + Sync,
|
||||
PGS: 'static + Deref<Target = P2PGossipSync<G, CA, L>> + Send + Sync,
|
||||
RGS: 'static + Deref<Target = RapidGossipSync<G, L>> + Send,
|
||||
UMH: 'static + Deref + Send + Sync,
|
||||
|
@ -374,13 +376,14 @@ where
|
|||
T::Target: 'static + BroadcasterInterface,
|
||||
K::Target: 'static + KeysInterface,
|
||||
F::Target: 'static + FeeEstimator,
|
||||
R::Target: 'static + Router,
|
||||
L::Target: 'static + Logger,
|
||||
P::Target: 'static + Persist<<K::Target as SignerProvider>::Signer>,
|
||||
CMH::Target: 'static + ChannelMessageHandler,
|
||||
OMH::Target: 'static + OnionMessageHandler,
|
||||
RMH::Target: 'static + RoutingMessageHandler,
|
||||
UMH::Target: 'static + CustomMessageHandler,
|
||||
PS::Target: 'static + Persister<'a, CW, T, K, F, L, SC>,
|
||||
PS::Target: 'static + Persister<'a, CW, T, K, F, R, L, SC>,
|
||||
{
|
||||
let mut should_break = true;
|
||||
let async_event_handler = |event| {
|
||||
|
@ -460,6 +463,7 @@ impl BackgroundProcessor {
|
|||
T: 'static + Deref + Send + Sync,
|
||||
K: 'static + Deref + Send + Sync,
|
||||
F: 'static + Deref + Send + Sync,
|
||||
R: 'static + Deref + Send + Sync,
|
||||
G: 'static + Deref<Target = NetworkGraph<L>> + Send + Sync,
|
||||
L: 'static + Deref + Send + Sync,
|
||||
P: 'static + Deref + Send + Sync,
|
||||
|
@ -470,7 +474,7 @@ impl BackgroundProcessor {
|
|||
EH: 'static + EventHandler + Send,
|
||||
PS: 'static + Deref + Send,
|
||||
M: 'static + Deref<Target = ChainMonitor<<K::Target as SignerProvider>::Signer, CF, T, F, L, P>> + Send + Sync,
|
||||
CM: 'static + Deref<Target = ChannelManager<CW, T, K, F, L>> + Send + Sync,
|
||||
CM: 'static + Deref<Target = ChannelManager<CW, T, K, F, R, L>> + Send + Sync,
|
||||
PGS: 'static + Deref<Target = P2PGossipSync<G, CA, L>> + Send + Sync,
|
||||
RGS: 'static + Deref<Target = RapidGossipSync<G, L>> + Send,
|
||||
UMH: 'static + Deref + Send + Sync,
|
||||
|
@ -488,13 +492,14 @@ impl BackgroundProcessor {
|
|||
T::Target: 'static + BroadcasterInterface,
|
||||
K::Target: 'static + KeysInterface,
|
||||
F::Target: 'static + FeeEstimator,
|
||||
R::Target: 'static + Router,
|
||||
L::Target: 'static + Logger,
|
||||
P::Target: 'static + Persist<<K::Target as SignerProvider>::Signer>,
|
||||
CMH::Target: 'static + ChannelMessageHandler,
|
||||
OMH::Target: 'static + OnionMessageHandler,
|
||||
RMH::Target: 'static + RoutingMessageHandler,
|
||||
UMH::Target: 'static + CustomMessageHandler,
|
||||
PS::Target: 'static + Persister<'a, CW, T, K, F, L, SC>,
|
||||
PS::Target: 'static + Persister<'a, CW, T, K, F, R, L, SC>,
|
||||
{
|
||||
let stop_thread = Arc::new(AtomicBool::new(false));
|
||||
let stop_thread_clone = stop_thread.clone();
|
||||
|
@ -579,6 +584,7 @@ mod tests {
|
|||
use lightning::ln::peer_handler::{PeerManager, MessageHandler, SocketDescriptor, IgnoringMessageHandler};
|
||||
use lightning::routing::gossip::{NetworkGraph, P2PGossipSync};
|
||||
use lightning::routing::router::DefaultRouter;
|
||||
use lightning::routing::scoring::{ProbabilisticScoringParameters, ProbabilisticScorer};
|
||||
use lightning::util::config::UserConfig;
|
||||
use lightning::util::events::{Event, MessageSendEventsProvider, MessageSendEvent};
|
||||
use lightning::util::ser::Writeable;
|
||||
|
@ -593,7 +599,6 @@ mod tests {
|
|||
use std::time::Duration;
|
||||
use bitcoin::hashes::Hash;
|
||||
use bitcoin::TxMerkleNode;
|
||||
use lightning::routing::scoring::{FixedPenaltyScorer};
|
||||
use lightning_rapid_gossip_sync::RapidGossipSync;
|
||||
use super::{BackgroundProcessor, GossipSync, FRESHNESS_TIMER};
|
||||
|
||||
|
@ -625,7 +630,7 @@ mod tests {
|
|||
network_graph: Arc<NetworkGraph<Arc<test_utils::TestLogger>>>,
|
||||
logger: Arc<test_utils::TestLogger>,
|
||||
best_block: BestBlock,
|
||||
scorer: Arc<Mutex<FixedPenaltyScorer>>,
|
||||
scorer: Arc<Mutex<ProbabilisticScorer<Arc<NetworkGraph<Arc<test_utils::TestLogger>>>, Arc<test_utils::TestLogger>>>>,
|
||||
}
|
||||
|
||||
impl Node {
|
||||
|
@ -722,24 +727,26 @@ 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 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 params = ProbabilisticScoringParameters::default();
|
||||
let scorer = Arc::new(Mutex::new(ProbabilisticScorer::new(params, network_graph.clone(), logger.clone())));
|
||||
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(), logger.clone(), keys_manager.clone(), UserConfig::default(), params));
|
||||
let network_graph = Arc::new(NetworkGraph::new(genesis_block.header.block_hash(), logger.clone()));
|
||||
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 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);
|
||||
}
|
||||
|
|
|
@ -49,8 +49,8 @@ BlockSourceResult<ValidatedBlockHeader> where B::Target: BlockSource {
|
|||
/// use lightning::chain::chaininterface::FeeEstimator;
|
||||
/// use lightning::chain::keysinterface;
|
||||
/// use lightning::chain::keysinterface::KeysInterface;
|
||||
/// use lightning::ln::channelmanager::ChannelManager;
|
||||
/// use lightning::ln::channelmanager::ChannelManagerReadArgs;
|
||||
/// use lightning::ln::channelmanager::{ChannelManager, ChannelManagerReadArgs};
|
||||
/// use lightning::routing::router::Router;
|
||||
/// use lightning::util::config::UserConfig;
|
||||
/// use lightning::util::logger::Logger;
|
||||
/// use lightning::util::ser::ReadableArgs;
|
||||
|
@ -64,6 +64,7 @@ BlockSourceResult<ValidatedBlockHeader> where B::Target: BlockSource {
|
|||
/// K: KeysInterface,
|
||||
/// T: BroadcasterInterface,
|
||||
/// F: FeeEstimator,
|
||||
/// R: Router,
|
||||
/// L: Logger,
|
||||
/// C: chain::Filter,
|
||||
/// P: chainmonitor::Persist<K::Signer>,
|
||||
|
@ -74,6 +75,7 @@ BlockSourceResult<ValidatedBlockHeader> where B::Target: BlockSource {
|
|||
/// keys_manager: &K,
|
||||
/// tx_broadcaster: &T,
|
||||
/// fee_estimator: &F,
|
||||
/// router: &R,
|
||||
/// logger: &L,
|
||||
/// persister: &P,
|
||||
/// ) {
|
||||
|
@ -90,11 +92,12 @@ BlockSourceResult<ValidatedBlockHeader> where B::Target: BlockSource {
|
|||
/// fee_estimator,
|
||||
/// chain_monitor,
|
||||
/// tx_broadcaster,
|
||||
/// router,
|
||||
/// logger,
|
||||
/// config,
|
||||
/// vec![&mut monitor],
|
||||
/// );
|
||||
/// <(BlockHash, ChannelManager<&ChainMonitor<K::Signer, &C, &T, &F, &L, &P>, &T, &K, &F, &L>)>::read(
|
||||
/// <(BlockHash, ChannelManager<&ChainMonitor<K::Signer, &C, &T, &F, &L, &P>, &T, &K, &F, &R, &L>)>::read(
|
||||
/// &mut Cursor::new(&serialized_manager), read_args).unwrap()
|
||||
/// };
|
||||
///
|
||||
|
|
|
@ -76,7 +76,7 @@
|
|||
//! # impl Router for FakeRouter {
|
||||
//! # fn find_route(
|
||||
//! # &self, payer: &PublicKey, params: &RouteParameters,
|
||||
//! # first_hops: Option<&[&ChannelDetails]>, _inflight_htlcs: InFlightHtlcs
|
||||
//! # first_hops: Option<&[&ChannelDetails]>, _inflight_htlcs: &InFlightHtlcs
|
||||
//! # ) -> Result<Route, LightningError> { unimplemented!() }
|
||||
//! # fn notify_payment_path_failed(&self, path: &[&RouteHop], short_channel_id: u64) { unimplemented!() }
|
||||
//! # fn notify_payment_path_successful(&self, path: &[&RouteHop]) { unimplemented!() }
|
||||
|
@ -510,7 +510,7 @@ where
|
|||
let first_hops = self.payer.first_hops();
|
||||
let inflight_htlcs = self.payer.inflight_htlcs();
|
||||
let route = self.router.find_route(
|
||||
&payer, ¶ms, Some(&first_hops.iter().collect::<Vec<_>>()), inflight_htlcs
|
||||
&payer, ¶ms, Some(&first_hops.iter().collect::<Vec<_>>()), &inflight_htlcs
|
||||
).map_err(|e| PaymentError::Routing(e))?;
|
||||
|
||||
match send_payment(&route) {
|
||||
|
@ -578,7 +578,7 @@ where
|
|||
let inflight_htlcs = self.payer.inflight_htlcs();
|
||||
|
||||
let route = self.router.find_route(
|
||||
&payer, ¶ms, Some(&first_hops.iter().collect::<Vec<_>>()), inflight_htlcs
|
||||
&payer, ¶ms, Some(&first_hops.iter().collect::<Vec<_>>()), &inflight_htlcs
|
||||
);
|
||||
|
||||
if route.is_err() {
|
||||
|
@ -1670,7 +1670,7 @@ mod tests {
|
|||
impl Router for TestRouter {
|
||||
fn find_route(
|
||||
&self, payer: &PublicKey, route_params: &RouteParameters,
|
||||
_first_hops: Option<&[&ChannelDetails]>, inflight_htlcs: InFlightHtlcs
|
||||
_first_hops: Option<&[&ChannelDetails]>, inflight_htlcs: &InFlightHtlcs
|
||||
) -> Result<Route, LightningError> {
|
||||
// Simulate calling the Scorer just as you would in find_route
|
||||
let route = Self::route_for_value(route_params.final_value_msat);
|
||||
|
@ -1723,7 +1723,7 @@ mod tests {
|
|||
impl Router for FailingRouter {
|
||||
fn find_route(
|
||||
&self, _payer: &PublicKey, _params: &RouteParameters, _first_hops: Option<&[&ChannelDetails]>,
|
||||
_inflight_htlcs: InFlightHtlcs,
|
||||
_inflight_htlcs: &InFlightHtlcs,
|
||||
) -> Result<Route, LightningError> {
|
||||
Err(LightningError { err: String::new(), action: ErrorAction::IgnoreError })
|
||||
}
|
||||
|
@ -2011,7 +2011,7 @@ mod tests {
|
|||
impl Router for ManualRouter {
|
||||
fn find_route(
|
||||
&self, _payer: &PublicKey, _params: &RouteParameters, _first_hops: Option<&[&ChannelDetails]>,
|
||||
_inflight_htlcs: InFlightHtlcs
|
||||
_inflight_htlcs: &InFlightHtlcs
|
||||
) -> Result<Route, LightningError> {
|
||||
self.0.borrow_mut().pop_front().unwrap()
|
||||
}
|
||||
|
|
|
@ -15,7 +15,7 @@ use lightning::ln::channelmanager::{ChannelDetails, ChannelManager, PaymentId, P
|
|||
use lightning::ln::channelmanager::{PhantomRouteHints, MIN_CLTV_EXPIRY_DELTA};
|
||||
use lightning::ln::inbound_payment::{create, create_from_hash, ExpandedKey};
|
||||
use lightning::routing::gossip::RoutingFees;
|
||||
use lightning::routing::router::{InFlightHtlcs, Route, RouteHint, RouteHintHop};
|
||||
use lightning::routing::router::{InFlightHtlcs, Route, RouteHint, RouteHintHop, Router};
|
||||
use lightning::util::logger::Logger;
|
||||
use secp256k1::PublicKey;
|
||||
use core::ops::Deref;
|
||||
|
@ -232,8 +232,8 @@ where
|
|||
///
|
||||
/// `invoice_expiry_delta_secs` describes the number of seconds that the invoice is valid for
|
||||
/// in excess of the current time.
|
||||
pub fn create_invoice_from_channelmanager<M: Deref, T: Deref, K: Deref, F: Deref, L: Deref>(
|
||||
channelmanager: &ChannelManager<M, T, K, F, L>, keys_manager: K, logger: L,
|
||||
pub fn create_invoice_from_channelmanager<M: Deref, T: Deref, K: Deref, F: Deref, R: Deref, L: Deref>(
|
||||
channelmanager: &ChannelManager<M, T, K, F, R, L>, keys_manager: K, logger: L,
|
||||
network: Currency, amt_msat: Option<u64>, description: String, invoice_expiry_delta_secs: u32
|
||||
) -> Result<Invoice, SignOrCreationError<()>>
|
||||
where
|
||||
|
@ -241,6 +241,7 @@ where
|
|||
T::Target: BroadcasterInterface,
|
||||
K::Target: KeysInterface,
|
||||
F::Target: FeeEstimator,
|
||||
R::Target: Router,
|
||||
L::Target: Logger,
|
||||
{
|
||||
use std::time::SystemTime;
|
||||
|
@ -262,8 +263,8 @@ where
|
|||
///
|
||||
/// `invoice_expiry_delta_secs` describes the number of seconds that the invoice is valid for
|
||||
/// in excess of the current time.
|
||||
pub fn create_invoice_from_channelmanager_with_description_hash<M: Deref, T: Deref, K: Deref, F: Deref, L: Deref>(
|
||||
channelmanager: &ChannelManager<M, T, K, F, L>, keys_manager: K, logger: L,
|
||||
pub fn create_invoice_from_channelmanager_with_description_hash<M: Deref, T: Deref, K: Deref, F: Deref, R: Deref, L: Deref>(
|
||||
channelmanager: &ChannelManager<M, T, K, F, R, L>, keys_manager: K, logger: L,
|
||||
network: Currency, amt_msat: Option<u64>, description_hash: Sha256,
|
||||
invoice_expiry_delta_secs: u32
|
||||
) -> Result<Invoice, SignOrCreationError<()>>
|
||||
|
@ -272,6 +273,7 @@ where
|
|||
T::Target: BroadcasterInterface,
|
||||
K::Target: KeysInterface,
|
||||
F::Target: FeeEstimator,
|
||||
R::Target: Router,
|
||||
L::Target: Logger,
|
||||
{
|
||||
use std::time::SystemTime;
|
||||
|
@ -289,8 +291,8 @@ where
|
|||
/// See [`create_invoice_from_channelmanager_with_description_hash`]
|
||||
/// This version can be used in a `no_std` environment, where [`std::time::SystemTime`] is not
|
||||
/// available and the current time is supplied by the caller.
|
||||
pub fn create_invoice_from_channelmanager_with_description_hash_and_duration_since_epoch<M: Deref, T: Deref, K: Deref, F: Deref, L: Deref>(
|
||||
channelmanager: &ChannelManager<M, T, K, F, L>, keys_manager: K, logger: L,
|
||||
pub fn create_invoice_from_channelmanager_with_description_hash_and_duration_since_epoch<M: Deref, T: Deref, K: Deref, F: Deref, R: Deref, L: Deref>(
|
||||
channelmanager: &ChannelManager<M, T, K, F, R, L>, keys_manager: K, logger: L,
|
||||
network: Currency, amt_msat: Option<u64>, description_hash: Sha256,
|
||||
duration_since_epoch: Duration, invoice_expiry_delta_secs: u32
|
||||
) -> Result<Invoice, SignOrCreationError<()>>
|
||||
|
@ -299,6 +301,7 @@ pub fn create_invoice_from_channelmanager_with_description_hash_and_duration_sin
|
|||
T::Target: BroadcasterInterface,
|
||||
K::Target: KeysInterface,
|
||||
F::Target: FeeEstimator,
|
||||
R::Target: Router,
|
||||
L::Target: Logger,
|
||||
{
|
||||
_create_invoice_from_channelmanager_and_duration_since_epoch(
|
||||
|
@ -311,8 +314,8 @@ pub fn create_invoice_from_channelmanager_with_description_hash_and_duration_sin
|
|||
/// See [`create_invoice_from_channelmanager`]
|
||||
/// This version can be used in a `no_std` environment, where [`std::time::SystemTime`] is not
|
||||
/// available and the current time is supplied by the caller.
|
||||
pub fn create_invoice_from_channelmanager_and_duration_since_epoch<M: Deref, T: Deref, K: Deref, F: Deref, L: Deref>(
|
||||
channelmanager: &ChannelManager<M, T, K, F, L>, keys_manager: K, logger: L,
|
||||
pub fn create_invoice_from_channelmanager_and_duration_since_epoch<M: Deref, T: Deref, K: Deref, F: Deref, R: Deref, L: Deref>(
|
||||
channelmanager: &ChannelManager<M, T, K, F, R, L>, keys_manager: K, logger: L,
|
||||
network: Currency, amt_msat: Option<u64>, description: String, duration_since_epoch: Duration,
|
||||
invoice_expiry_delta_secs: u32
|
||||
) -> Result<Invoice, SignOrCreationError<()>>
|
||||
|
@ -321,6 +324,7 @@ pub fn create_invoice_from_channelmanager_and_duration_since_epoch<M: Deref, T:
|
|||
T::Target: BroadcasterInterface,
|
||||
K::Target: KeysInterface,
|
||||
F::Target: FeeEstimator,
|
||||
R::Target: Router,
|
||||
L::Target: Logger,
|
||||
{
|
||||
_create_invoice_from_channelmanager_and_duration_since_epoch(
|
||||
|
@ -332,8 +336,8 @@ pub fn create_invoice_from_channelmanager_and_duration_since_epoch<M: Deref, T:
|
|||
)
|
||||
}
|
||||
|
||||
fn _create_invoice_from_channelmanager_and_duration_since_epoch<M: Deref, T: Deref, K: Deref, F: Deref, L: Deref>(
|
||||
channelmanager: &ChannelManager<M, T, K, F, L>, keys_manager: K, logger: L,
|
||||
fn _create_invoice_from_channelmanager_and_duration_since_epoch<M: Deref, T: Deref, K: Deref, F: Deref, R: Deref, L: Deref>(
|
||||
channelmanager: &ChannelManager<M, T, K, F, R, L>, keys_manager: K, logger: L,
|
||||
network: Currency, amt_msat: Option<u64>, description: InvoiceDescription,
|
||||
duration_since_epoch: Duration, invoice_expiry_delta_secs: u32
|
||||
) -> Result<Invoice, SignOrCreationError<()>>
|
||||
|
@ -342,6 +346,7 @@ fn _create_invoice_from_channelmanager_and_duration_since_epoch<M: Deref, T: Der
|
|||
T::Target: BroadcasterInterface,
|
||||
K::Target: KeysInterface,
|
||||
F::Target: FeeEstimator,
|
||||
R::Target: Router,
|
||||
L::Target: Logger,
|
||||
{
|
||||
// `create_inbound_payment` only returns an error if the amount is greater than the total bitcoin
|
||||
|
@ -357,8 +362,8 @@ fn _create_invoice_from_channelmanager_and_duration_since_epoch<M: Deref, T: Der
|
|||
/// This version allows for providing a custom [`PaymentHash`] for the invoice.
|
||||
/// This may be useful if you're building an on-chain swap or involving another protocol where
|
||||
/// the payment hash is also involved outside the scope of lightning.
|
||||
pub fn create_invoice_from_channelmanager_and_duration_since_epoch_with_payment_hash<M: Deref, T: Deref, K: Deref, F: Deref, L: Deref>(
|
||||
channelmanager: &ChannelManager<M, T, K, F, L>, keys_manager: K, logger: L,
|
||||
pub fn create_invoice_from_channelmanager_and_duration_since_epoch_with_payment_hash<M: Deref, T: Deref, K: Deref, F: Deref, R: Deref, L: Deref>(
|
||||
channelmanager: &ChannelManager<M, T, K, F, R, L>, keys_manager: K, logger: L,
|
||||
network: Currency, amt_msat: Option<u64>, description: String, duration_since_epoch: Duration,
|
||||
invoice_expiry_delta_secs: u32, payment_hash: PaymentHash
|
||||
) -> Result<Invoice, SignOrCreationError<()>>
|
||||
|
@ -367,6 +372,7 @@ pub fn create_invoice_from_channelmanager_and_duration_since_epoch_with_payment_
|
|||
T::Target: BroadcasterInterface,
|
||||
K::Target: KeysInterface,
|
||||
F::Target: FeeEstimator,
|
||||
R::Target: Router,
|
||||
L::Target: Logger,
|
||||
{
|
||||
let payment_secret = channelmanager
|
||||
|
@ -381,8 +387,8 @@ pub fn create_invoice_from_channelmanager_and_duration_since_epoch_with_payment_
|
|||
)
|
||||
}
|
||||
|
||||
fn _create_invoice_from_channelmanager_and_duration_since_epoch_with_payment_hash<M: Deref, T: Deref, K: Deref, F: Deref, L: Deref>(
|
||||
channelmanager: &ChannelManager<M, T, K, F, L>, keys_manager: K, logger: L,
|
||||
fn _create_invoice_from_channelmanager_and_duration_since_epoch_with_payment_hash<M: Deref, T: Deref, K: Deref, F: Deref, R: Deref, L: Deref>(
|
||||
channelmanager: &ChannelManager<M, T, K, F, R, L>, keys_manager: K, logger: L,
|
||||
network: Currency, amt_msat: Option<u64>, description: InvoiceDescription, duration_since_epoch: Duration,
|
||||
invoice_expiry_delta_secs: u32, payment_hash: PaymentHash, payment_secret: PaymentSecret
|
||||
) -> Result<Invoice, SignOrCreationError<()>>
|
||||
|
@ -391,6 +397,7 @@ fn _create_invoice_from_channelmanager_and_duration_since_epoch_with_payment_has
|
|||
T::Target: BroadcasterInterface,
|
||||
K::Target: KeysInterface,
|
||||
F::Target: FeeEstimator,
|
||||
R::Target: Router,
|
||||
L::Target: Logger,
|
||||
{
|
||||
let our_node_pubkey = channelmanager.get_our_node_id();
|
||||
|
@ -565,12 +572,13 @@ fn filter_channels<L: Deref>(
|
|||
.collect::<Vec<RouteHint>>()
|
||||
}
|
||||
|
||||
impl<M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> Payer for ChannelManager<M, T, K, F, L>
|
||||
impl<M: Deref, T: Deref, K: Deref, F: Deref, R: Deref, L: Deref> Payer for ChannelManager<M, T, K, F, R, L>
|
||||
where
|
||||
M::Target: chain::Watch<<K::Target as SignerProvider>::Signer>,
|
||||
T::Target: BroadcasterInterface,
|
||||
K::Target: KeysInterface,
|
||||
F::Target: FeeEstimator,
|
||||
R::Target: Router,
|
||||
L::Target: Logger,
|
||||
{
|
||||
fn node_id(&self) -> PublicKey {
|
||||
|
|
|
@ -815,6 +815,7 @@ mod tests {
|
|||
|
||||
chanmon_cfgs[1].persister.offchain_monitor_updates.lock().unwrap().clear();
|
||||
chanmon_cfgs[1].persister.set_update_ret(ChannelMonitorUpdateStatus::InProgress);
|
||||
chanmon_cfgs[1].persister.set_update_ret(ChannelMonitorUpdateStatus::InProgress);
|
||||
|
||||
nodes[1].node.claim_funds(payment_preimage_1);
|
||||
check_added_monitors!(nodes[1], 1);
|
||||
|
@ -823,8 +824,6 @@ mod tests {
|
|||
check_added_monitors!(nodes[1], 1);
|
||||
expect_payment_claimed!(nodes[1], payment_hash_2, 1_000_000);
|
||||
|
||||
chanmon_cfgs[1].persister.set_update_ret(ChannelMonitorUpdateStatus::Completed);
|
||||
|
||||
let persistences = chanmon_cfgs[1].persister.offchain_monitor_updates.lock().unwrap().clone();
|
||||
assert_eq!(persistences.len(), 1);
|
||||
let (funding_txo, updates) = persistences.iter().next().unwrap();
|
||||
|
|
|
@ -782,6 +782,7 @@ fn test_monitor_update_raa_while_paused() {
|
|||
check_added_monitors!(nodes[1], 1);
|
||||
let bs_raa = get_event_msg!(nodes[1], MessageSendEvent::SendRevokeAndACK, nodes[0].node.get_our_node_id());
|
||||
|
||||
chanmon_cfgs[0].persister.set_update_ret(ChannelMonitorUpdateStatus::InProgress);
|
||||
chanmon_cfgs[0].persister.set_update_ret(ChannelMonitorUpdateStatus::InProgress);
|
||||
nodes[0].node.handle_update_add_htlc(&nodes[1].node.get_our_node_id(), &send_event_2.msgs[0]);
|
||||
nodes[0].node.handle_commitment_signed(&nodes[1].node.get_our_node_id(), &send_event_2.commitment_msg);
|
||||
|
@ -793,7 +794,6 @@ fn test_monitor_update_raa_while_paused() {
|
|||
assert!(nodes[0].node.get_and_clear_pending_msg_events().is_empty());
|
||||
check_added_monitors!(nodes[0], 1);
|
||||
|
||||
chanmon_cfgs[0].persister.set_update_ret(ChannelMonitorUpdateStatus::Completed);
|
||||
let (outpoint, latest_update, _) = nodes[0].chain_monitor.latest_monitor_update_id.lock().unwrap().get(&channel_id).unwrap().clone();
|
||||
nodes[0].chain_monitor.chain_monitor.force_channel_monitor_updated(outpoint, latest_update);
|
||||
check_added_monitors!(nodes[0], 0);
|
||||
|
@ -1223,6 +1223,7 @@ fn raa_no_response_awaiting_raa_state() {
|
|||
// nodes[1]) followed by an RAA. Fail the monitor updating prior to the CS, deliver the RAA,
|
||||
// then restore channel monitor updates.
|
||||
chanmon_cfgs[1].persister.set_update_ret(ChannelMonitorUpdateStatus::InProgress);
|
||||
chanmon_cfgs[1].persister.set_update_ret(ChannelMonitorUpdateStatus::InProgress);
|
||||
nodes[1].node.handle_update_add_htlc(&nodes[0].node.get_our_node_id(), &payment_event.msgs[0]);
|
||||
nodes[1].node.handle_commitment_signed(&nodes[0].node.get_our_node_id(), &payment_event.commitment_msg);
|
||||
assert!(nodes[1].node.get_and_clear_pending_msg_events().is_empty());
|
||||
|
@ -1233,7 +1234,6 @@ fn raa_no_response_awaiting_raa_state() {
|
|||
assert!(nodes[1].node.get_and_clear_pending_msg_events().is_empty());
|
||||
check_added_monitors!(nodes[1], 1);
|
||||
|
||||
chanmon_cfgs[1].persister.set_update_ret(ChannelMonitorUpdateStatus::Completed);
|
||||
let (outpoint, latest_update, _) = nodes[1].chain_monitor.latest_monitor_update_id.lock().unwrap().get(&channel_id).unwrap().clone();
|
||||
nodes[1].chain_monitor.chain_monitor.force_channel_monitor_updated(outpoint, latest_update);
|
||||
// nodes[1] should be AwaitingRAA here!
|
||||
|
@ -1959,7 +1959,7 @@ fn test_path_paused_mpp() {
|
|||
// Set it so that the first monitor update (for the path 0 -> 1 -> 3) succeeds, but the second
|
||||
// (for the path 0 -> 2 -> 3) fails.
|
||||
chanmon_cfgs[0].persister.set_update_ret(ChannelMonitorUpdateStatus::Completed);
|
||||
chanmon_cfgs[0].persister.set_next_update_ret(Some(ChannelMonitorUpdateStatus::InProgress));
|
||||
chanmon_cfgs[0].persister.set_update_ret(ChannelMonitorUpdateStatus::InProgress);
|
||||
|
||||
// Now check that we get the right return value, indicating that the first path succeeded but
|
||||
// the second got a MonitorUpdateInProgress err. This implies
|
||||
|
@ -2231,7 +2231,7 @@ fn do_channel_holding_cell_serialize(disconnect: bool, reload_a: bool) {
|
|||
let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
|
||||
let persister: test_utils::TestPersister;
|
||||
let new_chain_monitor: test_utils::TestChainMonitor;
|
||||
let nodes_0_deserialized: ChannelManager<&test_utils::TestChainMonitor, &test_utils::TestBroadcaster, &test_utils::TestKeysInterface, &test_utils::TestFeeEstimator, &test_utils::TestLogger>;
|
||||
let nodes_0_deserialized: ChannelManager<&test_utils::TestChainMonitor, &test_utils::TestBroadcaster, &test_utils::TestKeysInterface, &test_utils::TestFeeEstimator, &test_utils::TestRouter, &test_utils::TestLogger>;
|
||||
let mut nodes = create_network(2, &node_cfgs, &node_chanmgrs);
|
||||
|
||||
let chan_id = create_announced_chan_between_nodes_with_value(&nodes, 0, 1, 15_000_000, 7_000_000_000, channelmanager::provided_init_features(), channelmanager::provided_init_features()).2;
|
||||
|
@ -2268,6 +2268,7 @@ fn do_channel_holding_cell_serialize(disconnect: bool, reload_a: bool) {
|
|||
nodes[0].node.send_payment(&route, payment_hash_2, &Some(payment_secret_2), PaymentId(payment_hash_2.0)).unwrap();
|
||||
check_added_monitors!(nodes[0], 0);
|
||||
|
||||
chanmon_cfgs[0].persister.set_update_ret(ChannelMonitorUpdateStatus::InProgress);
|
||||
chanmon_cfgs[0].persister.set_update_ret(ChannelMonitorUpdateStatus::InProgress);
|
||||
nodes[0].node.claim_funds(payment_preimage_0);
|
||||
check_added_monitors!(nodes[0], 1);
|
||||
|
@ -2724,7 +2725,7 @@ fn do_test_outbound_reload_without_init_mon(use_0conf: bool) {
|
|||
|
||||
let persister: test_utils::TestPersister;
|
||||
let new_chain_monitor: test_utils::TestChainMonitor;
|
||||
let nodes_0_deserialized: ChannelManager<&test_utils::TestChainMonitor, &test_utils::TestBroadcaster, &test_utils::TestKeysInterface, &test_utils::TestFeeEstimator, &test_utils::TestLogger>;
|
||||
let nodes_0_deserialized: ChannelManager<&test_utils::TestChainMonitor, &test_utils::TestBroadcaster, &test_utils::TestKeysInterface, &test_utils::TestFeeEstimator, &test_utils::TestRouter, &test_utils::TestLogger>;
|
||||
|
||||
let mut chan_config = test_default_channel_config();
|
||||
chan_config.manually_accept_inbound_channels = true;
|
||||
|
@ -2813,7 +2814,7 @@ fn do_test_inbound_reload_without_init_mon(use_0conf: bool, lock_commitment: boo
|
|||
|
||||
let persister: test_utils::TestPersister;
|
||||
let new_chain_monitor: test_utils::TestChainMonitor;
|
||||
let nodes_1_deserialized: ChannelManager<&test_utils::TestChainMonitor, &test_utils::TestBroadcaster, &test_utils::TestKeysInterface, &test_utils::TestFeeEstimator, &test_utils::TestLogger>;
|
||||
let nodes_1_deserialized: ChannelManager<&test_utils::TestChainMonitor, &test_utils::TestBroadcaster, &test_utils::TestKeysInterface, &test_utils::TestFeeEstimator, &test_utils::TestRouter, &test_utils::TestLogger>;
|
||||
|
||||
let mut chan_config = test_default_channel_config();
|
||||
chan_config.manually_accept_inbound_channels = true;
|
||||
|
|
|
@ -46,7 +46,9 @@ use crate::ln::channel::{Channel, ChannelError, ChannelUpdateStatus, UpdateFulfi
|
|||
use crate::ln::features::{ChannelFeatures, ChannelTypeFeatures, InitFeatures, NodeFeatures};
|
||||
#[cfg(any(feature = "_test_utils", test))]
|
||||
use crate::ln::features::InvoiceFeatures;
|
||||
use crate::routing::router::{InFlightHtlcs, PaymentParameters, Route, RouteHop, RoutePath};
|
||||
use crate::routing::gossip::NetworkGraph;
|
||||
use crate::routing::router::{DefaultRouter, InFlightHtlcs, PaymentParameters, Route, RouteHop, RoutePath, Router};
|
||||
use crate::routing::scoring::ProbabilisticScorer;
|
||||
use crate::ln::msgs;
|
||||
use crate::ln::onion_utils;
|
||||
use crate::ln::onion_utils::HTLCFailReason;
|
||||
|
@ -490,24 +492,35 @@ struct PendingInboundPayment {
|
|||
/// when you're using lightning-net-tokio (since tokio::spawn requires parameters with static
|
||||
/// lifetimes). Other times you can afford a reference, which is more efficient, in which case
|
||||
/// SimpleRefChannelManager is the more appropriate type. Defining these type aliases prevents
|
||||
/// issues such as overly long function definitions. Note that the ChannelManager can take any
|
||||
/// type that implements KeysInterface for its keys manager, but this type alias chooses the
|
||||
/// concrete type of the KeysManager.
|
||||
/// issues such as overly long function definitions. Note that the ChannelManager can take any type
|
||||
/// that implements KeysInterface or Router for its keys manager and router, respectively, but this
|
||||
/// type alias chooses the concrete types of KeysManager and DefaultRouter.
|
||||
///
|
||||
/// (C-not exported) as Arcs don't make sense in bindings
|
||||
pub type SimpleArcChannelManager<M, T, F, L> = ChannelManager<Arc<M>, Arc<T>, Arc<KeysManager>, Arc<F>, Arc<L>>;
|
||||
pub type SimpleArcChannelManager<M, T, F, L> = ChannelManager<
|
||||
Arc<M>,
|
||||
Arc<T>,
|
||||
Arc<KeysManager>,
|
||||
Arc<F>,
|
||||
Arc<DefaultRouter<
|
||||
Arc<NetworkGraph<Arc<L>>>,
|
||||
Arc<L>,
|
||||
Arc<Mutex<ProbabilisticScorer<Arc<NetworkGraph<Arc<L>>>, Arc<L>>>>
|
||||
>>,
|
||||
Arc<L>
|
||||
>;
|
||||
|
||||
/// SimpleRefChannelManager is a type alias for a ChannelManager reference, and is the reference
|
||||
/// counterpart to the SimpleArcChannelManager type alias. Use this type by default when you don't
|
||||
/// need a ChannelManager with a static lifetime. You'll need a static lifetime in cases such as
|
||||
/// usage of lightning-net-tokio (since tokio::spawn requires parameters with static lifetimes).
|
||||
/// But if this is not necessary, using a reference is more efficient. Defining these type aliases
|
||||
/// helps with issues such as long function definitions. Note that the ChannelManager can take any
|
||||
/// type that implements KeysInterface for its keys manager, but this type alias chooses the
|
||||
/// concrete type of the KeysManager.
|
||||
/// issues such as overly long function definitions. Note that the ChannelManager can take any type
|
||||
/// that implements KeysInterface or Router for its keys manager and router, respectively, but this
|
||||
/// type alias chooses the concrete types of KeysManager and DefaultRouter.
|
||||
///
|
||||
/// (C-not exported) as Arcs don't make sense in bindings
|
||||
pub type SimpleRefChannelManager<'a, 'b, 'c, 'd, 'e, M, T, F, L> = ChannelManager<&'a M, &'b T, &'c KeysManager, &'d F, &'e L>;
|
||||
pub type SimpleRefChannelManager<'a, 'b, 'c, 'd, 'e, 'f, 'g, 'h, M, T, F, L> = ChannelManager<&'a M, &'b T, &'c KeysManager, &'d F, &'e DefaultRouter<&'f NetworkGraph<&'g L>, &'g L, &'h Mutex<ProbabilisticScorer<&'f NetworkGraph<&'g L>, &'g L>>>, &'g L>;
|
||||
|
||||
/// Manager which keeps track of a number of channels and sends messages to the appropriate
|
||||
/// channel, also tracking HTLC preimages and forwarding onion packets appropriately.
|
||||
|
@ -583,18 +596,22 @@ pub type SimpleRefChannelManager<'a, 'b, 'c, 'd, 'e, M, T, F, L> = ChannelManage
|
|||
// | |
|
||||
// | |__`pending_background_events`
|
||||
//
|
||||
pub struct ChannelManager<M: Deref, T: Deref, K: Deref, F: Deref, L: Deref>
|
||||
where M::Target: chain::Watch<<K::Target as SignerProvider>::Signer>,
|
||||
T::Target: BroadcasterInterface,
|
||||
K::Target: KeysInterface,
|
||||
F::Target: FeeEstimator,
|
||||
L::Target: Logger,
|
||||
pub struct ChannelManager<M: Deref, T: Deref, K: Deref, F: Deref, R: Deref, L: Deref>
|
||||
where
|
||||
M::Target: chain::Watch<<K::Target as SignerProvider>::Signer>,
|
||||
T::Target: BroadcasterInterface,
|
||||
K::Target: KeysInterface,
|
||||
F::Target: FeeEstimator,
|
||||
R::Target: Router,
|
||||
L::Target: Logger,
|
||||
{
|
||||
default_configuration: UserConfig,
|
||||
genesis_hash: BlockHash,
|
||||
fee_estimator: LowerBoundedFeeEstimator<F>,
|
||||
chain_monitor: M,
|
||||
tx_broadcaster: T,
|
||||
#[allow(unused)]
|
||||
router: R,
|
||||
|
||||
/// See `ChannelManager` struct-level documentation for lock order requirements.
|
||||
#[cfg(test)]
|
||||
|
@ -1358,12 +1375,14 @@ macro_rules! emit_channel_ready_event {
|
|||
}
|
||||
}
|
||||
|
||||
impl<M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelManager<M, T, K, F, L>
|
||||
where M::Target: chain::Watch<<K::Target as SignerProvider>::Signer>,
|
||||
T::Target: BroadcasterInterface,
|
||||
K::Target: KeysInterface,
|
||||
F::Target: FeeEstimator,
|
||||
L::Target: Logger,
|
||||
impl<M: Deref, T: Deref, K: Deref, F: Deref, R: Deref, L: Deref> ChannelManager<M, T, K, F, R, L>
|
||||
where
|
||||
M::Target: chain::Watch<<K::Target as SignerProvider>::Signer>,
|
||||
T::Target: BroadcasterInterface,
|
||||
K::Target: KeysInterface,
|
||||
F::Target: FeeEstimator,
|
||||
R::Target: Router,
|
||||
L::Target: Logger,
|
||||
{
|
||||
/// Constructs a new ChannelManager to hold several channels and route between them.
|
||||
///
|
||||
|
@ -1375,7 +1394,7 @@ impl<M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelManager<M, T, K, F
|
|||
/// Users need to notify the new ChannelManager when a new block is connected or
|
||||
/// disconnected using its `block_connected` and `block_disconnected` methods, starting
|
||||
/// from after `params.latest_hash`.
|
||||
pub fn new(fee_est: F, chain_monitor: M, tx_broadcaster: T, logger: L, keys_manager: K, config: UserConfig, params: ChainParameters) -> Self {
|
||||
pub fn new(fee_est: F, chain_monitor: M, tx_broadcaster: T, router: R, logger: L, keys_manager: K, config: UserConfig, params: ChainParameters) -> Self {
|
||||
let mut secp_ctx = Secp256k1::new();
|
||||
secp_ctx.seeded_randomize(&keys_manager.get_secure_random_bytes());
|
||||
let inbound_pmt_key_material = keys_manager.get_inbound_payment_key_material();
|
||||
|
@ -1386,6 +1405,7 @@ impl<M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelManager<M, T, K, F
|
|||
fee_estimator: LowerBoundedFeeEstimator::new(fee_est),
|
||||
chain_monitor,
|
||||
tx_broadcaster,
|
||||
router,
|
||||
|
||||
best_block: RwLock::new(params.best_block),
|
||||
|
||||
|
@ -5264,12 +5284,14 @@ impl<M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelManager<M, T, K, F
|
|||
}
|
||||
}
|
||||
|
||||
impl<M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> MessageSendEventsProvider for ChannelManager<M, T, K, F, L>
|
||||
where M::Target: chain::Watch<<K::Target as SignerProvider>::Signer>,
|
||||
T::Target: BroadcasterInterface,
|
||||
K::Target: KeysInterface,
|
||||
F::Target: FeeEstimator,
|
||||
L::Target: Logger,
|
||||
impl<M: Deref, T: Deref, K: Deref, F: Deref, R: Deref, L: Deref> MessageSendEventsProvider for ChannelManager<M, T, K, F, R, L>
|
||||
where
|
||||
M::Target: chain::Watch<<K::Target as SignerProvider>::Signer>,
|
||||
T::Target: BroadcasterInterface,
|
||||
K::Target: KeysInterface,
|
||||
F::Target: FeeEstimator,
|
||||
R::Target: Router,
|
||||
L::Target: Logger,
|
||||
{
|
||||
fn get_and_clear_pending_msg_events(&self) -> Vec<MessageSendEvent> {
|
||||
let events = RefCell::new(Vec::new());
|
||||
|
@ -5303,12 +5325,13 @@ impl<M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> MessageSendEventsProvider
|
|||
}
|
||||
}
|
||||
|
||||
impl<M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> EventsProvider for ChannelManager<M, T, K, F, L>
|
||||
impl<M: Deref, T: Deref, K: Deref, F: Deref, R: Deref, L: Deref> EventsProvider for ChannelManager<M, T, K, F, R, L>
|
||||
where
|
||||
M::Target: chain::Watch<<K::Target as SignerProvider>::Signer>,
|
||||
T::Target: BroadcasterInterface,
|
||||
K::Target: KeysInterface,
|
||||
F::Target: FeeEstimator,
|
||||
R::Target: Router,
|
||||
L::Target: Logger,
|
||||
{
|
||||
/// Processes events that must be periodically handled.
|
||||
|
@ -5339,12 +5362,13 @@ where
|
|||
}
|
||||
}
|
||||
|
||||
impl<M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> chain::Listen for ChannelManager<M, T, K, F, L>
|
||||
impl<M: Deref, T: Deref, K: Deref, F: Deref, R: Deref, L: Deref> chain::Listen for ChannelManager<M, T, K, F, R, L>
|
||||
where
|
||||
M::Target: chain::Watch<<K::Target as SignerProvider>::Signer>,
|
||||
T::Target: BroadcasterInterface,
|
||||
K::Target: KeysInterface,
|
||||
F::Target: FeeEstimator,
|
||||
R::Target: Router,
|
||||
L::Target: Logger,
|
||||
{
|
||||
fn filtered_block_connected(&self, header: &BlockHeader, txdata: &TransactionData, height: u32) {
|
||||
|
@ -5376,12 +5400,13 @@ where
|
|||
}
|
||||
}
|
||||
|
||||
impl<M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> chain::Confirm for ChannelManager<M, T, K, F, L>
|
||||
impl<M: Deref, T: Deref, K: Deref, F: Deref, R: Deref, L: Deref> chain::Confirm for ChannelManager<M, T, K, F, R, L>
|
||||
where
|
||||
M::Target: chain::Watch<<K::Target as SignerProvider>::Signer>,
|
||||
T::Target: BroadcasterInterface,
|
||||
K::Target: KeysInterface,
|
||||
F::Target: FeeEstimator,
|
||||
R::Target: Router,
|
||||
L::Target: Logger,
|
||||
{
|
||||
fn transactions_confirmed(&self, header: &BlockHeader, txdata: &TransactionData, height: u32) {
|
||||
|
@ -5463,12 +5488,13 @@ where
|
|||
}
|
||||
}
|
||||
|
||||
impl<M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelManager<M, T, K, F, L>
|
||||
impl<M: Deref, T: Deref, K: Deref, F: Deref, R: Deref, L: Deref> ChannelManager<M, T, K, F, R, L>
|
||||
where
|
||||
M::Target: chain::Watch<<K::Target as SignerProvider>::Signer>,
|
||||
T::Target: BroadcasterInterface,
|
||||
K::Target: KeysInterface,
|
||||
F::Target: FeeEstimator,
|
||||
R::Target: Router,
|
||||
L::Target: Logger,
|
||||
{
|
||||
/// Calls a function which handles an on-chain event (blocks dis/connected, transactions
|
||||
|
@ -5663,13 +5689,15 @@ where
|
|||
}
|
||||
}
|
||||
|
||||
impl<M: Deref, T: Deref, K: Deref, F: Deref, L: Deref >
|
||||
ChannelMessageHandler for ChannelManager<M, T, K, F, L>
|
||||
where M::Target: chain::Watch<<K::Target as SignerProvider>::Signer>,
|
||||
T::Target: BroadcasterInterface,
|
||||
K::Target: KeysInterface,
|
||||
F::Target: FeeEstimator,
|
||||
L::Target: Logger,
|
||||
impl<M: Deref, T: Deref, K: Deref, F: Deref, R: Deref, L: Deref>
|
||||
ChannelMessageHandler for ChannelManager<M, T, K, F, R, L>
|
||||
where
|
||||
M::Target: chain::Watch<<K::Target as SignerProvider>::Signer>,
|
||||
T::Target: BroadcasterInterface,
|
||||
K::Target: KeysInterface,
|
||||
F::Target: FeeEstimator,
|
||||
R::Target: Router,
|
||||
L::Target: Logger,
|
||||
{
|
||||
fn handle_open_channel(&self, counterparty_node_id: &PublicKey, their_features: InitFeatures, msg: &msgs::OpenChannel) {
|
||||
let _persistence_guard = PersistenceNotifierGuard::notify_on_drop(&self.total_consistency_lock, &self.persistence_notifier);
|
||||
|
@ -6350,12 +6378,14 @@ impl_writeable_tlv_based!(PendingInboundPayment, {
|
|||
(8, min_value_msat, required),
|
||||
});
|
||||
|
||||
impl<M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> Writeable for ChannelManager<M, T, K, F, L>
|
||||
where M::Target: chain::Watch<<K::Target as SignerProvider>::Signer>,
|
||||
T::Target: BroadcasterInterface,
|
||||
K::Target: KeysInterface,
|
||||
F::Target: FeeEstimator,
|
||||
L::Target: Logger,
|
||||
impl<M: Deref, T: Deref, K: Deref, F: Deref, R: Deref, L: Deref> Writeable for ChannelManager<M, T, K, F, R, L>
|
||||
where
|
||||
M::Target: chain::Watch<<K::Target as SignerProvider>::Signer>,
|
||||
T::Target: BroadcasterInterface,
|
||||
K::Target: KeysInterface,
|
||||
F::Target: FeeEstimator,
|
||||
R::Target: Router,
|
||||
L::Target: Logger,
|
||||
{
|
||||
fn write<W: Writer>(&self, writer: &mut W) -> Result<(), io::Error> {
|
||||
let _consistency_lock = self.total_consistency_lock.write().unwrap();
|
||||
|
@ -6547,12 +6577,14 @@ impl<M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> Writeable for ChannelMana
|
|||
/// which you've already broadcasted the transaction.
|
||||
///
|
||||
/// [`ChainMonitor`]: crate::chain::chainmonitor::ChainMonitor
|
||||
pub struct ChannelManagerReadArgs<'a, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref>
|
||||
where M::Target: chain::Watch<<K::Target as SignerProvider>::Signer>,
|
||||
T::Target: BroadcasterInterface,
|
||||
K::Target: KeysInterface,
|
||||
F::Target: FeeEstimator,
|
||||
L::Target: Logger,
|
||||
pub struct ChannelManagerReadArgs<'a, M: Deref, T: Deref, K: Deref, F: Deref, R: Deref, L: Deref>
|
||||
where
|
||||
M::Target: chain::Watch<<K::Target as SignerProvider>::Signer>,
|
||||
T::Target: BroadcasterInterface,
|
||||
K::Target: KeysInterface,
|
||||
F::Target: FeeEstimator,
|
||||
R::Target: Router,
|
||||
L::Target: Logger,
|
||||
{
|
||||
/// The keys provider which will give us relevant keys. Some keys will be loaded during
|
||||
/// deserialization and KeysInterface::read_chan_signer will be used to read per-Channel
|
||||
|
@ -6574,6 +6606,11 @@ pub struct ChannelManagerReadArgs<'a, M: Deref, T: Deref, K: Deref, F: Deref, L:
|
|||
/// used to broadcast the latest local commitment transactions of channels which must be
|
||||
/// force-closed during deserialization.
|
||||
pub tx_broadcaster: T,
|
||||
/// The router which will be used in the ChannelManager in the future for finding routes
|
||||
/// on-the-fly for trampoline payments. Absent in private nodes that don't support forwarding.
|
||||
///
|
||||
/// No calls to the router will be made during deserialization.
|
||||
pub router: R,
|
||||
/// The Logger for use in the ChannelManager and which may be used to log information during
|
||||
/// deserialization.
|
||||
pub logger: L,
|
||||
|
@ -6596,21 +6633,23 @@ pub struct ChannelManagerReadArgs<'a, M: Deref, T: Deref, K: Deref, F: Deref, L:
|
|||
pub channel_monitors: HashMap<OutPoint, &'a mut ChannelMonitor<<K::Target as SignerProvider>::Signer>>,
|
||||
}
|
||||
|
||||
impl<'a, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref>
|
||||
ChannelManagerReadArgs<'a, M, T, K, F, L>
|
||||
where M::Target: chain::Watch<<K::Target as SignerProvider>::Signer>,
|
||||
T::Target: BroadcasterInterface,
|
||||
K::Target: KeysInterface,
|
||||
F::Target: FeeEstimator,
|
||||
L::Target: Logger,
|
||||
{
|
||||
impl<'a, M: Deref, T: Deref, K: Deref, F: Deref, R: Deref, L: Deref>
|
||||
ChannelManagerReadArgs<'a, M, T, K, F, R, L>
|
||||
where
|
||||
M::Target: chain::Watch<<K::Target as SignerProvider>::Signer>,
|
||||
T::Target: BroadcasterInterface,
|
||||
K::Target: KeysInterface,
|
||||
F::Target: FeeEstimator,
|
||||
R::Target: Router,
|
||||
L::Target: Logger,
|
||||
{
|
||||
/// Simple utility function to create a ChannelManagerReadArgs which creates the monitor
|
||||
/// HashMap for you. This is primarily useful for C bindings where it is not practical to
|
||||
/// populate a HashMap directly from C.
|
||||
pub fn new(keys_manager: K, fee_estimator: F, chain_monitor: M, tx_broadcaster: T, logger: L, default_config: UserConfig,
|
||||
pub fn new(keys_manager: K, fee_estimator: F, chain_monitor: M, tx_broadcaster: T, router: R, logger: L, default_config: UserConfig,
|
||||
mut channel_monitors: Vec<&'a mut ChannelMonitor<<K::Target as SignerProvider>::Signer>>) -> Self {
|
||||
Self {
|
||||
keys_manager, fee_estimator, chain_monitor, tx_broadcaster, logger, default_config,
|
||||
keys_manager, fee_estimator, chain_monitor, tx_broadcaster, router, logger, default_config,
|
||||
channel_monitors: channel_monitors.drain(..).map(|monitor| { (monitor.get_funding_txo().0, monitor) }).collect()
|
||||
}
|
||||
}
|
||||
|
@ -6618,29 +6657,33 @@ impl<'a, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref>
|
|||
|
||||
// Implement ReadableArgs for an Arc'd ChannelManager to make it a bit easier to work with the
|
||||
// SipmleArcChannelManager type:
|
||||
impl<'a, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref>
|
||||
ReadableArgs<ChannelManagerReadArgs<'a, M, T, K, F, L>> for (BlockHash, Arc<ChannelManager<M, T, K, F, L>>)
|
||||
where M::Target: chain::Watch<<K::Target as SignerProvider>::Signer>,
|
||||
T::Target: BroadcasterInterface,
|
||||
K::Target: KeysInterface,
|
||||
F::Target: FeeEstimator,
|
||||
L::Target: Logger,
|
||||
impl<'a, M: Deref, T: Deref, K: Deref, F: Deref, R: Deref, L: Deref>
|
||||
ReadableArgs<ChannelManagerReadArgs<'a, M, T, K, F, R, L>> for (BlockHash, Arc<ChannelManager<M, T, K, F, R, L>>)
|
||||
where
|
||||
M::Target: chain::Watch<<K::Target as SignerProvider>::Signer>,
|
||||
T::Target: BroadcasterInterface,
|
||||
K::Target: KeysInterface,
|
||||
F::Target: FeeEstimator,
|
||||
R::Target: Router,
|
||||
L::Target: Logger,
|
||||
{
|
||||
fn read<R: io::Read>(reader: &mut R, args: ChannelManagerReadArgs<'a, M, T, K, F, L>) -> Result<Self, DecodeError> {
|
||||
let (blockhash, chan_manager) = <(BlockHash, ChannelManager<M, T, K, F, L>)>::read(reader, args)?;
|
||||
fn read<Reader: io::Read>(reader: &mut Reader, args: ChannelManagerReadArgs<'a, M, T, K, F, R, L>) -> Result<Self, DecodeError> {
|
||||
let (blockhash, chan_manager) = <(BlockHash, ChannelManager<M, T, K, F, R, L>)>::read(reader, args)?;
|
||||
Ok((blockhash, Arc::new(chan_manager)))
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref>
|
||||
ReadableArgs<ChannelManagerReadArgs<'a, M, T, K, F, L>> for (BlockHash, ChannelManager<M, T, K, F, L>)
|
||||
where M::Target: chain::Watch<<K::Target as SignerProvider>::Signer>,
|
||||
T::Target: BroadcasterInterface,
|
||||
K::Target: KeysInterface,
|
||||
F::Target: FeeEstimator,
|
||||
L::Target: Logger,
|
||||
impl<'a, M: Deref, T: Deref, K: Deref, F: Deref, R: Deref, L: Deref>
|
||||
ReadableArgs<ChannelManagerReadArgs<'a, M, T, K, F, R, L>> for (BlockHash, ChannelManager<M, T, K, F, R, L>)
|
||||
where
|
||||
M::Target: chain::Watch<<K::Target as SignerProvider>::Signer>,
|
||||
T::Target: BroadcasterInterface,
|
||||
K::Target: KeysInterface,
|
||||
F::Target: FeeEstimator,
|
||||
R::Target: Router,
|
||||
L::Target: Logger,
|
||||
{
|
||||
fn read<R: io::Read>(reader: &mut R, mut args: ChannelManagerReadArgs<'a, M, T, K, F, L>) -> Result<Self, DecodeError> {
|
||||
fn read<Reader: io::Read>(reader: &mut Reader, mut args: ChannelManagerReadArgs<'a, M, T, K, F, R, L>) -> Result<Self, DecodeError> {
|
||||
let _ver = read_ver_prefix!(reader, SERIALIZATION_VERSION);
|
||||
|
||||
let genesis_hash: BlockHash = Readable::read(reader)?;
|
||||
|
@ -7096,6 +7139,7 @@ impl<'a, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref>
|
|||
fee_estimator: bounded_fee_estimator,
|
||||
chain_monitor: args.chain_monitor,
|
||||
tx_broadcaster: args.tx_broadcaster,
|
||||
router: args.router,
|
||||
|
||||
best_block: RwLock::new(BestBlock::new(best_block_hash, best_block_height)),
|
||||
|
||||
|
@ -7481,7 +7525,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();
|
||||
|
@ -7526,7 +7570,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();
|
||||
|
@ -7754,7 +7798,8 @@ 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::TestLogger>,
|
||||
&'a test_utils::TestFeeEstimator, &'a test_utils::TestRouter<'a>,
|
||||
&'a test_utils::TestLogger>,
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
|
@ -7772,15 +7817,16 @@ 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 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);
|
||||
let node_a = ChannelManager::new(&fee_estimator, &chain_monitor_a, &tx_broadcaster, &logger_a, &keys_manager_a, config.clone(), ChainParameters {
|
||||
let node_a = ChannelManager::new(&fee_estimator, &chain_monitor_a, &tx_broadcaster, &router, &logger_a, &keys_manager_a, config.clone(), ChainParameters {
|
||||
network,
|
||||
best_block: BestBlock::from_genesis(network),
|
||||
});
|
||||
|
@ -7790,7 +7836,7 @@ pub mod bench {
|
|||
let chain_monitor_b = ChainMonitor::new(None, &tx_broadcaster, &logger_a, &fee_estimator, &persister_b);
|
||||
let seed_b = [2u8; 32];
|
||||
let keys_manager_b = KeysManager::new(&seed_b, 42, 42);
|
||||
let node_b = ChannelManager::new(&fee_estimator, &chain_monitor_b, &tx_broadcaster, &logger_b, &keys_manager_b, config.clone(), ChainParameters {
|
||||
let node_b = ChannelManager::new(&fee_estimator, &chain_monitor_b, &tx_broadcaster, &router, &logger_b, &keys_manager_b, config.clone(), ChainParameters {
|
||||
network,
|
||||
best_block: BestBlock::from_genesis(network),
|
||||
});
|
||||
|
|
|
@ -301,10 +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<'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,
|
||||
}
|
||||
|
@ -313,10 +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<'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::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>>,
|
||||
|
@ -354,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();
|
||||
|
@ -383,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
|
||||
|
@ -415,10 +418,11 @@ impl<'a, 'b, 'c> Drop for Node<'a, 'b, 'c> {
|
|||
|
||||
let mut w = test_utils::TestVecWriter(Vec::new());
|
||||
self.node.write(&mut w).unwrap();
|
||||
<(BlockHash, ChannelManager<&test_utils::TestChainMonitor, &test_utils::TestBroadcaster, &test_utils::TestKeysInterface, &test_utils::TestFeeEstimator, &test_utils::TestLogger>)>::read(&mut io::Cursor::new(w.0), ChannelManagerReadArgs {
|
||||
<(BlockHash, ChannelManager<&test_utils::TestChainMonitor, &test_utils::TestBroadcaster, &test_utils::TestKeysInterface, &test_utils::TestFeeEstimator, &test_utils::TestRouter, &test_utils::TestLogger>)>::read(&mut io::Cursor::new(w.0), ChannelManagerReadArgs {
|
||||
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::new(Arc::new(network_graph)),
|
||||
chain_monitor: self.chain_monitor,
|
||||
tx_broadcaster: &broadcaster,
|
||||
logger: &self.logger,
|
||||
|
@ -655,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::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[..];
|
||||
|
@ -671,10 +675,11 @@ pub fn _reload_node<'a, 'b, 'c, 'd>(node: &'a Node<'b, 'c, 'd>, default_config:
|
|||
for monitor in monitors_read.iter_mut() {
|
||||
assert!(channel_monitors.insert(monitor.get_funding_txo().0, monitor).is_none());
|
||||
}
|
||||
<(BlockHash, ChannelManager<&test_utils::TestChainMonitor, &test_utils::TestBroadcaster, &test_utils::TestKeysInterface, &test_utils::TestFeeEstimator, &test_utils::TestLogger>)>::read(&mut node_read, ChannelManagerReadArgs {
|
||||
<(BlockHash, ChannelManager<&test_utils::TestChainMonitor, &test_utils::TestBroadcaster, &test_utils::TestKeysInterface, &test_utils::TestFeeEstimator, &test_utils::TestRouter, &test_utils::TestLogger>)>::read(&mut node_read, ChannelManagerReadArgs {
|
||||
default_config,
|
||||
keys_manager: node.keys_manager,
|
||||
fee_estimator: node.fee_estimator,
|
||||
router: node.router,
|
||||
chain_monitor: node.chain_monitor,
|
||||
tx_broadcaster: node.tx_broadcaster,
|
||||
logger: node.logger,
|
||||
|
@ -2152,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
|
||||
|
@ -2163,17 +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::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,
|
||||
});
|
||||
}
|
||||
|
||||
|
@ -2196,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, &'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;
|
||||
|
@ -2204,7 +2211,7 @@ pub fn create_node_chanmgrs<'a, 'b>(node_count: usize, cfgs: &'a Vec<NodeCfg<'b>
|
|||
network,
|
||||
best_block: BestBlock::from_genesis(network),
|
||||
};
|
||||
let node = ChannelManager::new(cfgs[i].fee_estimator, &cfgs[i].chain_monitor, cfgs[i].tx_broadcaster, cfgs[i].logger, cfgs[i].keys_manager,
|
||||
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,
|
||||
if node_config[i].is_some() { node_config[i].clone().unwrap() } else { test_default_channel_config() }, params);
|
||||
chanmgrs.push(node);
|
||||
}
|
||||
|
@ -2212,19 +2219,19 @@ pub fn create_node_chanmgrs<'a, 'b>(node_count: usize, cfgs: &'a Vec<NodeCfg<'b>
|
|||
chanmgrs
|
||||
}
|
||||
|
||||
pub fn create_network<'a, 'b: 'a, 'c: 'b>(node_count: usize, cfgs: &'b Vec<NodeCfg<'c>>, chan_mgrs: &'a Vec<ChannelManager<&'b TestChainMonitor<'c>, &'c test_utils::TestBroadcaster, &'b test_utils::TestKeysInterface, &'c test_utils::TestFeeEstimator, &'c test_utils::TestLogger>>) -> Vec<Node<'a, 'b, 'c>> {
|
||||
pub fn create_network<'a, 'b: 'a, 'c: 'b>(node_count: usize, cfgs: &'b Vec<NodeCfg<'c>>, chan_mgrs: &'a Vec<ChannelManager<&'b TestChainMonitor<'c>, &'c test_utils::TestBroadcaster, &'b test_utils::TestKeysInterface, &'c test_utils::TestFeeEstimator, &'c test_utils::TestRouter, &'c test_utils::TestLogger>>) -> Vec<Node<'a, 'b, 'c>> {
|
||||
let mut nodes = Vec::new();
|
||||
let chan_count = Rc::new(RefCell::new(0));
|
||||
let payment_count = Rc::new(RefCell::new(0));
|
||||
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,
|
||||
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,9 @@ 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 network_graph = NetworkGraph::new(chanmon_cfgs[0].chain_source.genesis_hash, &chanmon_cfgs[0].logger);
|
||||
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, chain_monitor, keys_manager: &keys_manager, network_graph, node_seed: seed, features: channelmanager::provided_init_features() };
|
||||
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);
|
||||
node_cfgs.insert(0, node);
|
||||
|
@ -9072,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 {
|
||||
|
@ -9113,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();
|
||||
|
|
|
@ -367,7 +367,7 @@ fn do_retry_with_no_persist(confirm_before_reload: bool) {
|
|||
let node_chanmgrs = create_node_chanmgrs(3, &node_cfgs, &[None, None, None]);
|
||||
let persister: test_utils::TestPersister;
|
||||
let new_chain_monitor: test_utils::TestChainMonitor;
|
||||
let nodes_0_deserialized: ChannelManager<&test_utils::TestChainMonitor, &test_utils::TestBroadcaster, &test_utils::TestKeysInterface, &test_utils::TestFeeEstimator, &test_utils::TestLogger>;
|
||||
let nodes_0_deserialized: ChannelManager<&test_utils::TestChainMonitor, &test_utils::TestBroadcaster, &test_utils::TestKeysInterface, &test_utils::TestFeeEstimator, &test_utils::TestRouter, &test_utils::TestLogger>;
|
||||
let mut nodes = create_network(3, &node_cfgs, &node_chanmgrs);
|
||||
|
||||
let chan_id = create_announced_chan_between_nodes(&nodes, 0, 1, channelmanager::provided_init_features(), channelmanager::provided_init_features()).2;
|
||||
|
@ -545,13 +545,13 @@ fn do_test_completed_payment_not_retryable_on_reload(use_dust: bool) {
|
|||
|
||||
let first_persister: test_utils::TestPersister;
|
||||
let first_new_chain_monitor: test_utils::TestChainMonitor;
|
||||
let first_nodes_0_deserialized: ChannelManager<&test_utils::TestChainMonitor, &test_utils::TestBroadcaster, &test_utils::TestKeysInterface, &test_utils::TestFeeEstimator, &test_utils::TestLogger>;
|
||||
let first_nodes_0_deserialized: ChannelManager<&test_utils::TestChainMonitor, &test_utils::TestBroadcaster, &test_utils::TestKeysInterface, &test_utils::TestFeeEstimator, &test_utils::TestRouter, &test_utils::TestLogger>;
|
||||
let second_persister: test_utils::TestPersister;
|
||||
let second_new_chain_monitor: test_utils::TestChainMonitor;
|
||||
let second_nodes_0_deserialized: ChannelManager<&test_utils::TestChainMonitor, &test_utils::TestBroadcaster, &test_utils::TestKeysInterface, &test_utils::TestFeeEstimator, &test_utils::TestLogger>;
|
||||
let second_nodes_0_deserialized: ChannelManager<&test_utils::TestChainMonitor, &test_utils::TestBroadcaster, &test_utils::TestKeysInterface, &test_utils::TestFeeEstimator, &test_utils::TestRouter, &test_utils::TestLogger>;
|
||||
let third_persister: test_utils::TestPersister;
|
||||
let third_new_chain_monitor: test_utils::TestChainMonitor;
|
||||
let third_nodes_0_deserialized: ChannelManager<&test_utils::TestChainMonitor, &test_utils::TestBroadcaster, &test_utils::TestKeysInterface, &test_utils::TestFeeEstimator, &test_utils::TestLogger>;
|
||||
let third_nodes_0_deserialized: ChannelManager<&test_utils::TestChainMonitor, &test_utils::TestBroadcaster, &test_utils::TestKeysInterface, &test_utils::TestFeeEstimator, &test_utils::TestRouter, &test_utils::TestLogger>;
|
||||
|
||||
let mut nodes = create_network(3, &node_cfgs, &node_chanmgrs);
|
||||
|
||||
|
@ -716,7 +716,7 @@ fn do_test_dup_htlc_onchain_fails_on_reload(persist_manager_post_event: bool, co
|
|||
let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
|
||||
let persister: test_utils::TestPersister;
|
||||
let new_chain_monitor: test_utils::TestChainMonitor;
|
||||
let nodes_0_deserialized: ChannelManager<&test_utils::TestChainMonitor, &test_utils::TestBroadcaster, &test_utils::TestKeysInterface, &test_utils::TestFeeEstimator, &test_utils::TestLogger>;
|
||||
let nodes_0_deserialized: ChannelManager<&test_utils::TestChainMonitor, &test_utils::TestBroadcaster, &test_utils::TestKeysInterface, &test_utils::TestFeeEstimator, &test_utils::TestRouter, &test_utils::TestLogger>;
|
||||
let mut nodes = create_network(2, &node_cfgs, &node_chanmgrs);
|
||||
|
||||
let (_, _, chan_id, funding_tx) = create_announced_chan_between_nodes(&nodes, 0, 1, channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
|
@ -859,7 +859,7 @@ fn test_fulfill_restart_failure() {
|
|||
let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
|
||||
let persister: test_utils::TestPersister;
|
||||
let new_chain_monitor: test_utils::TestChainMonitor;
|
||||
let nodes_1_deserialized: ChannelManager<&test_utils::TestChainMonitor, &test_utils::TestBroadcaster, &test_utils::TestKeysInterface, &test_utils::TestFeeEstimator, &test_utils::TestLogger>;
|
||||
let nodes_1_deserialized: ChannelManager<&test_utils::TestChainMonitor, &test_utils::TestBroadcaster, &test_utils::TestKeysInterface, &test_utils::TestFeeEstimator, &test_utils::TestRouter, &test_utils::TestLogger>;
|
||||
let mut nodes = create_network(2, &node_cfgs, &node_chanmgrs);
|
||||
|
||||
let chan_id = create_announced_chan_between_nodes(&nodes, 0, 1, channelmanager::provided_init_features(), channelmanager::provided_init_features()).2;
|
||||
|
|
|
@ -501,7 +501,7 @@ pub type SimpleArcPeerManager<SD, M, T, F, C, L> = PeerManager<SD, Arc<SimpleArc
|
|||
/// helps with issues such as long function definitions.
|
||||
///
|
||||
/// (C-not exported) as general type aliases don't make sense in bindings.
|
||||
pub type SimpleRefPeerManager<'a, 'b, 'c, 'd, 'e, 'f, 'g, 'h, 'i, 'j, 'k, SD, M, T, F, C, L> = PeerManager<SD, SimpleRefChannelManager<'a, 'b, 'c, 'd, 'e, M, T, F, L>, &'e P2PGossipSync<&'g NetworkGraph<&'f L>, &'h C, &'f L>, &'i SimpleRefOnionMessenger<'j, 'k, L>, &'f L, IgnoringMessageHandler>;
|
||||
pub type SimpleRefPeerManager<'a, 'b, 'c, 'd, 'e, 'f, 'g, 'h, 'i, 'j, 'k, 'l, 'm, SD, M, T, F, C, L> = PeerManager<SD, SimpleRefChannelManager<'a, 'b, 'c, 'd, 'e, 'f, 'g, 'm, M, T, F, L>, &'f P2PGossipSync<&'g NetworkGraph<&'f L>, &'h C, &'f L>, &'i SimpleRefOnionMessenger<'j, 'k, L>, &'f L, IgnoringMessageHandler>;
|
||||
|
||||
/// A PeerManager manages a set of peers, described by their [`SocketDescriptor`] and marshalls
|
||||
/// socket events into messages which it passes on to its [`MessageHandler`].
|
||||
|
|
|
@ -48,7 +48,7 @@ fn test_priv_forwarding_rejection() {
|
|||
let node_chanmgrs = create_node_chanmgrs(3, &node_cfgs, &[None, Some(no_announce_cfg), None]);
|
||||
let persister: test_utils::TestPersister;
|
||||
let new_chain_monitor: test_utils::TestChainMonitor;
|
||||
let nodes_1_deserialized: ChannelManager<&test_utils::TestChainMonitor, &test_utils::TestBroadcaster, &test_utils::TestKeysInterface, &test_utils::TestFeeEstimator, &test_utils::TestLogger>;
|
||||
let nodes_1_deserialized: ChannelManager<&test_utils::TestChainMonitor, &test_utils::TestBroadcaster, &test_utils::TestKeysInterface, &test_utils::TestFeeEstimator, &test_utils::TestRouter, &test_utils::TestLogger>;
|
||||
let mut nodes = create_network(3, &node_cfgs, &node_chanmgrs);
|
||||
|
||||
let chan_id_1 = create_announced_chan_between_nodes_with_value(&nodes, 0, 1, 1_000_000, 500_000_000, channelmanager::provided_init_features(), channelmanager::provided_init_features()).2;
|
||||
|
|
|
@ -40,7 +40,7 @@ fn test_funding_peer_disconnect() {
|
|||
let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
|
||||
let persister: test_utils::TestPersister;
|
||||
let new_chain_monitor: test_utils::TestChainMonitor;
|
||||
let nodes_0_deserialized: ChannelManager<&test_utils::TestChainMonitor, &test_utils::TestBroadcaster, &test_utils::TestKeysInterface, &test_utils::TestFeeEstimator, &test_utils::TestLogger>;
|
||||
let nodes_0_deserialized: ChannelManager<&test_utils::TestChainMonitor, &test_utils::TestBroadcaster, &test_utils::TestKeysInterface, &test_utils::TestFeeEstimator, &test_utils::TestRouter, &test_utils::TestLogger>;
|
||||
let mut nodes = create_network(2, &node_cfgs, &node_chanmgrs);
|
||||
let tx = create_chan_between_nodes_with_value_init(&nodes[0], &nodes[1], 100000, 10001, channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
|
||||
|
@ -185,7 +185,7 @@ fn test_no_txn_manager_serialize_deserialize() {
|
|||
let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
|
||||
let persister: test_utils::TestPersister;
|
||||
let new_chain_monitor: test_utils::TestChainMonitor;
|
||||
let nodes_0_deserialized: ChannelManager<&test_utils::TestChainMonitor, &test_utils::TestBroadcaster, &test_utils::TestKeysInterface, &test_utils::TestFeeEstimator, &test_utils::TestLogger>;
|
||||
let nodes_0_deserialized: ChannelManager<&test_utils::TestChainMonitor, &test_utils::TestBroadcaster, &test_utils::TestKeysInterface, &test_utils::TestFeeEstimator, &test_utils::TestRouter, &test_utils::TestLogger>;
|
||||
let mut nodes = create_network(2, &node_cfgs, &node_chanmgrs);
|
||||
|
||||
let tx = create_chan_between_nodes_with_value_init(&nodes[0], &nodes[1], 100000, 10001, channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
|
@ -225,7 +225,7 @@ fn test_manager_serialize_deserialize_events() {
|
|||
let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
|
||||
let persister: test_utils::TestPersister;
|
||||
let new_chain_monitor: test_utils::TestChainMonitor;
|
||||
let nodes_0_deserialized: ChannelManager<&test_utils::TestChainMonitor, &test_utils::TestBroadcaster, &test_utils::TestKeysInterface, &test_utils::TestFeeEstimator, &test_utils::TestLogger>;
|
||||
let nodes_0_deserialized: ChannelManager<&test_utils::TestChainMonitor, &test_utils::TestBroadcaster, &test_utils::TestKeysInterface, &test_utils::TestFeeEstimator, &test_utils::TestRouter, &test_utils::TestLogger>;
|
||||
let mut nodes = create_network(2, &node_cfgs, &node_chanmgrs);
|
||||
|
||||
// Start creating a channel, but stop right before broadcasting the funding transaction
|
||||
|
@ -308,7 +308,7 @@ fn test_simple_manager_serialize_deserialize() {
|
|||
let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
|
||||
let persister: test_utils::TestPersister;
|
||||
let new_chain_monitor: test_utils::TestChainMonitor;
|
||||
let nodes_0_deserialized: ChannelManager<&test_utils::TestChainMonitor, &test_utils::TestBroadcaster, &test_utils::TestKeysInterface, &test_utils::TestFeeEstimator, &test_utils::TestLogger>;
|
||||
let nodes_0_deserialized: ChannelManager<&test_utils::TestChainMonitor, &test_utils::TestBroadcaster, &test_utils::TestKeysInterface, &test_utils::TestFeeEstimator, &test_utils::TestRouter, &test_utils::TestLogger>;
|
||||
let mut nodes = create_network(2, &node_cfgs, &node_chanmgrs);
|
||||
let chan_id = create_announced_chan_between_nodes(&nodes, 0, 1, channelmanager::provided_init_features(), channelmanager::provided_init_features()).2;
|
||||
|
||||
|
@ -336,7 +336,7 @@ fn test_manager_serialize_deserialize_inconsistent_monitor() {
|
|||
let fee_estimator: test_utils::TestFeeEstimator;
|
||||
let persister: test_utils::TestPersister;
|
||||
let new_chain_monitor: test_utils::TestChainMonitor;
|
||||
let nodes_0_deserialized: ChannelManager<&test_utils::TestChainMonitor, &test_utils::TestBroadcaster, &test_utils::TestKeysInterface, &test_utils::TestFeeEstimator, &test_utils::TestLogger>;
|
||||
let nodes_0_deserialized: ChannelManager<&test_utils::TestChainMonitor, &test_utils::TestBroadcaster, &test_utils::TestKeysInterface, &test_utils::TestFeeEstimator, &test_utils::TestRouter, &test_utils::TestLogger>;
|
||||
let mut nodes = create_network(4, &node_cfgs, &node_chanmgrs);
|
||||
let chan_id_1 = create_announced_chan_between_nodes(&nodes, 0, 1, channelmanager::provided_init_features(), channelmanager::provided_init_features()).2;
|
||||
let chan_id_2 = create_announced_chan_between_nodes(&nodes, 2, 0, channelmanager::provided_init_features(), channelmanager::provided_init_features()).2;
|
||||
|
@ -392,10 +392,11 @@ fn test_manager_serialize_deserialize_inconsistent_monitor() {
|
|||
|
||||
let mut nodes_0_read = &nodes_0_serialized[..];
|
||||
if let Err(msgs::DecodeError::InvalidValue) =
|
||||
<(BlockHash, ChannelManager<&test_utils::TestChainMonitor, &test_utils::TestBroadcaster, &test_utils::TestKeysInterface, &test_utils::TestFeeEstimator, &test_utils::TestLogger>)>::read(&mut nodes_0_read, ChannelManagerReadArgs {
|
||||
<(BlockHash, ChannelManager<&test_utils::TestChainMonitor, &test_utils::TestBroadcaster, &test_utils::TestKeysInterface, &test_utils::TestFeeEstimator, &test_utils::TestRouter, &test_utils::TestLogger>)>::read(&mut nodes_0_read, ChannelManagerReadArgs {
|
||||
default_config: UserConfig::default(),
|
||||
keys_manager,
|
||||
fee_estimator: &fee_estimator,
|
||||
router: &nodes[0].router,
|
||||
chain_monitor: nodes[0].chain_monitor,
|
||||
tx_broadcaster: nodes[0].tx_broadcaster.clone(),
|
||||
logger: &logger,
|
||||
|
@ -406,10 +407,11 @@ fn test_manager_serialize_deserialize_inconsistent_monitor() {
|
|||
|
||||
let mut nodes_0_read = &nodes_0_serialized[..];
|
||||
let (_, nodes_0_deserialized_tmp) =
|
||||
<(BlockHash, ChannelManager<&test_utils::TestChainMonitor, &test_utils::TestBroadcaster, &test_utils::TestKeysInterface, &test_utils::TestFeeEstimator, &test_utils::TestLogger>)>::read(&mut nodes_0_read, ChannelManagerReadArgs {
|
||||
<(BlockHash, ChannelManager<&test_utils::TestChainMonitor, &test_utils::TestBroadcaster, &test_utils::TestKeysInterface, &test_utils::TestFeeEstimator, &test_utils::TestRouter, &test_utils::TestLogger>)>::read(&mut nodes_0_read, ChannelManagerReadArgs {
|
||||
default_config: UserConfig::default(),
|
||||
keys_manager,
|
||||
fee_estimator: &fee_estimator,
|
||||
router: nodes[0].router,
|
||||
chain_monitor: nodes[0].chain_monitor,
|
||||
tx_broadcaster: nodes[0].tx_broadcaster.clone(),
|
||||
logger: &logger,
|
||||
|
@ -589,7 +591,7 @@ fn test_forwardable_regen() {
|
|||
let node_chanmgrs = create_node_chanmgrs(3, &node_cfgs, &[None, None, None]);
|
||||
let persister: test_utils::TestPersister;
|
||||
let new_chain_monitor: test_utils::TestChainMonitor;
|
||||
let nodes_1_deserialized: ChannelManager<&test_utils::TestChainMonitor, &test_utils::TestBroadcaster, &test_utils::TestKeysInterface, &test_utils::TestFeeEstimator, &test_utils::TestLogger>;
|
||||
let nodes_1_deserialized: ChannelManager<&test_utils::TestChainMonitor, &test_utils::TestBroadcaster, &test_utils::TestKeysInterface, &test_utils::TestFeeEstimator, &test_utils::TestRouter, &test_utils::TestLogger>;
|
||||
let mut nodes = create_network(3, &node_cfgs, &node_chanmgrs);
|
||||
let chan_id_1 = create_announced_chan_between_nodes(&nodes, 0, 1, channelmanager::provided_init_features(), channelmanager::provided_init_features()).2;
|
||||
let chan_id_2 = create_announced_chan_between_nodes(&nodes, 1, 2, channelmanager::provided_init_features(), channelmanager::provided_init_features()).2;
|
||||
|
@ -673,7 +675,7 @@ fn do_test_partial_claim_before_restart(persist_both_monitors: bool) {
|
|||
|
||||
let persister: test_utils::TestPersister;
|
||||
let new_chain_monitor: test_utils::TestChainMonitor;
|
||||
let nodes_3_deserialized: ChannelManager<&test_utils::TestChainMonitor, &test_utils::TestBroadcaster, &test_utils::TestKeysInterface, &test_utils::TestFeeEstimator, &test_utils::TestLogger>;
|
||||
let nodes_3_deserialized: ChannelManager<&test_utils::TestChainMonitor, &test_utils::TestBroadcaster, &test_utils::TestKeysInterface, &test_utils::TestFeeEstimator, &test_utils::TestRouter, &test_utils::TestLogger>;
|
||||
|
||||
let mut nodes = create_network(4, &node_cfgs, &node_chanmgrs);
|
||||
|
||||
|
|
|
@ -260,7 +260,7 @@ fn do_test_unconf_chan(reload_node: bool, reorg_after_reload: bool, use_funding_
|
|||
let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
|
||||
let persister: test_utils::TestPersister;
|
||||
let new_chain_monitor: test_utils::TestChainMonitor;
|
||||
let nodes_0_deserialized: ChannelManager<&test_utils::TestChainMonitor, &test_utils::TestBroadcaster, &test_utils::TestKeysInterface, &test_utils::TestFeeEstimator, &test_utils::TestLogger>;
|
||||
let nodes_0_deserialized: ChannelManager<&test_utils::TestChainMonitor, &test_utils::TestBroadcaster, &test_utils::TestKeysInterface, &test_utils::TestFeeEstimator, &test_utils::TestRouter, &test_utils::TestLogger>;
|
||||
let mut nodes = create_network(2, &node_cfgs, &node_chanmgrs);
|
||||
*nodes[0].connect_style.borrow_mut() = connect_style;
|
||||
|
||||
|
|
|
@ -61,7 +61,7 @@ impl<G: Deref<Target = NetworkGraph<L>>, L: Deref, S: Deref> Router for DefaultR
|
|||
{
|
||||
fn find_route(
|
||||
&self, payer: &PublicKey, params: &RouteParameters, first_hops: Option<&[&ChannelDetails]>,
|
||||
inflight_htlcs: InFlightHtlcs
|
||||
inflight_htlcs: &InFlightHtlcs
|
||||
) -> Result<Route, LightningError> {
|
||||
let random_seed_bytes = {
|
||||
let mut locked_random_seed_bytes = self.random_seed_bytes.lock().unwrap();
|
||||
|
@ -98,13 +98,13 @@ pub trait Router {
|
|||
/// Finds a [`Route`] between `payer` and `payee` for a payment with the given values.
|
||||
fn find_route(
|
||||
&self, payer: &PublicKey, route_params: &RouteParameters,
|
||||
first_hops: Option<&[&ChannelDetails]>, inflight_htlcs: InFlightHtlcs
|
||||
first_hops: Option<&[&ChannelDetails]>, inflight_htlcs: &InFlightHtlcs
|
||||
) -> Result<Route, LightningError>;
|
||||
/// Finds a [`Route`] between `payer` and `payee` for a payment with the given values. Includes
|
||||
/// `PaymentHash` and `PaymentId` to be able to correlate the request with a specific payment.
|
||||
fn find_route_with_id(
|
||||
&self, payer: &PublicKey, route_params: &RouteParameters,
|
||||
first_hops: Option<&[&ChannelDetails]>, inflight_htlcs: InFlightHtlcs,
|
||||
first_hops: Option<&[&ChannelDetails]>, inflight_htlcs: &InFlightHtlcs,
|
||||
_payment_hash: PaymentHash, _payment_id: PaymentId
|
||||
) -> Result<Route, LightningError> {
|
||||
self.find_route(payer, route_params, first_hops, inflight_htlcs)
|
||||
|
@ -125,15 +125,15 @@ pub trait Router {
|
|||
/// [`find_route`].
|
||||
///
|
||||
/// [`Score`]: crate::routing::scoring::Score
|
||||
pub struct ScorerAccountingForInFlightHtlcs<S: Score> {
|
||||
pub struct ScorerAccountingForInFlightHtlcs<'a, S: Score> {
|
||||
scorer: S,
|
||||
// Maps a channel's short channel id and its direction to the liquidity used up.
|
||||
inflight_htlcs: InFlightHtlcs,
|
||||
inflight_htlcs: &'a InFlightHtlcs,
|
||||
}
|
||||
|
||||
impl<S: Score> ScorerAccountingForInFlightHtlcs<S> {
|
||||
impl<'a, S: Score> ScorerAccountingForInFlightHtlcs<'a, S> {
|
||||
/// Initialize a new `ScorerAccountingForInFlightHtlcs`.
|
||||
pub fn new(scorer: S, inflight_htlcs: InFlightHtlcs) -> Self {
|
||||
pub fn new(scorer: S, inflight_htlcs: &'a InFlightHtlcs) -> Self {
|
||||
ScorerAccountingForInFlightHtlcs {
|
||||
scorer,
|
||||
inflight_htlcs
|
||||
|
@ -142,11 +142,11 @@ impl<S: Score> ScorerAccountingForInFlightHtlcs<S> {
|
|||
}
|
||||
|
||||
#[cfg(c_bindings)]
|
||||
impl<S: Score> Writeable for ScorerAccountingForInFlightHtlcs<S> {
|
||||
impl<'a, S: Score> Writeable for ScorerAccountingForInFlightHtlcs<'a, S> {
|
||||
fn write<W: Writer>(&self, writer: &mut W) -> Result<(), io::Error> { self.scorer.write(writer) }
|
||||
}
|
||||
|
||||
impl<S: Score> Score for ScorerAccountingForInFlightHtlcs<S> {
|
||||
impl<'a, S: Score> Score for ScorerAccountingForInFlightHtlcs<'a, S> {
|
||||
fn channel_penalty_msat(&self, short_channel_id: u64, source: &NodeId, target: &NodeId, usage: ChannelUsage) -> u64 {
|
||||
if let Some(used_liquidity) = self.inflight_htlcs.used_liquidity_msat(
|
||||
source, target, short_channel_id
|
||||
|
|
|
@ -20,6 +20,7 @@ use crate::chain::keysinterface::{Sign, KeysInterface, SignerProvider};
|
|||
use crate::chain::transaction::OutPoint;
|
||||
use crate::chain::channelmonitor::{ChannelMonitor, ChannelMonitorUpdate};
|
||||
use crate::ln::channelmanager::ChannelManager;
|
||||
use crate::routing::router::Router;
|
||||
use crate::routing::gossip::NetworkGraph;
|
||||
use super::{logger::Logger, ser::Writeable};
|
||||
|
||||
|
@ -33,15 +34,16 @@ pub trait KVStorePersister {
|
|||
}
|
||||
|
||||
/// Trait that handles persisting a [`ChannelManager`], [`NetworkGraph`], and [`WriteableScore`] to disk.
|
||||
pub trait Persister<'a, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref, S: WriteableScore<'a>>
|
||||
pub trait Persister<'a, M: Deref, T: Deref, K: Deref, F: Deref, R: Deref, L: Deref, S: WriteableScore<'a>>
|
||||
where M::Target: 'static + chain::Watch<<K::Target as SignerProvider>::Signer>,
|
||||
T::Target: 'static + BroadcasterInterface,
|
||||
K::Target: 'static + KeysInterface,
|
||||
F::Target: 'static + FeeEstimator,
|
||||
R::Target: 'static + Router,
|
||||
L::Target: 'static + Logger,
|
||||
{
|
||||
/// Persist the given ['ChannelManager'] to disk, returning an error if persistence failed.
|
||||
fn persist_manager(&self, channel_manager: &ChannelManager<M, T, K, F, L>) -> Result<(), io::Error>;
|
||||
fn persist_manager(&self, channel_manager: &ChannelManager<M, T, K, F, R, L>) -> Result<(), io::Error>;
|
||||
|
||||
/// Persist the given [`NetworkGraph`] to disk, returning an error if persistence failed.
|
||||
fn persist_graph(&self, network_graph: &NetworkGraph<L>) -> Result<(), io::Error>;
|
||||
|
@ -50,15 +52,16 @@ pub trait Persister<'a, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref, S: Wri
|
|||
fn persist_scorer(&self, scorer: &S) -> Result<(), io::Error>;
|
||||
}
|
||||
|
||||
impl<'a, A: KVStorePersister, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref, S: WriteableScore<'a>> Persister<'a, M, T, K, F, L, S> for A
|
||||
impl<'a, A: KVStorePersister, M: Deref, T: Deref, K: Deref, F: Deref, R: Deref, L: Deref, S: WriteableScore<'a>> Persister<'a, M, T, K, F, R, L, S> for A
|
||||
where M::Target: 'static + chain::Watch<<K::Target as SignerProvider>::Signer>,
|
||||
T::Target: 'static + BroadcasterInterface,
|
||||
K::Target: 'static + KeysInterface,
|
||||
F::Target: 'static + FeeEstimator,
|
||||
R::Target: 'static + Router,
|
||||
L::Target: 'static + Logger,
|
||||
{
|
||||
/// Persist the given ['ChannelManager'] to disk with the name "manager", returning an error if persistence failed.
|
||||
fn persist_manager(&self, channel_manager: &ChannelManager<M, T, K, F, L>) -> Result<(), io::Error> {
|
||||
fn persist_manager(&self, channel_manager: &ChannelManager<M, T, K, F, R, L>) -> Result<(), io::Error> {
|
||||
self.persist("manager", channel_manager)
|
||||
}
|
||||
|
||||
|
|
|
@ -11,6 +11,9 @@ macro_rules! encode_tlv {
|
|||
($stream: expr, $type: expr, $field: expr, (default_value, $default: expr)) => {
|
||||
encode_tlv!($stream, $type, $field, required)
|
||||
};
|
||||
($stream: expr, $type: expr, $field: expr, (static_value, $value: expr)) => {
|
||||
let _ = &$field; // Ensure we "use" the $field
|
||||
};
|
||||
($stream: expr, $type: expr, $field: expr, required) => {
|
||||
BigSize($type).write($stream)?;
|
||||
BigSize($field.serialized_length() as u64).write($stream)?;
|
||||
|
@ -34,6 +37,17 @@ macro_rules! encode_tlv {
|
|||
};
|
||||
}
|
||||
|
||||
|
||||
macro_rules! check_encoded_tlv_order {
|
||||
($last_type: expr, $type: expr, (static_value, $value: expr)) => { };
|
||||
($last_type: expr, $type: expr, $fieldty: tt) => {
|
||||
if let Some(t) = $last_type {
|
||||
debug_assert!(t <= $type);
|
||||
}
|
||||
$last_type = Some($type);
|
||||
};
|
||||
}
|
||||
|
||||
macro_rules! encode_tlv_stream {
|
||||
($stream: expr, {$(($type: expr, $field: expr, $fieldty: tt)),* $(,)*}) => { {
|
||||
#[allow(unused_imports)]
|
||||
|
@ -52,10 +66,7 @@ macro_rules! encode_tlv_stream {
|
|||
{
|
||||
let mut last_seen: Option<u64> = None;
|
||||
$(
|
||||
if let Some(t) = last_seen {
|
||||
debug_assert!(t <= $type);
|
||||
}
|
||||
last_seen = Some($type);
|
||||
check_encoded_tlv_order!(last_seen, $type, $fieldty);
|
||||
)*
|
||||
}
|
||||
} }
|
||||
|
@ -65,6 +76,8 @@ macro_rules! get_varint_length_prefixed_tlv_length {
|
|||
($len: expr, $type: expr, $field: expr, (default_value, $default: expr)) => {
|
||||
get_varint_length_prefixed_tlv_length!($len, $type, $field, required)
|
||||
};
|
||||
($len: expr, $type: expr, $field: expr, (static_value, $value: expr)) => {
|
||||
};
|
||||
($len: expr, $type: expr, $field: expr, required) => {
|
||||
BigSize($type).write(&mut $len).expect("No in-memory data may fail to serialize");
|
||||
let field_len = $field.serialized_length();
|
||||
|
@ -100,7 +113,7 @@ macro_rules! encode_varint_length_prefixed_tlv {
|
|||
} }
|
||||
}
|
||||
|
||||
macro_rules! check_tlv_order {
|
||||
macro_rules! check_decoded_tlv_order {
|
||||
($last_seen_type: expr, $typ: expr, $type: expr, $field: ident, (default_value, $default: expr)) => {{
|
||||
#[allow(unused_comparisons)] // Note that $type may be 0 making the second comparison always true
|
||||
let invalid_order = ($last_seen_type.is_none() || $last_seen_type.unwrap() < $type) && $typ.0 > $type;
|
||||
|
@ -108,6 +121,8 @@ macro_rules! check_tlv_order {
|
|||
$field = $default.into();
|
||||
}
|
||||
}};
|
||||
($last_seen_type: expr, $typ: expr, $type: expr, $field: ident, (static_value, $value: expr)) => {
|
||||
};
|
||||
($last_seen_type: expr, $typ: expr, $type: expr, $field: ident, required) => {{
|
||||
#[allow(unused_comparisons)] // Note that $type may be 0 making the second comparison always true
|
||||
let invalid_order = ($last_seen_type.is_none() || $last_seen_type.unwrap() < $type) && $typ.0 > $type;
|
||||
|
@ -140,6 +155,9 @@ macro_rules! check_missing_tlv {
|
|||
$field = $default.into();
|
||||
}
|
||||
}};
|
||||
($last_seen_type: expr, $type: expr, $field: expr, (static_value, $value: expr)) => {
|
||||
$field = $value;
|
||||
};
|
||||
($last_seen_type: expr, $type: expr, $field: ident, required) => {{
|
||||
#[allow(unused_comparisons)] // Note that $type may be 0 making the second comparison always true
|
||||
let missing_req_type = $last_seen_type.is_none() || $last_seen_type.unwrap() < $type;
|
||||
|
@ -168,6 +186,8 @@ macro_rules! decode_tlv {
|
|||
($reader: expr, $field: ident, (default_value, $default: expr)) => {{
|
||||
decode_tlv!($reader, $field, required)
|
||||
}};
|
||||
($reader: expr, $field: ident, (static_value, $value: expr)) => {{
|
||||
}};
|
||||
($reader: expr, $field: ident, required) => {{
|
||||
$field = $crate::util::ser::Readable::read(&mut $reader)?;
|
||||
}};
|
||||
|
@ -195,6 +215,11 @@ macro_rules! decode_tlv {
|
|||
}};
|
||||
}
|
||||
|
||||
macro_rules! _decode_tlv_stream_match_check {
|
||||
($val: ident, $type: expr, (static_value, $value: expr)) => { false };
|
||||
($val: ident, $type: expr, $fieldty: tt) => { $val == $type }
|
||||
}
|
||||
|
||||
// `$decode_custom_tlv` is a closure that may be optionally provided to handle custom message types.
|
||||
// If it is provided, it will be called with the custom type and the `FixedLengthReader` containing
|
||||
// the message contents. It should return `Ok(true)` if the custom message is successfully parsed,
|
||||
|
@ -256,7 +281,7 @@ macro_rules! decode_tlv_stream_range {
|
|||
}
|
||||
// As we read types, make sure we hit every required type:
|
||||
$({
|
||||
check_tlv_order!(last_seen_type, typ, $type, $field, $fieldty);
|
||||
check_decoded_tlv_order!(last_seen_type, typ, $type, $field, $fieldty);
|
||||
})*
|
||||
last_seen_type = Some(typ.0);
|
||||
|
||||
|
@ -264,7 +289,7 @@ macro_rules! decode_tlv_stream_range {
|
|||
let length: ser::BigSize = $crate::util::ser::Readable::read(&mut stream_ref)?;
|
||||
let mut s = ser::FixedLengthReader::new(&mut stream_ref, length.0);
|
||||
match typ.0 {
|
||||
$($type => {
|
||||
$(_t if _decode_tlv_stream_match_check!(_t, $type, $fieldty) => {
|
||||
decode_tlv!(s, $field, $fieldty);
|
||||
if s.bytes_remain() {
|
||||
s.eat_remaining()?; // Return ShortRead if there's actually not enough bytes
|
||||
|
@ -405,6 +430,9 @@ macro_rules! init_tlv_based_struct_field {
|
|||
($field: ident, (default_value, $default: expr)) => {
|
||||
$field.0.unwrap()
|
||||
};
|
||||
($field: ident, (static_value, $value: expr)) => {
|
||||
$field
|
||||
};
|
||||
($field: ident, option) => {
|
||||
$field
|
||||
};
|
||||
|
@ -420,6 +448,9 @@ macro_rules! init_tlv_field_var {
|
|||
($field: ident, (default_value, $default: expr)) => {
|
||||
let mut $field = $crate::util::ser::OptionDeserWrapper(None);
|
||||
};
|
||||
($field: ident, (static_value, $value: expr)) => {
|
||||
let $field;
|
||||
};
|
||||
($field: ident, required) => {
|
||||
let mut $field = $crate::util::ser::OptionDeserWrapper(None);
|
||||
};
|
||||
|
|
|
@ -21,6 +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::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;
|
||||
|
@ -71,6 +73,34 @@ impl chaininterface::FeeEstimator for TestFeeEstimator {
|
|||
}
|
||||
}
|
||||
|
||||
pub struct TestRouter<'a> {
|
||||
pub network_graph: Arc<NetworkGraph<&'a TestLogger>>,
|
||||
}
|
||||
|
||||
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
|
||||
) -> Result<Route, msgs::LightningError> {
|
||||
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]) {}
|
||||
fn notify_payment_probe_successful(&self, _path: &[&RouteHop]) {}
|
||||
fn notify_payment_probe_failed(&self, _path: &[&RouteHop], _short_channel_id: u64) {}
|
||||
}
|
||||
|
||||
pub struct OnlyReadsKeysInterface {}
|
||||
|
||||
impl EntropySource for OnlyReadsKeysInterface {
|
||||
|
@ -194,10 +224,9 @@ impl<'a> chain::Watch<EnforcingSigner> for TestChainMonitor<'a> {
|
|||
}
|
||||
|
||||
pub struct TestPersister {
|
||||
pub update_ret: Mutex<chain::ChannelMonitorUpdateStatus>,
|
||||
/// If this is set to Some(), after the next return, we'll always return this until update_ret
|
||||
/// is changed:
|
||||
pub next_update_ret: Mutex<Option<chain::ChannelMonitorUpdateStatus>>,
|
||||
/// The queue of update statuses we'll return. If none are queued, ::Completed will always be
|
||||
/// returned.
|
||||
pub update_rets: Mutex<VecDeque<chain::ChannelMonitorUpdateStatus>>,
|
||||
/// When we get an update_persisted_channel call with no ChannelMonitorUpdate, we insert the
|
||||
/// MonitorUpdateId here.
|
||||
pub chain_sync_monitor_persistences: Mutex<HashMap<OutPoint, HashSet<MonitorUpdateId>>>,
|
||||
|
@ -208,34 +237,29 @@ pub struct TestPersister {
|
|||
impl TestPersister {
|
||||
pub fn new() -> Self {
|
||||
Self {
|
||||
update_ret: Mutex::new(chain::ChannelMonitorUpdateStatus::Completed),
|
||||
next_update_ret: Mutex::new(None),
|
||||
update_rets: Mutex::new(VecDeque::new()),
|
||||
chain_sync_monitor_persistences: Mutex::new(HashMap::new()),
|
||||
offchain_monitor_updates: Mutex::new(HashMap::new()),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn set_update_ret(&self, ret: chain::ChannelMonitorUpdateStatus) {
|
||||
*self.update_ret.lock().unwrap() = ret;
|
||||
}
|
||||
|
||||
pub fn set_next_update_ret(&self, next_ret: Option<chain::ChannelMonitorUpdateStatus>) {
|
||||
*self.next_update_ret.lock().unwrap() = next_ret;
|
||||
/// Queue an update status to return.
|
||||
pub fn set_update_ret(&self, next_ret: chain::ChannelMonitorUpdateStatus) {
|
||||
self.update_rets.lock().unwrap().push_back(next_ret);
|
||||
}
|
||||
}
|
||||
impl<Signer: keysinterface::Sign> chainmonitor::Persist<Signer> for TestPersister {
|
||||
fn persist_new_channel(&self, _funding_txo: OutPoint, _data: &channelmonitor::ChannelMonitor<Signer>, _id: MonitorUpdateId) -> chain::ChannelMonitorUpdateStatus {
|
||||
let ret = self.update_ret.lock().unwrap().clone();
|
||||
if let Some(next_ret) = self.next_update_ret.lock().unwrap().take() {
|
||||
*self.update_ret.lock().unwrap() = next_ret;
|
||||
if let Some(update_ret) = self.update_rets.lock().unwrap().pop_front() {
|
||||
return update_ret
|
||||
}
|
||||
ret
|
||||
chain::ChannelMonitorUpdateStatus::Completed
|
||||
}
|
||||
|
||||
fn update_persisted_channel(&self, funding_txo: OutPoint, update: &Option<channelmonitor::ChannelMonitorUpdate>, _data: &channelmonitor::ChannelMonitor<Signer>, update_id: MonitorUpdateId) -> chain::ChannelMonitorUpdateStatus {
|
||||
let ret = self.update_ret.lock().unwrap().clone();
|
||||
if let Some(next_ret) = self.next_update_ret.lock().unwrap().take() {
|
||||
*self.update_ret.lock().unwrap() = next_ret;
|
||||
let mut ret = chain::ChannelMonitorUpdateStatus::Completed;
|
||||
if let Some(update_ret) = self.update_rets.lock().unwrap().pop_front() {
|
||||
ret = update_ret;
|
||||
}
|
||||
if update.is_none() {
|
||||
self.chain_sync_monitor_persistences.lock().unwrap().entry(funding_txo).or_insert(HashSet::new()).insert(update_id);
|
||||
|
|
Loading…
Add table
Reference in a new issue