Skip to content

Commit 988459a

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 26be169 commit 988459a

File tree

6 files changed

+60
-20
lines changed

6 files changed

+60
-20
lines changed

fuzz/src/chanmon_consistency.rs

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

fuzz/src/full_stack.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -418,7 +418,7 @@ pub fn do_test(data: &[u8], logger: &Arc<dyn Logger>) {
418418
network,
419419
best_block: BestBlock::from_genesis(network),
420420
};
421-
let channelmanager = Arc::new(ChannelManager::new(fee_est.clone(), monitor.clone(), broadcast.clone(), Some(router), Arc::clone(&logger), keys_manager.clone(), config, params));
421+
let channelmanager = Arc::new(ChannelManager::new_public(fee_est.clone(), monitor.clone(), broadcast.clone(), router, Arc::clone(&logger), keys_manager.clone(), config, params));
422422
// Adding new calls to `KeysInterface::get_secure_random_bytes` during startup can change all the
423423
// keys subsequently generated in this test. Rather than regenerating all the messages manually,
424424
// 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
@@ -748,7 +748,7 @@ mod tests {
748748
let chain_monitor = Arc::new(chainmonitor::ChainMonitor::new(Some(chain_source.clone()), tx_broadcaster.clone(), logger.clone(), fee_estimator.clone(), persister.clone()));
749749
let best_block = BestBlock::from_genesis(network);
750750
let params = ChainParameters { network, best_block };
751-
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));
751+
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));
752752
let network_graph = Arc::new(NetworkGraph::new(genesis_block.header.block_hash(), logger.clone()));
753753
let p2p_gossip_sync = Arc::new(P2PGossipSync::new(network_graph.clone(), Some(chain_source.clone()), logger.clone()));
754754
let rapid_gossip_sync = Arc::new(RapidGossipSync::new(network_graph.clone()));

lightning-block-sync/src/poll.rs

