From: Jeffrey Czyz Date: Thu, 4 Mar 2021 02:33:54 +0000 (-0800) Subject: Correctly update the last block hash on disconnect X-Git-Url: http://git.bitcoin.ninja/?a=commitdiff_plain;h=390ff52e68d13dea32f648d58b745fd6a7d5c7f1;p=rust-lightning Correctly update the last block hash on disconnect When a block is disconnected, the hash of the disconnected block was used to update the last connected block. However, this amounts to a no-op because these hashes should be equal. Successive disconnections would update the hash but leave it one block off. Normally, this not a problem because the last block_disconnected should be followed by block_connected since the former is triggered by a chain re-org. However, this assumes the user calls the API correctly and that no failure occurs that would prevent block_connected from being called (e.g., if fetching the connected block fails). Instead, update the last block hash with the disconnected block's previous block hash. --- diff --git a/lightning/src/chain/channelmonitor.rs b/lightning/src/chain/channelmonitor.rs index 8a8a5b96d..235266127 100644 --- a/lightning/src/chain/channelmonitor.rs +++ b/lightning/src/chain/channelmonitor.rs @@ -2090,8 +2090,7 @@ impl ChannelMonitorImpl { F::Target: FeeEstimator, L::Target: Logger, { - let block_hash = header.block_hash(); - log_trace!(logger, "Block {} at height {} disconnected", block_hash, height); + log_trace!(logger, "Block {} at height {} disconnected", header.block_hash(), height); if let Some(_) = self.onchain_events_waiting_threshold_conf.remove(&(height + ANTI_REORG_DELAY - 1)) { //We may discard: @@ -2101,7 +2100,7 @@ impl ChannelMonitorImpl { self.onchain_tx_handler.block_disconnected(height, broadcaster, fee_estimator, logger); - self.last_block_hash = block_hash; + self.last_block_hash = header.prev_blockhash; } /// Filters a block's `txdata` for transactions spending watched outputs or for any child diff --git a/lightning/src/ln/channelmanager.rs b/lightning/src/ln/channelmanager.rs index 30f745c3f..ded254d06 100644 --- a/lightning/src/ln/channelmanager.rs +++ b/lightning/src/ln/channelmanager.rs @@ -3327,7 +3327,7 @@ impl ChannelMana } }); - *self.last_block_hash.lock().unwrap() = header.block_hash(); + *self.last_block_hash.lock().unwrap() = header.prev_blockhash; self.latest_block_height.fetch_sub(1, Ordering::AcqRel); }