From 282981174932d1ef31cf2501209ced7bacf12403 Mon Sep 17 00:00:00 2001 From: refcell Date: Wed, 24 Apr 2024 15:09:25 -0400 Subject: [PATCH 1/3] fix(derive): small fixes across the codebase --- crates/derive/src/sources/blobs.rs | 1 - crates/derive/src/sources/calldata.rs | 1 - crates/derive/src/types/batch/mod.rs | 1 - .../src/types/batch/span_batch/batch.rs | 22 +++++++++---------- crates/derive/src/types/ecotone.rs | 1 - 5 files changed, 11 insertions(+), 15 deletions(-) diff --git a/crates/derive/src/sources/blobs.rs b/crates/derive/src/sources/blobs.rs index 869d974eaa..245168dff9 100644 --- a/crates/derive/src/sources/blobs.rs +++ b/crates/derive/src/sources/blobs.rs @@ -13,7 +13,6 @@ use tracing::warn; /// A data iterator that reads from a blob. #[derive(Debug, Clone)] -#[allow(dead_code)] pub struct BlobSource where F: ChainProvider + Send, diff --git a/crates/derive/src/sources/calldata.rs b/crates/derive/src/sources/calldata.rs index c88ffdbe5f..f9a4000e58 100644 --- a/crates/derive/src/sources/calldata.rs +++ b/crates/derive/src/sources/calldata.rs @@ -11,7 +11,6 @@ use async_trait::async_trait; /// A data iterator that reads from calldata. #[derive(Debug, Clone)] -#[allow(dead_code)] pub struct CalldataSource where CP: ChainProvider + Send, diff --git a/crates/derive/src/types/batch/mod.rs b/crates/derive/src/types/batch/mod.rs index 877fae810f..58541377fb 100644 --- a/crates/derive/src/types/batch/mod.rs +++ b/crates/derive/src/types/batch/mod.rs @@ -62,7 +62,6 @@ impl BatchWithInclusionBlock { /// A Batch. #[derive(Debug, Clone, PartialEq, Eq)] -#[allow(clippy::large_enum_variant)] pub enum Batch { /// A single batch Single(SingleBatch), diff --git a/crates/derive/src/types/batch/span_batch/batch.rs b/crates/derive/src/types/batch/span_batch/batch.rs index ac50a064ff..1c7e342dec 100644 --- a/crates/derive/src/types/batch/span_batch/batch.rs +++ b/crates/derive/src/types/batch/span_batch/batch.rs @@ -1,7 +1,5 @@ //! The Span Batch Type -#![allow(unused)] - use super::{SpanBatchError, SpanBatchTransactions}; use crate::{ traits::L2ChainProvider, @@ -10,7 +8,8 @@ use crate::{ SpanBatchBits, SpanBatchElement, SpanBatchPayload, SpanBatchPrefix, }, }; -use alloc::{vec, vec::Vec}; + +use alloc::vec::Vec; use alloy_primitives::FixedBytes; use op_alloy_consensus::OpTxType; use tracing::{info, warn}; @@ -115,7 +114,7 @@ impl SpanBatch { // If the span batch does not overlap the current safe chain, parent block should be the L2 // safe head. let mut parent_num = l2_safe_head.block_info.number; - let parent_block = l2_safe_head; + let mut parent_block = l2_safe_head; if self.timestamp() < next_timestamp { if self.timestamp() > l2_safe_head.block_info.timestamp { // Batch timestamp cannot be between safe head and next timestamp. @@ -129,7 +128,7 @@ impl SpanBatch { parent_num = l2_safe_head.block_info.number - (l2_safe_head.block_info.timestamp - self.timestamp()) / cfg.block_time - 1; - let parent_block = match fetcher.l2_block_info_by_number(parent_num).await { + parent_block = match fetcher.l2_block_info_by_number(parent_num).await { Ok(block) => block, Err(e) => { warn!("failed to fetch L2 block number {parent_num}: {e}"); @@ -321,9 +320,9 @@ impl SpanBatch { /// Converts the span batch to a raw span batch. pub fn to_raw_span_batch( &self, - origin_changed_bit: u8, + _origin_changed_bit: u8, genesis_timestamp: u64, - chain_id: u64, + _chain_id: u64, ) -> Result { if self.batches.is_empty() { return Err(SpanBatchError::EmptySpanBatch); @@ -365,13 +364,13 @@ impl SpanBatch { let origin_epoch_hash = l1_origins[origin_index..l1_origins.len()] .iter() .enumerate() - .find(|(i, origin)| origin.timestamp == batch.timestamp) + .find(|(_, origin)| origin.timestamp == batch.timestamp) .map(|(i, origin)| { origin_index = i; origin.hash }) .ok_or(SpanBatchError::MissingL1Origin)?; - let mut single_batch = SingleBatch { + let single_batch = SingleBatch { epoch_num: batch.epoch_num, epoch_hash: origin_epoch_hash, timestamp: batch.timestamp, @@ -437,6 +436,7 @@ mod tests { traits::test_utils::MockBlockFetcher, types::{BlockID, Genesis, L2ExecutionPayload, L2ExecutionPayloadEnvelope, RawTransaction}, }; + use alloc::vec; use alloy_primitives::{b256, Bytes, B256}; use op_alloy_consensus::OpTxType; use tracing::Level; @@ -446,7 +446,7 @@ mod tests { fn test_timestamp() { let timestamp = 10; let first_element = SpanBatchElement { timestamp, ..Default::default() }; - let mut batch = + let batch = SpanBatch { batches: vec![first_element, Default::default()], ..Default::default() }; assert_eq!(batch.timestamp(), timestamp); } @@ -455,7 +455,7 @@ mod tests { fn test_starting_epoch_num() { let epoch_num = 10; let first_element = SpanBatchElement { epoch_num, ..Default::default() }; - let mut batch = + let batch = SpanBatch { batches: vec![first_element, Default::default()], ..Default::default() }; assert_eq!(batch.starting_epoch_num(), epoch_num); } diff --git a/crates/derive/src/types/ecotone.rs b/crates/derive/src/types/ecotone.rs index 091d6dc427..bc2c674c14 100644 --- a/crates/derive/src/types/ecotone.rs +++ b/crates/derive/src/types/ecotone.rs @@ -1,4 +1,3 @@ -#![allow(dead_code)] //! Module containing a [Transaction] builder for the Ecotone network updgrade transactions. //! //! [Transaction]: alloy_consensus::Transaction From e9a85d1b654c0dfa0266e49288fd8d8cb15fe25b Mon Sep 17 00:00:00 2001 From: refcell Date: Wed, 24 Apr 2024 17:44:20 -0400 Subject: [PATCH 2/3] fix(batch): span batch validation --- .../src/traits/test_utils/data_sources.rs | 7 +++- .../src/types/batch/span_batch/batch.rs | 32 ++++++++++++------- 2 files changed, 27 insertions(+), 12 deletions(-) diff --git a/crates/derive/src/traits/test_utils/data_sources.rs b/crates/derive/src/traits/test_utils/data_sources.rs index 1fb473f3e8..5540f1a40b 100644 --- a/crates/derive/src/traits/test_utils/data_sources.rs +++ b/crates/derive/src/traits/test_utils/data_sources.rs @@ -16,6 +16,8 @@ use hashbrown::HashMap; pub struct MockBlockFetcher { /// Blocks pub blocks: Vec, + /// Short circuit the block return to be the first block. + pub short_circuit: bool, /// Payloads pub payloads: Vec, /// System configs @@ -29,13 +31,16 @@ impl MockBlockFetcher { payloads: Vec, system_configs: HashMap, ) -> Self { - Self { blocks, payloads, system_configs } + Self { blocks, short_circuit: false, payloads, system_configs } } } #[async_trait] impl L2ChainProvider for MockBlockFetcher { async fn l2_block_info_by_number(&mut self, number: u64) -> Result { + if self.short_circuit { + return self.blocks.first().copied().ok_or_else(|| anyhow::anyhow!("Block not found")); + } self.blocks .iter() .find(|b| b.block_info.number == number) diff --git a/crates/derive/src/types/batch/span_batch/batch.rs b/crates/derive/src/types/batch/span_batch/batch.rs index 1c7e342dec..c7edf1b041 100644 --- a/crates/derive/src/types/batch/span_batch/batch.rs +++ b/crates/derive/src/types/batch/span_batch/batch.rs @@ -730,10 +730,12 @@ mod tests { }; let inclusion_block = BlockInfo::default(); let l2_block = L2BlockInfo { - block_info: BlockInfo { number: 40, ..Default::default() }, + block_info: BlockInfo { number: 41, timestamp: 10, ..Default::default() }, + l1_origin: BlockID { number: 9, ..Default::default() }, ..Default::default() }; let mut fetcher = MockBlockFetcher { blocks: vec![l2_block], ..Default::default() }; + fetcher.short_circuit = true; let first = SpanBatchElement { epoch_num: 10, timestamp: 10, ..Default::default() }; let second = SpanBatchElement { epoch_num: 11, timestamp: 20, ..Default::default() }; let batch = SpanBatch { @@ -769,7 +771,7 @@ mod tests { }; let inclusion_block = BlockInfo { number: 50, ..Default::default() }; let l2_block = L2BlockInfo { - block_info: BlockInfo { number: 40, ..Default::default() }, + block_info: BlockInfo { number: 40, parent_hash, timestamp: 10, ..Default::default() }, ..Default::default() }; let mut fetcher = MockBlockFetcher { blocks: vec![l2_block], ..Default::default() }; @@ -812,7 +814,8 @@ mod tests { }; let inclusion_block = BlockInfo { number: 50, ..Default::default() }; let l2_block = L2BlockInfo { - block_info: BlockInfo { number: 40, ..Default::default() }, + block_info: BlockInfo { number: 40, parent_hash, timestamp: 10, ..Default::default() }, + l1_origin: BlockID { number: 8, ..Default::default() }, ..Default::default() }; let mut fetcher = MockBlockFetcher { blocks: vec![l2_block], ..Default::default() }; @@ -862,7 +865,8 @@ mod tests { }; let inclusion_block = BlockInfo { number: 50, ..Default::default() }; let l2_block = L2BlockInfo { - block_info: BlockInfo { number: 40, ..Default::default() }, + block_info: BlockInfo { number: 40, timestamp: 10, parent_hash, ..Default::default() }, + l1_origin: BlockID { number: 9, ..Default::default() }, ..Default::default() }; let mut fetcher = MockBlockFetcher { blocks: vec![l2_block], ..Default::default() }; @@ -911,7 +915,8 @@ mod tests { }; let inclusion_block = BlockInfo { number: 50, ..Default::default() }; let l2_block = L2BlockInfo { - block_info: BlockInfo { number: 40, ..Default::default() }, + block_info: BlockInfo { number: 40, timestamp: 10, parent_hash, ..Default::default() }, + l1_origin: BlockID { number: 9, ..Default::default() }, ..Default::default() }; let mut fetcher = MockBlockFetcher { blocks: vec![l2_block], ..Default::default() }; @@ -957,7 +962,8 @@ mod tests { }; let inclusion_block = BlockInfo { number: 50, ..Default::default() }; let l2_block = L2BlockInfo { - block_info: BlockInfo { number: 40, ..Default::default() }, + block_info: BlockInfo { number: 40, timestamp: 10, parent_hash, ..Default::default() }, + l1_origin: BlockID { number: 14, ..Default::default() }, ..Default::default() }; let mut fetcher = MockBlockFetcher { blocks: vec![l2_block], ..Default::default() }; @@ -977,7 +983,7 @@ mod tests { assert_eq!(logs.len(), 1); let str = alloc::format!( "dropped batch, epoch is too old, minimum: {}", - l2_safe_head.block_info.id(), + l2_block.block_info.id(), ); assert!(logs[0].contains(&str)); } @@ -1297,7 +1303,8 @@ mod tests { }; let inclusion_block = BlockInfo { number: 50, ..Default::default() }; let l2_block = L2BlockInfo { - block_info: BlockInfo { number: 40, ..Default::default() }, + block_info: BlockInfo { number: 40, timestamp: 10, parent_hash, ..Default::default() }, + l1_origin: BlockID { number: 9, ..Default::default() }, ..Default::default() }; let mut fetcher = MockBlockFetcher { blocks: vec![l2_block], ..Default::default() }; @@ -1347,7 +1354,8 @@ mod tests { }; let inclusion_block = BlockInfo { number: 50, ..Default::default() }; let l2_block = L2BlockInfo { - block_info: BlockInfo { number: 40, ..Default::default() }, + block_info: BlockInfo { number: 40, timestamp: 10, parent_hash, ..Default::default() }, + l1_origin: BlockID { number: 9, ..Default::default() }, ..Default::default() }; let payload = L2ExecutionPayloadEnvelope { @@ -1411,7 +1419,8 @@ mod tests { }; let inclusion_block = BlockInfo { number: 50, ..Default::default() }; let l2_block = L2BlockInfo { - block_info: BlockInfo { number: 40, ..Default::default() }, + block_info: BlockInfo { number: 40, parent_hash, timestamp: 10, ..Default::default() }, + l1_origin: BlockID { number: 9, ..Default::default() }, ..Default::default() }; let payload = L2ExecutionPayloadEnvelope { @@ -1476,7 +1485,8 @@ mod tests { }; let inclusion_block = BlockInfo { number: 50, ..Default::default() }; let l2_block = L2BlockInfo { - block_info: BlockInfo { number: 40, ..Default::default() }, + block_info: BlockInfo { number: 40, parent_hash, timestamp: 10, ..Default::default() }, + l1_origin: BlockID { number: 9, ..Default::default() }, ..Default::default() }; let payload = L2ExecutionPayloadEnvelope { From 17f2a90121bc7e9893993e5c5a922f412c3cf4fc Mon Sep 17 00:00:00 2001 From: refcell Date: Wed, 24 Apr 2024 19:24:57 -0400 Subject: [PATCH 3/3] Update batch.rs Co-authored-by: clabby --- crates/derive/src/types/batch/span_batch/batch.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/crates/derive/src/types/batch/span_batch/batch.rs b/crates/derive/src/types/batch/span_batch/batch.rs index c7edf1b041..a4b45860cf 100644 --- a/crates/derive/src/types/batch/span_batch/batch.rs +++ b/crates/derive/src/types/batch/span_batch/batch.rs @@ -8,7 +8,6 @@ use crate::{ SpanBatchBits, SpanBatchElement, SpanBatchPayload, SpanBatchPrefix, }, }; - use alloc::vec::Vec; use alloy_primitives::FixedBytes; use op_alloy_consensus::OpTxType;