+12-12
Original file line numberDiff line numberDiff line change
@@ -148,18 +148,18 @@ 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`]: lightning::ln::channelmanager::ChannelManager::new
160+
pub fn to_best_block(&self) -> BestBlock {
161+
BestBlock::new(self.block_hash, self.inner.height)
162+
}
163163
}
164164

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

lightning/src/ln/channelmanager.rs

+44-4
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,27 @@ pub trait Router {
119119
fn notify_payment_path_successful(&self, path: &[&RouteHop]);
120120
}
121121

122+
// Used in private nodes that do not forward payments, since ChannelManager's router is only used in
123+
// trampoline forwards.
124+
struct IgnoringRouter {}
125+
impl Deref for IgnoringRouter {
126+
type Target = IgnoringRouter;
127+
fn deref(&self) -> &Self { self }
128+
}
129+
impl Router for IgnoringRouter {
130+
fn find_route(
131+
&self, _payer: &PublicKey, _route_params: &RouteParameters,
132+
_first_hops: Option<&[&ChannelDetails]>, _inflight_htlcs: InFlightHtlcs
133+
) -> Result<Route, LightningError> {
134+
Err(msgs::LightningError {
135+
err: String::from("Not implemented"),
136+
action: msgs::ErrorAction::IgnoreError
137+
})
138+
}
139+
fn notify_payment_path_failed(&self, _path: &[&RouteHop], _short_channel_id: u64) {}
140+
fn notify_payment_path_successful(&self, _path: &[&RouteHop]) {}
141+
}
142+
122143
// We hold various information about HTLC relay in the HTLC objects in Channel itself:
123144
//
124145
// Upon receipt of an HTLC from a peer, we'll give it a PendingHTLCStatus indicating if it should
@@ -1643,6 +1664,20 @@ macro_rules! post_handle_chan_restoration {
16431664
} }
16441665
}
16451666

1667+
impl<M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelManager<M, T, K, F, IgnoringRouter, L>
1668+
where M::Target: chain::Watch<<K::Target as KeysInterface>::Signer>,
1669+
T::Target: BroadcasterInterface,
1670+
K::Target: KeysInterface,
1671+
F::Target: FeeEstimator,
1672+
L::Target: Logger,
1673+
{
1674+
/// Similar to [`ChannelManager::new_public`], but used in private nodes that do not support
1675+
/// forwarding payments. None of it channels will be announced to the network.
1676+
pub fn new_private(fee_est: F, chain_monitor: M, tx_broadcaster: T, logger: L, keys_manager: K, config: UserConfig, params: ChainParameters) -> Self {
1677+
Self::new(fee_est, chain_monitor, tx_broadcaster, IgnoringRouter {}, logger, keys_manager, config, params, false)
1678+
}
1679+
}
1680+
16461681
impl<M: Deref, T: Deref, K: Deref, F: Deref, R: Deref, L: Deref> ChannelManager<M, T, K, F, R, L>
16471682
where M::Target: chain::Watch<<K::Target as KeysInterface>::Signer>,
16481683
T::Target: BroadcasterInterface,
@@ -1652,6 +1687,7 @@ impl<M: Deref, T: Deref, K: Deref, F: Deref, R: Deref, L: Deref> ChannelManager<
16521687
L::Target: Logger,
16531688
{
16541689
/// Constructs a new ChannelManager to hold several channels and route between them.
1690+
/// For use in a public lightning node that supports forwarding payments.
16551691
///
16561692
/// This is the main "logic hub" for all channel-related actions, and implements
16571693
/// ChannelMessageHandler.
@@ -1661,7 +1697,11 @@ impl<M: Deref, T: Deref, K: Deref, F: Deref, R: Deref, L: Deref> ChannelManager<
16611697
/// Users need to notify the new ChannelManager when a new block is connected or
16621698
/// disconnected using its `block_connected` and `block_disconnected` methods, starting
16631699
/// from after `params.latest_hash`.
1664-
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 {
1700+
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 {
1701+
Self::new(fee_est, chain_monitor, tx_broadcaster, router, logger, keys_manager, config, params, true)
1702+
}
1703+
1704+
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 {
16651705
let mut secp_ctx = Secp256k1::new();
16661706
secp_ctx.seeded_randomize(&keys_manager.get_secure_random_bytes());
16671707
let inbound_pmt_key_material = keys_manager.get_inbound_payment_key_material();
@@ -1672,7 +1712,7 @@ impl<M: Deref, T: Deref, K: Deref, F: Deref, R: Deref, L: Deref> ChannelManager<
16721712
fee_estimator: LowerBoundedFeeEstimator::new(fee_est),
16731713
chain_monitor,
16741714
tx_broadcaster,
1675-
router,
1715+
router: if is_public { Some(router) } else { None },
16761716

16771717
best_block: RwLock::new(params.best_block),
16781718

@@ -7996,7 +8036,7 @@ pub mod bench {
79968036
let chain_monitor_a = ChainMonitor::new(None, &tx_broadcaster, &logger_a, &fee_estimator, &persister_a);
79978037
let seed_a = [1u8; 32];
79988038
let keys_manager_a = KeysManager::new(&seed_a, 42, 42);
7999-
let node_a = ChannelManager::new(&fee_estimator, &chain_monitor_a, &tx_broadcaster, Some(&router), &logger_a, &keys_manager_a, config.clone(), ChainParameters {
8039+
let node_a = ChannelManager::new_public(&fee_estimator, &chain_monitor_a, &tx_broadcaster, &router, &logger_a, &keys_manager_a, config.clone(), ChainParameters {
80008040
network,
80018041
best_block: BestBlock::from_genesis(network),
80028042
});
@@ -8006,7 +8046,7 @@ pub mod bench {
80068046
let chain_monitor_b = ChainMonitor::new(None, &tx_broadcaster, &logger_a, &fee_estimator, &persister_b);
80078047
let seed_b = [2u8; 32];
80088048
let keys_manager_b = KeysManager::new(&seed_b, 42, 42);
8009-
let node_b = ChannelManager::new(&fee_estimator, &chain_monitor_b, &tx_broadcaster, Some(&router), &logger_b, &keys_manager_b, config.clone(), ChainParameters {
8049+
let node_b = ChannelManager::new_public(&fee_estimator, &chain_monitor_b, &tx_broadcaster, &router, &logger_b, &keys_manager_b, config.clone(), ChainParameters {
80108050
network,
80118051
best_block: BestBlock::from_genesis(network),
80128052
});

lightning/src/ln/functional_test_utils.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -2082,7 +2082,7 @@ pub fn create_node_chanmgrs<'a, 'b>(node_count: usize, cfgs: &'a Vec<NodeCfg<'b>
20822082
network,
20832083
best_block: BestBlock::from_genesis(network),
20842084
};
2085-
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,
2085+
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,
20862086
if node_config[i].is_some() { node_config[i].clone().unwrap() } else { test_default_channel_config() }, params);
20872087
chanmgrs.push(node);
20882088
}

0 commit comments

Comments
 (0)