Skip to content

Commit cabb864

Browse files
WIP: Drop ChannelManager's ChannelMonitor Arc for reference
+ drop lightning-net-tokio package in favor of a rewrite.
1 parent 3b76c77 commit cabb864

13 files changed

+508
-539
lines changed

Cargo.toml

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
[workspace]
22

33
members = [
4-
"lightning",
5-
"lightning-net-tokio",
4+
"lightning"
65
]
76

87
# Our tests do actual crypo and lots of work, the tradeoff for -O1 is well worth it

fuzz/src/chanmon_consistency.rs

Lines changed: 63 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ impl Writer for VecWriter {
7474

7575
static mut IN_RESTORE: bool = false;
7676
pub struct TestChannelMonitor {
77-
pub simple_monitor: Arc<channelmonitor::SimpleManyChannelMonitor<OutPoint>>,
77+
pub simple_monitor: channelmonitor::SimpleManyChannelMonitor<OutPoint>,
7878
pub update_ret: Mutex<Result<(), channelmonitor::ChannelMonitorUpdateErr>>,
7979
pub latest_good_update: Mutex<HashMap<OutPoint, Vec<u8>>>,
8080
pub latest_update_good: Mutex<HashMap<OutPoint, bool>>,
@@ -172,34 +172,41 @@ impl KeysInterface for KeyProvider {
172172
}
173173
}
174174

175+
pub struct NodeCfg {
176+
pub chain_monitor: Arc<chaininterface::ChainWatchInterfaceUtil>,
177+
pub chan_monitor: TestChannelMonitor,
178+
keys_manager: Arc<KeyProvider>,
179+
pub logger: Arc<Logger>,
180+
}
181+
175182
#[inline]
176183
pub fn do_test(data: &[u8]) {
177184
let fee_est = Arc::new(FuzzEstimator{});
178185
let broadcast = Arc::new(TestBroadcaster{});
179186

180-
macro_rules! make_node {
187+
macro_rules! make_node_cfg {
181188
($node_id: expr) => { {
182189
let logger: Arc<dyn Logger> = Arc::new(test_logger::TestLogger::new($node_id.to_string()));
183-
let watch = Arc::new(ChainWatchInterfaceUtil::new(Network::Bitcoin, Arc::clone(&logger)));
184-
let monitor = Arc::new(TestChannelMonitor::new(watch.clone(), broadcast.clone(), logger.clone(), fee_est.clone()));
185-
190+
let chain_monitor = Arc::new(ChainWatchInterfaceUtil::new(Network::Bitcoin, Arc::clone(&logger)));
191+
let chan_monitor = TestChannelMonitor::new(chain_monitor.clone(), broadcast.clone(), logger.clone(), fee_est.clone());
186192
let keys_manager = Arc::new(KeyProvider { node_id: $node_id, session_id: atomic::AtomicU8::new(0), channel_id: atomic::AtomicU8::new(0) });
193+
Box::pin(NodeCfg{ logger: Arc::clone(&logger), chain_monitor, chan_monitor, keys_manager })
194+
} }
195+
}
196+
197+
macro_rules! make_node {
198+
($node_cfg: expr) => { {
187199
let mut config = UserConfig::default();
188200
config.channel_options.fee_proportional_millionths = 0;
189201
config.channel_options.announced_channel = true;
190202
config.peer_channel_config_limits.min_dust_limit_satoshis = 0;
191-
(ChannelManager::new(Network::Bitcoin, fee_est.clone(), monitor.clone(), broadcast.clone(), Arc::clone(&logger), keys_manager.clone(), config, 0).unwrap(),
192-
monitor)
203+
let chan_monitor_ref = unsafe { &(*(&(*$node_cfg) as *const NodeCfg)).chan_monitor };
204+
ChannelManager::new(Network::Bitcoin, fee_est.clone(), chan_monitor_ref, broadcast.clone(), Arc::clone(&$node_cfg.logger), $node_cfg.keys_manager.clone(), config, 0).unwrap()
193205
} }
194206
}
195207

196208
macro_rules! reload_node {
197-
($ser: expr, $node_id: expr, $old_monitors: expr) => { {
198-
let logger: Arc<dyn Logger> = Arc::new(test_logger::TestLogger::new($node_id.to_string()));
199-
let watch = Arc::new(ChainWatchInterfaceUtil::new(Network::Bitcoin, Arc::clone(&logger)));
200-
let monitor = Arc::new(TestChannelMonitor::new(watch.clone(), broadcast.clone(), logger.clone(), fee_est.clone()));
201-
202-
let keys_manager = Arc::new(KeyProvider { node_id: $node_id, session_id: atomic::AtomicU8::new(0), channel_id: atomic::AtomicU8::new(0) });
209+
($ser: expr, $new_cfg: expr, $old_monitors: expr) => { {
203210
let mut config = UserConfig::default();
204211
config.channel_options.fee_proportional_millionths = 0;
205212
config.channel_options.announced_channel = true;
@@ -208,25 +215,26 @@ pub fn do_test(data: &[u8]) {
208215
let mut monitors = HashMap::new();
209216
let mut old_monitors = $old_monitors.latest_good_update.lock().unwrap();
210217
for (outpoint, monitor_ser) in old_monitors.drain() {
211-
monitors.insert(outpoint, <(Sha256d, ChannelMonitor)>::read(&mut Cursor::new(&monitor_ser), Arc::clone(&logger)).expect("Failed to read monitor").1);
212-
monitor.latest_good_update.lock().unwrap().insert(outpoint, monitor_ser);
218+
monitors.insert(outpoint, <(Sha256d, ChannelMonitor)>::read(&mut Cursor::new(&monitor_ser), Arc::clone(&$new_cfg.logger)).expect("Failed to read monitor").1);
219+
$new_cfg.chan_monitor.latest_good_update.lock().unwrap().insert(outpoint, monitor_ser);
213220
}
214221
let mut monitor_refs = HashMap::new();
215222
for (outpoint, monitor) in monitors.iter() {
216223
monitor_refs.insert(*outpoint, monitor);
217224
}
218225

226+
let chan_monitor_ref = unsafe { &(*(&(*$new_cfg) as *const NodeCfg)).chan_monitor };
219227
let read_args = ChannelManagerReadArgs {
220-
keys_manager,
228+
keys_manager: $new_cfg.keys_manager.clone(),
221229
fee_estimator: fee_est.clone(),
222-
monitor: monitor.clone(),
230+
monitor: chan_monitor_ref,
223231
tx_broadcaster: broadcast.clone(),
224-
logger,
232+
logger: $new_cfg.logger.clone(),
225233
default_config: config,
226234
channel_monitors: &monitor_refs,
227235
};
228236

229-
let res = (<(Sha256d, ChannelManager<EnforcingChannelKeys>)>::read(&mut Cursor::new(&$ser.0), read_args).expect("Failed to read manager").1, monitor);
237+
let res = (<(Sha256d, ChannelManager<EnforcingChannelKeys>)>::read(&mut Cursor::new(&$ser.0), read_args).expect("Failed to read manager").1, chan_monitor_ref);
230238
for (_, was_good) in $old_monitors.latest_updates_good_at_last_ser.lock().unwrap().iter() {
231239
if !was_good {
232240
// If the last time we updated a monitor we didn't successfully update (and we
@@ -349,9 +357,12 @@ pub fn do_test(data: &[u8]) {
349357

350358
// 3 nodes is enough to hit all the possible cases, notably unknown-source-unknown-dest
351359
// forwarding.
352-
let (mut node_a, mut monitor_a) = make_node!(0);
353-
let (mut node_b, mut monitor_b) = make_node!(1);
354-
let (mut node_c, mut monitor_c) = make_node!(2);
360+
let mut cfg_a = make_node_cfg!(0);
361+
let mut cfg_b = make_node_cfg!(1);
362+
let mut cfg_c = make_node_cfg!(2);
363+
let node_a = make_node!(cfg_a);
364+
let node_b = make_node!(cfg_b);
365+
let node_c = make_node!(cfg_c);
355366

356367
let mut nodes = [node_a, node_b, node_c];
357368

@@ -618,12 +629,12 @@ pub fn do_test(data: &[u8]) {
618629
}
619630

620631
match get_slice!(1)[0] {
621-
0x00 => *monitor_a.update_ret.lock().unwrap() = Err(ChannelMonitorUpdateErr::TemporaryFailure),
622-
0x01 => *monitor_b.update_ret.lock().unwrap() = Err(ChannelMonitorUpdateErr::TemporaryFailure),
623-
0x02 => *monitor_c.update_ret.lock().unwrap() = Err(ChannelMonitorUpdateErr::TemporaryFailure),
624-
0x03 => *monitor_a.update_ret.lock().unwrap() = Ok(()),
625-
0x04 => *monitor_b.update_ret.lock().unwrap() = Ok(()),
626-
0x05 => *monitor_c.update_ret.lock().unwrap() = Ok(()),
632+
0x00 => *cfg_a.chan_monitor.update_ret.lock().unwrap() = Err(ChannelMonitorUpdateErr::TemporaryFailure),
633+
0x01 => *cfg_b.chan_monitor.update_ret.lock().unwrap() = Err(ChannelMonitorUpdateErr::TemporaryFailure),
634+
0x02 => *cfg_c.chan_monitor.update_ret.lock().unwrap() = Err(ChannelMonitorUpdateErr::TemporaryFailure),
635+
0x03 => *cfg_a.chan_monitor.update_ret.lock().unwrap() = Ok(()),
636+
0x04 => *cfg_b.chan_monitor.update_ret.lock().unwrap() = Ok(()),
637+
0x05 => *cfg_c.chan_monitor.update_ret.lock().unwrap() = Ok(()),
627638
0x06 => { unsafe { IN_RESTORE = true }; nodes[0].test_restore_channel_monitor(); unsafe { IN_RESTORE = false }; },
628639
0x07 => { unsafe { IN_RESTORE = true }; nodes[1].test_restore_channel_monitor(); unsafe { IN_RESTORE = false }; },
629640
0x08 => { unsafe { IN_RESTORE = true }; nodes[2].test_restore_channel_monitor(); unsafe { IN_RESTORE = false }; },
@@ -681,10 +692,10 @@ pub fn do_test(data: &[u8]) {
681692
chan_a_disconnected = true;
682693
drain_msg_events_on_disconnect!(0);
683694
}
684-
let (new_node_a, new_monitor_a) = reload_node!(node_a_ser, 0, monitor_a);
685-
node_a = Arc::new(new_node_a);
686-
nodes[0] = node_a.clone();
687-
monitor_a = new_monitor_a;
695+
let new_cfg_a = make_node_cfg!(0);
696+
let new_node_a = reload_node!(node_a_ser, new_cfg_a, &cfg_a.chan_monitor);
697+
nodes[0] = new_node_a.0;
698+
cfg_a = new_cfg_a;
688699
},
689700
0x20 => {
690701
if !chan_a_disconnected {
@@ -699,42 +710,45 @@ pub fn do_test(data: &[u8]) {
699710
nodes[2].get_and_clear_pending_msg_events();
700711
bc_events.clear();
701712
}
702-
let (new_node_b, new_monitor_b) = reload_node!(node_b_ser, 1, monitor_b);
703-
node_b = Arc::new(new_node_b);
704-
nodes[1] = node_b.clone();
705-
monitor_b = new_monitor_b;
713+
let new_cfg_b = make_node_cfg!(1);
714+
let new_node_b = reload_node!(node_b_ser, new_cfg_b, &cfg_b.chan_monitor);
715+
nodes[0] = new_node_b.0;
716+
cfg_b = new_cfg_b;
706717
},
707718
0x21 => {
708719
if !chan_b_disconnected {
709720
nodes[1].peer_disconnected(&nodes[2].get_our_node_id(), false);
710721
chan_b_disconnected = true;
711722
drain_msg_events_on_disconnect!(2);
712723
}
713-
let (new_node_c, new_monitor_c) = reload_node!(node_c_ser, 2, monitor_c);
714-
node_c = Arc::new(new_node_c);
715-
nodes[2] = node_c.clone();
716-
monitor_c = new_monitor_c;
724+
let new_cfg_c = make_node_cfg!(2);
725+
let new_node_c = reload_node!(node_c_ser, new_cfg_c, &cfg_c.chan_monitor);
726+
nodes[0] = new_node_c.0;
727+
cfg_c = new_cfg_c;
717728
},
718729
_ => test_return!(),
719730
}
720731

721-
if monitor_a.should_update_manager.load(atomic::Ordering::Relaxed) {
732+
if cfg_a.chan_monitor.should_update_manager.load(atomic::Ordering::Relaxed) {
722733
node_a_ser.0.clear();
723734
nodes[0].write(&mut node_a_ser).unwrap();
724-
monitor_a.should_update_manager.store(false, atomic::Ordering::Relaxed);
725-
*monitor_a.latest_updates_good_at_last_ser.lock().unwrap() = monitor_a.latest_update_good.lock().unwrap().clone();
735+
cfg_a.chan_monitor.should_update_manager.store(false, atomic::Ordering::Relaxed);
736+
let chan_monitor_ref = unsafe { &(*(&(*cfg_a) as *const NodeCfg)).chan_monitor };
737+
*chan_monitor_ref.latest_updates_good_at_last_ser.lock().unwrap() = cfg_a.chan_monitor.latest_update_good.lock().unwrap().clone();
726738
}
727-
if monitor_b.should_update_manager.load(atomic::Ordering::Relaxed) {
739+
if cfg_b.chan_monitor.should_update_manager.load(atomic::Ordering::Relaxed) {
728740
node_b_ser.0.clear();
729741
nodes[1].write(&mut node_b_ser).unwrap();
730-
monitor_b.should_update_manager.store(false, atomic::Ordering::Relaxed);
731-
*monitor_b.latest_updates_good_at_last_ser.lock().unwrap() = monitor_b.latest_update_good.lock().unwrap().clone();
742+
cfg_b.chan_monitor.should_update_manager.store(false, atomic::Ordering::Relaxed);
743+
let chan_monitor_ref = unsafe { &(*(&(*cfg_b) as *const NodeCfg)).chan_monitor };
744+
*chan_monitor_ref.latest_updates_good_at_last_ser.lock().unwrap() = cfg_b.chan_monitor.latest_update_good.lock().unwrap().clone();
732745
}
733-
if monitor_c.should_update_manager.load(atomic::Ordering::Relaxed) {
746+
if cfg_c.chan_monitor.should_update_manager.load(atomic::Ordering::Relaxed) {
734747
node_c_ser.0.clear();
735748
nodes[2].write(&mut node_c_ser).unwrap();
736-
monitor_c.should_update_manager.store(false, atomic::Ordering::Relaxed);
737-
*monitor_c.latest_updates_good_at_last_ser.lock().unwrap() = monitor_c.latest_update_good.lock().unwrap().clone();
749+
cfg_c.chan_monitor.should_update_manager.store(false, atomic::Ordering::Relaxed);
750+
let chan_monitor_ref = unsafe { &(*(&(*cfg_c) as *const NodeCfg)).chan_monitor };
751+
*chan_monitor_ref.latest_updates_good_at_last_ser.lock().unwrap() = cfg_c.chan_monitor.latest_update_good.lock().unwrap().clone();
738752
}
739753
}
740754
}

fuzz/src/full_stack.rs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -136,9 +136,9 @@ impl<'a> Hash for Peer<'a> {
136136
}
137137

138138
struct MoneyLossDetector<'a, 'b> {
139-
manager: Arc<ChannelManager<'b, EnforcingChannelKeys>>,
140-
monitor: Arc<channelmonitor::SimpleManyChannelMonitor<OutPoint>>,
141-
handler: PeerManager<Peer<'a>>,
139+
manager: &'a ChannelManager<'b, EnforcingChannelKeys>,
140+
monitor: &'b channelmonitor::SimpleManyChannelMonitor<OutPoint>,
141+
handler: PeerManager<'a, Peer<'a>>,
142142

143143
peers: &'a RefCell<[bool; 256]>,
144144
funding_txn: Vec<Transaction>,
@@ -149,7 +149,7 @@ struct MoneyLossDetector<'a, 'b> {
149149
blocks_connected: u32,
150150
}
151151
impl<'a, 'b> MoneyLossDetector<'a, 'b> {
152-
pub fn new(peers: &'a RefCell<[bool; 256]>, manager: Arc<ChannelManager<'b, EnforcingChannelKeys>>, monitor: Arc<channelmonitor::SimpleManyChannelMonitor<OutPoint>>, handler: PeerManager<Peer<'a>>) -> Self {
152+
pub fn new(peers: &'a RefCell<[bool; 256]>, manager: &'a ChannelManager<'b, EnforcingChannelKeys>, monitor: &'b channelmonitor::SimpleManyChannelMonitor<OutPoint>, handler: PeerManager<'a, Peer<'a>>) -> Self {
153153
MoneyLossDetector {
154154
manager,
155155
monitor,
@@ -325,12 +325,12 @@ pub fn do_test(data: &[u8], logger: &Arc<dyn Logger>) {
325325
config.channel_options.fee_proportional_millionths = slice_to_be32(get_slice!(4));
326326
config.channel_options.announced_channel = get_slice!(1)[0] != 0;
327327
config.peer_channel_config_limits.min_dust_limit_satoshis = 0;
328-
let channelmanager = ChannelManager::new(Network::Bitcoin, fee_est.clone(), monitor.clone(), broadcast.clone(), Arc::clone(&logger), keys_manager.clone(), config, 0).unwrap();
328+
let channelmanager = ChannelManager::new(Network::Bitcoin, fee_est.clone(), &monitor, broadcast.clone(), Arc::clone(&logger), keys_manager.clone(), config, 0).unwrap();
329329
let router = Arc::new(Router::new(PublicKey::from_secret_key(&Secp256k1::signing_only(), &keys_manager.get_node_secret()), watch.clone(), Arc::clone(&logger)));
330330

331331
let peers = RefCell::new([false; 256]);
332-
let mut loss_detector = MoneyLossDetector::new(&peers, channelmanager.clone(), monitor.clone(), PeerManager::new(MessageHandler {
333-
chan_handler: channelmanager.clone(),
332+
let mut loss_detector = MoneyLossDetector::new(&peers, &channelmanager, &monitor, PeerManager::new(MessageHandler {
333+
chan_handler: &channelmanager,
334334
route_handler: router.clone(),
335335
}, our_network_key, &[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0], Arc::clone(&logger)));
336336

lightning-net-tokio/Cargo.toml

Lines changed: 0 additions & 19 deletions
This file was deleted.

0 commit comments

Comments
 (0)