Skip to content

Commit e1e7053

Browse files
Separate ChannelManager constructor methods for public vs private nodes
Public nodes are now required to provide a router, since they are expected to forward payments. In upcoming work, we will refuse to broadcast channel updates for private nodes. Also switch ValidatedBlockHeader::to_best_block from spaces to tabs
1 parent 7a4e690 commit e1e7053

File tree

6 files changed

+60
-21
lines changed

6 files changed

+60
-21
lines changed

fuzz/src/chanmon_consistency.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -396,7 +396,7 @@ pub fn do_test<Out: Output>(data: &[u8], underlying_out: Out) {
396396
network,
397397
best_block: BestBlock::from_genesis(network),
398398
};
399-
(ChannelManager::new($fee_estimator.clone(), monitor.clone(), broadcast.clone(), Some(router.clone()), Arc::clone(&logger), keys_manager.clone(), config, params),
399+
(ChannelManager::new_public($fee_estimator.clone(), monitor.clone(), broadcast.clone(), router.clone(), Arc::clone(&logger), keys_manager.clone(), config, params),
400400
monitor, keys_manager)
401401
} }
402402
}

fuzz/src/full_stack.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -414,7 +414,7 @@ pub fn do_test(data: &[u8], logger: &Arc<dyn Logger>) {
414414
network,
415415
best_block: BestBlock::from_genesis(network),
416416
};
417-
let channelmanager = Arc::new(ChannelManager::new(fee_est.clone(), monitor.clone(), broadcast.clone(), Some(router), Arc::clone(&logger), keys_manager.clone(), config, params));
417+
let channelmanager = Arc::new(ChannelManager::new_public(fee_est.clone(), monitor.clone(), broadcast.clone(), router, Arc::clone(&logger), keys_manager.clone(), config, params));
418418
// Adding new calls to `KeysInterface::get_secure_random_bytes` during startup can change all the
419419
// keys subsequently generated in this test. Rather than regenerating all the messages manually,
420420
// it's easier to just increment the counter here so the keys don't change.

lightning-background-processor/src/lib.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -749,7 +749,7 @@ mod tests {
749749
let chain_monitor = Arc::new(chainmonitor::ChainMonitor::new(Some(chain_source.clone()), tx_broadcaster.clone(), logger.clone(), fee_estimator.clone(), persister.clone()));
750750
let best_block = BestBlock::from_genesis(network);
751751
let params = ChainParameters { network, best_block };
752-
let manager = Arc::new(ChannelManager::new(fee_estimator.clone(), chain_monitor.clone(), tx_broadcaster.clone(), Some(router.clone()), logger.clone(), keys_manager.clone(), UserConfig::default(), params));
752+
let manager = Arc::new(ChannelManager::new_public(fee_estimator.clone(), chain_monitor.clone(), tx_broadcaster.clone(), router.clone(), logger.clone(), keys_manager.clone(), UserConfig::default(), params));
753753
let network_graph = Arc::new(NetworkGraph::new(genesis_block.header.block_hash(), logger.clone()));
754754
let p2p_gossip_sync = Arc::new(P2PGossipSync::new(network_graph.clone(), Some(chain_source.clone()), logger.clone()));
755755
let rapid_gossip_sync = Arc::new(RapidGossipSync::new(network_graph.clone()));

lightning-block-sync/src/poll.rs

+13-12
Original file line numberDiff line numberDiff line change
@@ -148,18 +148,19 @@ impl ValidatedBlockHeader {
148148
Ok(())
149149
}
150150

151-
/// Returns the [`BestBlock`] corresponding to this validated block header, which can be passed
152-
/// into [`ChannelManager::new`] as part of its [`ChainParameters`]. Useful for ensuring that
153-
/// the [`SpvClient`] and [`ChannelManager`] are initialized to the same block during a fresh
154-
/// start.
155-
///
156-
/// [`SpvClient`]: crate::SpvClient
157-
/// [`ChainParameters`]: lightning::ln::channelmanager::ChainParameters
158-
/// [`ChannelManager`]: lightning::ln::channelmanager::ChannelManager
159-
/// [`ChannelManager::new`]: lightning::ln::channelmanager::ChannelManager::new
160-
pub fn to_best_block(&self) -> BestBlock {
161-
BestBlock::new(self.block_hash, self.inner.height)
162-
}
151+
/// Returns the [`BestBlock`] corresponding to this validated block header, which can be passed
152+
/// into [`ChannelManager::new_public`] and [`ChannelManager::new_private`] as part of their
153+
/// [`ChainParameters`]. Useful for ensuring that the [`SpvClient`] and [`ChannelManager`] are
154+
/// initialized to the same block during a fresh start.
155+
///
156+
/// [`SpvClient`]: crate::SpvClient
157+
/// [`ChainParameters`]: lightning::ln::channelmanager::ChainParameters
158+
/// [`ChannelManager`]: lightning::ln::channelmanager::ChannelManager
159+
/// [`ChannelManager::new_public`]: lightning::ln::channelmanager::ChannelManager::new_public
160+
/// [`ChannelManager::new_private`]: lightning::ln::channelmanager::ChannelManager::new_private
161+
pub fn to_best_block(&self) -> BestBlock {
162+
BestBlock::new(self.block_hash, self.inner.height)
163+
}
163164
}
164165

