diff --git a/core/bin/zksync_core/src/eth_watch/mod.rs b/core/bin/zksync_core/src/eth_watch/mod.rs index 8c75ea6e38..90f5c93644 100644 --- a/core/bin/zksync_core/src/eth_watch/mod.rs +++ b/core/bin/zksync_core/src/eth_watch/mod.rs @@ -165,13 +165,24 @@ impl<W: EthClient> EthWatch<W> { // Extend the existing priority operations with the new ones. let mut priority_queue = sift_outdated_ops(self.eth_state.priority_queue()); - let new_priority_op_ids: Vec<_> = priority_queue.keys().cloned().collect(); - vlog::debug!("New priority ops added: {:?}", new_priority_op_ids); for (serial_id, op) in received_priority_queue { priority_queue.insert(serial_id, op); } + // Check for gaps in priority queue. If some event is missing we skip this `ETHState` update. + let mut priority_op_ids: Vec<_> = priority_queue.keys().cloned().collect(); + priority_op_ids.sort_unstable(); + for i in 0..priority_op_ids.len().saturating_sub(1) { + let gap = priority_op_ids[i + 1] - priority_op_ids[i]; + anyhow::ensure!( + gap == 1, + "Gap in priority op queue: gap={}, priority_op_before_gap={}", + gap, + priority_op_ids[i] + ); + } + let new_state = ETHState::new(last_ethereum_block, unconfirmed_queue, priority_queue); self.set_new_state(new_state); Ok(()) @@ -200,7 +211,7 @@ impl<W: EthClient> EthWatch<W> { new_block_with_accepted_events.saturating_sub(unprocessed_blocks_amount); let unconfirmed_queue = self.get_unconfirmed_ops(current_ethereum_block).await?; - let priority_queue = self + let priority_queue: HashMap<u64, _> = self .client .get_priority_op_events( BlockNumber::Number(previous_block_with_accepted_events.into()), @@ -211,6 +222,15 @@ impl<W: EthClient> EthWatch<W> { .map(|priority_op| (priority_op.serial_id, priority_op.into())) .collect(); + let mut new_priority_op_ids: Vec<_> = priority_queue.keys().cloned().collect(); + new_priority_op_ids.sort_unstable(); + vlog::debug!( + "Updating eth state: block_range=[{},{}], new_priority_ops={:?}", + previous_block_with_accepted_events, + new_block_with_accepted_events, + new_priority_op_ids + ); + Ok((unconfirmed_queue, priority_queue)) }