Skip to content

Commit 6eb2155

Browse files
Change ChannelMonitor deserialization to return an optional blockhash.
See previous commit msg for details.
1 parent e545652 commit 6eb2155

File tree

7 files changed

+26
-20
lines changed

7 files changed

+26
-20
lines changed

lightning-block-sync/src/init.rs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ use lightning::chain;
6262
/// ) {
6363
/// // Read a serialized channel monitor paired with the block hash when it was persisted.
6464
/// let serialized_monitor = "...";
65-
/// let (monitor_block_hash, mut monitor) = <(BlockHash, ChannelMonitor<S>)>::read(
65+
/// let (monitor_block_hash_option, mut monitor) = <(Option<BlockHash>, ChannelMonitor<S>)>::read(
6666
/// &mut Cursor::new(&serialized_monitor), keys_manager).unwrap();
6767
///
6868
/// // Read the channel manager paired with the block hash when it was persisted.
@@ -84,9 +84,10 @@ use lightning::chain;
8484
/// // Synchronize any channel monitors and the channel manager to be on the best block.
8585
/// let mut cache = UnboundedCache::new();
8686
/// let mut monitor_listener = (RefCell::new(monitor), &*tx_broadcaster, &*fee_estimator, &*logger);
87-
/// let mut listeners = vec![
88-
/// (monitor_block_hash, &mut monitor_listener as &mut dyn chain::Listen),
89-
/// ];
87+
/// let mut listeners = vec![];
88+
/// if let Some(monitor_block_hash) = monitor_block_hash_option {
89+
/// listeners.push((monitor_block_hash, &mut monitor_listener as &mut dyn chain::Listen))
90+
/// }
9091
/// if let Some(manager_block_hash) = manager_block_hash_option {
9192
/// listeners.push((manager_block_hash, &mut manager as &mut dyn chain::Listen))
9293
/// }