165166
/// A block with validated data against its transaction list and corresponding block hash.

lightning/src/ln/channelmanager.rs

+43-5
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ use crate::ln::channel::{Channel, ChannelError, ChannelUpdateStatus, UpdateFulfi
4646
use crate::ln::features::{ChannelFeatures, ChannelTypeFeatures, InitFeatures, NodeFeatures};
4747
#[cfg(any(feature = "_test_utils", test))]
4848
use crate::ln::features::InvoiceFeatures;
49-
use crate::routing::router::{PaymentParameters, Route, RouteHop, RoutePath, RouteParameters, Router};
49+
use crate::routing::router::{InFlightHtlcs, PaymentParameters, Route, RouteHop, RoutePath, RouteParameters, Router};
5050
use crate::ln::msgs;
5151
use crate::ln::onion_utils;
5252
use crate::ln::msgs::{ChannelMessageHandler, DecodeError, LightningError, MAX_VALUE_MSAT};
@@ -71,6 +71,25 @@ use core::sync::atomic::{AtomicUsize, Ordering};
7171
use core::time::Duration;
7272
use core::ops::Deref;
7373

74+
// Used in private nodes that do not forward payments, since ChannelManager's router is only used in
75+
// trampoline forwards.
76+
struct IgnoringRouter {}
77+
impl Deref for IgnoringRouter {
78+
type Target = IgnoringRouter;
79+
fn deref(&self) -> &Self { self }
80+
}
81+
impl Router for IgnoringRouter {
82+
fn find_route(
83+
&self, _payer: &PublicKey, _route_params: &RouteParameters,
84+
_first_hops: Option<&[&ChannelDetails]>, _inflight_htlcs: InFlightHtlcs
85+
) -> Result<Route, LightningError> {
86+
Err(msgs::LightningError {
87+
err: String::from("Not implemented"),
88+
action: msgs::ErrorAction::IgnoreError
89+
})
90+
}
91+
}
92+
7493
// We hold various information about HTLC relay in the HTLC objects in Channel itself:
7594
//
7695
// Upon receipt of an HTLC from a peer, we'll give it a PendingHTLCStatus indicating if it should
@@ -1613,6 +1632,20 @@ macro_rules! post_handle_chan_restoration {
16131632
} }
16141633
}
16151634