lightning-persister/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@ impl FilesystemPersister {
124124
if contents.is_err() { return Err(ChannelMonitorUpdateErr::PermanentFailure); }
125125

126126
if let Ok((_, loaded_monitor)) =
127-
<(BlockHash, ChannelMonitor<Keys::Signer>)>::read(&mut Cursor::new(&contents.unwrap()), keys) {
127+
<(Option<BlockHash>, ChannelMonitor<Keys::Signer>)>::read(&mut Cursor::new(&contents.unwrap()), keys) {
128128
res.insert(OutPoint { txid: txid.unwrap(), index: index.unwrap() }, loaded_monitor);
129129
} else {
130130
return Err(ChannelMonitorUpdateErr::PermanentFailure);

lightning/src/chain/channelmonitor.rs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2317,7 +2317,7 @@ where
23172317
const MAX_ALLOC_SIZE: usize = 64*1024;
23182318

23192319
impl<'a, Signer: Sign, K: KeysInterface<Signer = Signer>> ReadableArgs<&'a K>
2320-
for (BlockHash, ChannelMonitor<Signer>) {
2320+
for (Option<BlockHash>, ChannelMonitor<Signer>) {
23212321
fn read<R: ::std::io::Read>(reader: &mut R, keys_manager: &'a K) -> Result<Self, DecodeError> {
23222322
macro_rules! unwrap_obj {
23232323
($key: expr) => {
@@ -2560,7 +2560,12 @@ impl<'a, Signer: Sign, K: KeysInterface<Signer = Signer>> ReadableArgs<&'a K>
25602560
let mut secp_ctx = Secp256k1::new();
25612561
secp_ctx.seeded_randomize(&keys_manager.get_secure_random_bytes());
25622562

2563-
Ok((last_block_hash.clone(), ChannelMonitor {
2563+
let mut last_seen_block_hash = Some(last_block_hash.clone());
2564+
if last_block_hash == Default::default() {
2565+
last_seen_block_hash = None;
2566+
}
2567+
2568+
Ok((last_seen_block_hash, ChannelMonitor {
25642569
latest_update_id,
25652570
commitment_transaction_number_obscure_factor,
25662571

lightning/src/ln/chanmon_update_fail_tests.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ fn test_monitor_and_persister_update_fail() {
106106
let monitor = monitors.get(&outpoint).unwrap();
107107
let mut w = test_utils::TestVecWriter(Vec::new());
108108
monitor.write(&mut w).unwrap();
109-
let new_monitor = <(BlockHash, ChannelMonitor<EnforcingSigner>)>::read(
109+
let new_monitor = <(Option<BlockHash>, ChannelMonitor<EnforcingSigner>)>::read(
110110
&mut ::std::io::Cursor::new(&w.0), &test_utils::OnlyReadsKeysInterface {}).unwrap().1;
111111
assert!(new_monitor == *monitor);
112112
let chain_mon = test_utils::TestChainMonitor::new(Some(&chain_source), &chanmon_cfgs[0].tx_broadcaster, &logger, &chanmon_cfgs[0].fee_estimator, &persister, &node_cfgs[0].keys_manager);

lightning/src/ln/functional_test_utils.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -172,7 +172,7 @@ impl<'a, 'b, 'c> Drop for Node<'a, 'b, 'c> {
172172
for (_, old_monitor) in old_monitors.iter() {
173173
let mut w = test_utils::TestVecWriter(Vec::new());
174174
old_monitor.write(&mut w).unwrap();
175-
let (_, deserialized_monitor) = <(BlockHash, ChannelMonitor<EnforcingSigner>)>::read(
175+
let (_, deserialized_monitor) = <(Option<BlockHash>, ChannelMonitor<EnforcingSigner>)>::read(
176176
&mut ::std::io::Cursor::new(&w.0), self.keys_manager).unwrap();
177177
deserialized_monitors.push(deserialized_monitor);
178178
}

lightning/src/ln/functional_tests.rs

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4323,7 +4323,7 @@ fn test_no_txn_manager_serialize_deserialize() {
43234323
new_chain_monitor = test_utils::TestChainMonitor::new(Some(nodes[0].chain_source), nodes[0].tx_broadcaster.clone(), &logger, &fee_estimator, &persister, keys_manager);
43244324
nodes[0].chain_monitor = &new_chain_monitor;
43254325
let mut chan_0_monitor_read = &chan_0_monitor_serialized.0[..];
4326-
let (_, mut chan_0_monitor) = <(BlockHash, ChannelMonitor<EnforcingSigner>)>::read(
4326+
let (_, mut chan_0_monitor) = <(Option<BlockHash>, ChannelMonitor<EnforcingSigner>)>::read(
43274327
&mut chan_0_monitor_read, keys_manager).unwrap();
43284328
assert!(chan_0_monitor_read.is_empty());
43294329

@@ -4432,7 +4432,7 @@ fn test_manager_serialize_deserialize_events() {
44324432
new_chain_monitor = test_utils::TestChainMonitor::new(Some(nodes[0].chain_source), nodes[0].tx_broadcaster.clone(), &logger, &fee_estimator, &persister, keys_manager);
44334433
nodes[0].chain_monitor = &new_chain_monitor;
44344434
let mut chan_0_monitor_read = &chan_0_monitor_serialized.0[..];
4435-
let (_, mut chan_0_monitor) = <(BlockHash, ChannelMonitor<EnforcingSigner>)>::read(
4435+
let (_, mut chan_0_monitor) = <(Option<BlockHash>, ChannelMonitor<EnforcingSigner>)>::read(
44364436
&mut chan_0_monitor_read, keys_manager).unwrap();
44374437
assert!(chan_0_monitor_read.is_empty());
44384438

@@ -4524,7 +4524,7 @@ fn test_simple_manager_serialize_deserialize() {
45244524
new_chain_monitor = test_utils::TestChainMonitor::new(Some(nodes[0].chain_source), nodes[0].tx_broadcaster.clone(), &logger, &fee_estimator, &persister, keys_manager);
45254525
nodes[0].chain_monitor = &new_chain_monitor;
45264526
let mut chan_0_monitor_read = &chan_0_monitor_serialized.0[..];
4527-
let (_, mut chan_0_monitor) = <(BlockHash, ChannelMonitor<EnforcingSigner>)>::read(
4527+
let (_, mut chan_0_monitor) = <(Option<BlockHash>, ChannelMonitor<EnforcingSigner>)>::read(
45284528
&mut chan_0_monitor_read, keys_manager).unwrap();
45294529
assert!(chan_0_monitor_read.is_empty());
45304530

@@ -4608,15 +4608,15 @@ fn test_manager_serialize_deserialize_inconsistent_monitor() {
46084608
let mut node_0_stale_monitors = Vec::new();
46094609
for serialized in node_0_stale_monitors_serialized.iter() {
46104610
let mut read = &serialized[..];
4611-
let (_, monitor) = <(BlockHash, ChannelMonitor<EnforcingSigner>)>::read(&mut read, keys_manager).unwrap();
4611+
let (_, monitor) = <(Option<BlockHash>, ChannelMonitor<EnforcingSigner>)>::read(&mut read, keys_manager).unwrap();
46124612
assert!(read.is_empty());
46134613
node_0_stale_monitors.push(monitor);
46144614
}
46154615

46164616
let mut node_0_monitors = Vec::new();
46174617
for serialized in node_0_monitors_serialized.iter() {
46184618
let mut read = &serialized[..];
4619-
let (_, monitor) = <(BlockHash, ChannelMonitor<EnforcingSigner>)>::read(&mut read, keys_manager).unwrap();
4619+
let (_, monitor) = <(Option<BlockHash>, ChannelMonitor<EnforcingSigner>)>::read(&mut read, keys_manager).unwrap();
46204620
assert!(read.is_empty());
46214621
node_0_monitors.push(monitor);
46224622
}
@@ -7489,7 +7489,7 @@ fn test_data_loss_protect() {
74897489

74907490
// Restore node A from previous state
74917491
logger = test_utils::TestLogger::with_id(format!("node {}", 0));
7492-
let mut chain_monitor = <(BlockHash, ChannelMonitor<EnforcingSigner>)>::read(&mut ::std::io::Cursor::new(previous_chain_monitor_state.0), keys_manager).unwrap().1;
7492+
let mut chain_monitor = <(Option<BlockHash>, ChannelMonitor<EnforcingSigner>)>::read(&mut ::std::io::Cursor::new(previous_chain_monitor_state.0), keys_manager).unwrap().1;
74937493
chain_source = test_utils::TestChainSource::new(Network::Testnet);
74947494
tx_broadcaster = test_utils::TestBroadcaster{txn_broadcasted: Mutex::new(Vec::new())};
74957495
fee_estimator = test_utils::TestFeeEstimator { sat_per_kw: 253 };
@@ -8364,7 +8364,7 @@ fn test_update_err_monitor_lockdown() {
83648364
let monitor = monitors.get(&outpoint).unwrap();
83658365
let mut w = test_utils::TestVecWriter(Vec::new());
83668366
monitor.write(&mut w).unwrap();
8367-
let new_monitor = <(BlockHash, channelmonitor::ChannelMonitor<EnforcingSigner>)>::read(
8367+
let new_monitor = <(Option<BlockHash>, channelmonitor::ChannelMonitor<EnforcingSigner>)>::read(
83688368
&mut ::std::io::Cursor::new(&w.0), &test_utils::OnlyReadsKeysInterface {}).unwrap().1;
83698369
assert!(new_monitor == *monitor);
83708370
let watchtower = test_utils::TestChainMonitor::new(Some(&chain_source), &chanmon_cfgs[0].tx_broadcaster, &logger, &chanmon_cfgs[0].fee_estimator, &persister, &node_cfgs[0].keys_manager);
@@ -8423,7 +8423,7 @@ fn test_concurrent_monitor_claim() {
84238423
let monitor = monitors.get(&outpoint).unwrap();
84248424
let mut w = test_utils::TestVecWriter(Vec::new());
84258425
monitor.write(&mut w).unwrap();
8426-
let new_monitor = <(BlockHash, channelmonitor::ChannelMonitor<EnforcingSigner>)>::read(
8426+
let new_monitor = <(Option<BlockHash>, channelmonitor::ChannelMonitor<EnforcingSigner>)>::read(
84278427
&mut ::std::io::Cursor::new(&w.0), &test_utils::OnlyReadsKeysInterface {}).unwrap().1;
84288428
assert!(new_monitor == *monitor);
84298429
let watchtower = test_utils::TestChainMonitor::new(Some(&chain_source), &chanmon_cfgs[0].tx_broadcaster, &logger, &chanmon_cfgs[0].fee_estimator, &persister, &node_cfgs[0].keys_manager);
@@ -8449,7 +8449,7 @@ fn test_concurrent_monitor_claim() {
84498449
let monitor = monitors.get(&outpoint).unwrap();
84508450
let mut w = test_utils::TestVecWriter(Vec::new());
84518451
monitor.write(&mut w).unwrap();
8452-
let new_monitor = <(BlockHash, channelmonitor::ChannelMonitor<EnforcingSigner>)>::read(
8452+
let new_monitor = <(Option<BlockHash>, channelmonitor::ChannelMonitor<EnforcingSigner>)>::read(
84538453
&mut ::std::io::Cursor::new(&w.0), &test_utils::OnlyReadsKeysInterface {}).unwrap().1;
84548454
assert!(new_monitor == *monitor);
84558455
let watchtower = test_utils::TestChainMonitor::new(Some(&chain_source), &chanmon_cfgs[0].tx_broadcaster, &logger, &chanmon_cfgs[0].fee_estimator, &persister, &node_cfgs[0].keys_manager);

lightning/src/util/test_utils.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ impl<'a> chain::Watch<EnforcingSigner> for TestChainMonitor<'a> {
104104
// to a watchtower and disk...
105105
let mut w = TestVecWriter(Vec::new());
106106
monitor.write(&mut w).unwrap();
107-
let new_monitor = <(BlockHash, channelmonitor::ChannelMonitor<EnforcingSigner>)>::read(
107+
let new_monitor = <(Option<BlockHash>, channelmonitor::ChannelMonitor<EnforcingSigner>)>::read(
108108
&mut ::std::io::Cursor::new(&w.0), self.keys_manager).unwrap().1;
109109
assert!(new_monitor == monitor);
110110
self.latest_monitor_update_id.lock().unwrap().insert(funding_txo.to_channel_id(), (funding_txo, monitor.get_latest_update_id()));
@@ -137,7 +137,7 @@ impl<'a> chain::Watch<EnforcingSigner> for TestChainMonitor<'a> {
137137
let monitor = monitors.get(&funding_txo).unwrap();
138138
w.0.clear();
139139
monitor.write(&mut w).unwrap();
140-
let new_monitor = <(BlockHash, channelmonitor::ChannelMonitor<EnforcingSigner>)>::read(
140+
let new_monitor = <(Option<BlockHash>, channelmonitor::ChannelMonitor<EnforcingSigner>)>::read(
141141
&mut ::std::io::Cursor::new(&w.0), self.keys_manager).unwrap().1;
142142
assert!(new_monitor == *monitor);
143143
self.added_monitors.lock().unwrap().push((funding_txo, new_monitor));

0 commit comments

Comments
 (0)