1635+
impl<M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelManager<M, T, K, F, IgnoringRouter, L>
1636+
where M::Target: chain::Watch<<K::Target as KeysInterface>::Signer>,
1637+
T::Target: BroadcasterInterface,
1638+
K::Target: KeysInterface,
1639+
F::Target: FeeEstimator,
1640+
L::Target: Logger,
1641+
{
1642+
/// Similar to [`ChannelManager::new_public`], but used in private nodes that do not support
1643+
/// forwarding payments. None of it channels will be announced to the network.
1644+
pub fn new_private(fee_est: F, chain_monitor: M, tx_broadcaster: T, logger: L, keys_manager: K, config: UserConfig, params: ChainParameters) -> Self {
1645+
Self::new(fee_est, chain_monitor, tx_broadcaster, IgnoringRouter {}, logger, keys_manager, config, params, false)
1646+
}
1647+
}
1648+
16161649
impl<M: Deref, T: Deref, K: Deref, F: Deref, R: Deref, L: Deref> ChannelManager<M, T, K, F, R, L>
16171650
where M::Target: chain::Watch<<K::Target as KeysInterface>::Signer>,
16181651
T::Target: BroadcasterInterface,
@@ -1622,6 +1655,7 @@ impl<M: Deref, T: Deref, K: Deref, F: Deref, R: Deref, L: Deref> ChannelManager<
16221655
L::Target: Logger,
16231656
{
16241657
/// Constructs a new ChannelManager to hold several channels and route between them.
1658+
/// For use in a public lightning node that supports forwarding payments.
16251659
///
16261660
/// This is the main "logic hub" for all channel-related actions, and implements
16271661
/// ChannelMessageHandler.
@@ -1631,7 +1665,11 @@ impl<M: Deref, T: Deref, K: Deref, F: Deref, R: Deref, L: Deref> ChannelManager<
16311665
/// Users need to notify the new ChannelManager when a new block is connected or
16321666
/// disconnected using its `block_connected` and `block_disconnected` methods, starting
16331667
/// from after `params.latest_hash`.
1634-
pub fn new(fee_est: F, chain_monitor: M, tx_broadcaster: T, router: Option<R>, logger: L, keys_manager: K, config: UserConfig, params: ChainParameters) -> Self {
1668+
pub fn new_public(fee_est: F, chain_monitor: M, tx_broadcaster: T, router: R, logger: L, keys_manager: K, config: UserConfig, params: ChainParameters) -> Self {
1669+
Self::new(fee_est, chain_monitor, tx_broadcaster, router, logger, keys_manager, config, params, true)
1670+
}
1671+
1672+
fn new(fee_est: F, chain_monitor: M, tx_broadcaster: T, router: R, logger: L, keys_manager: K, config: UserConfig, params: ChainParameters, is_public: bool) -> Self {
16351673
let mut secp_ctx = Secp256k1::new();
16361674
secp_ctx.seeded_randomize(&keys_manager.get_secure_random_bytes());
16371675
let inbound_pmt_key_material = keys_manager.get_inbound_payment_key_material();
@@ -1642,7 +1680,7 @@ impl<M: Deref, T: Deref, K: Deref, F: Deref, R: Deref, L: Deref> ChannelManager<
16421680
fee_estimator: LowerBoundedFeeEstimator::new(fee_est),
16431681
chain_monitor,
16441682
tx_broadcaster,
1645-
router,
1683+
router: if is_public { Some(router) } else { None },
16461684

16471685
best_block: RwLock::new(params.best_block),
16481686

@@ -8052,7 +8090,7 @@ pub mod bench {
80528090
let chain_monitor_a = ChainMonitor::new(None, &tx_broadcaster, &logger_a, &fee_estimator, &persister_a);
80538091
let seed_a = [1u8; 32];
80548092
let keys_manager_a = KeysManager::new(&seed_a, 42, 42);
8055-
let node_a = ChannelManager::new(&fee_estimator, &chain_monitor_a, &tx_broadcaster, Some(&router), &logger_a, &keys_manager_a, config.clone(), ChainParameters {
8093+
let node_a = ChannelManager::new_public(&fee_estimator, &chain_monitor_a, &tx_broadcaster, &router, &logger_a, &keys_manager_a, config.clone(), ChainParameters {
80568094
network,
80578095
best_block: BestBlock::from_genesis(network),
80588096
});
@@ -8062,7 +8100,7 @@ pub mod bench {
80628100
let chain_monitor_b = ChainMonitor::new(None, &tx_broadcaster, &logger_a, &fee_estimator, &persister_b);
80638101
let seed_b = [2u8; 32];
80648102
let keys_manager_b = KeysManager::new(&seed_b, 42, 42);
8065-
let node_b = ChannelManager::new(&fee_estimator, &chain_monitor_b, &tx_broadcaster, Some(&router), &logger_b, &keys_manager_b, config.clone(), ChainParameters {
8103+
let node_b = ChannelManager::new_public(&fee_estimator, &chain_monitor_b, &tx_broadcaster, &router, &logger_b, &keys_manager_b, config.clone(), ChainParameters {
80668104
network,
80678105
best_block: BestBlock::from_genesis(network),
80688106
});

lightning/src/ln/functional_test_utils.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -2111,7 +2111,7 @@ pub fn create_node_chanmgrs<'a, 'b>(node_count: usize, cfgs: &'a Vec<NodeCfg<'b>
21112111
network,
21122112
best_block: BestBlock::from_genesis(network),
21132113
};
2114-
let node = ChannelManager::new(cfgs[i].fee_estimator, &cfgs[i].chain_monitor, cfgs[i].tx_broadcaster, Some(&cfgs[i].router), cfgs[i].logger, cfgs[i].keys_manager,
2114+
let node = ChannelManager::new_public(cfgs[i].fee_estimator, &cfgs[i].chain_monitor, cfgs[i].tx_broadcaster, &cfgs[i].router, cfgs[i].logger, cfgs[i].keys_manager,
21152115
if node_config[i].is_some() { node_config[i].clone().unwrap() } else { test_default_channel_config() }, params);
21162116
chanmgrs.push(node);
21172117
}

0 commit comments

Comments
 (0)