diff --git a/crates/starknet_batcher/src/batcher.rs b/crates/starknet_batcher/src/batcher.rs index 29d4713762a..320681a756f 100644 --- a/crates/starknet_batcher/src/batcher.rs +++ b/crates/starknet_batcher/src/batcher.rs @@ -130,7 +130,11 @@ impl Batcher { propose_block_input: ProposeBlockInput, ) -> BatcherResult<()> { let active_height = self.active_height.ok_or(BatcherError::NoActiveHeight)?; - verify_block_input(active_height, propose_block_input.retrospective_block_hash)?; + verify_block_input( + active_height, + propose_block_input.block_info.block_number, + propose_block_input.retrospective_block_hash, + )?; let tx_provider = ProposeTransactionProvider::new( self.mempool_client.clone(), @@ -172,7 +176,11 @@ impl Batcher { validate_block_input: ValidateBlockInput, ) -> BatcherResult<()> { let active_height = self.active_height.ok_or(BatcherError::NoActiveHeight)?; - verify_block_input(active_height, validate_block_input.retrospective_block_hash)?; + verify_block_input( + active_height, + validate_block_input.block_info.block_number, + validate_block_input.retrospective_block_hash, + )?; // A channel to send the transactions to include in the block being validated. let (input_tx_sender, input_tx_receiver) = @@ -451,6 +459,17 @@ pub fn deadline_as_instant(deadline: chrono::DateTime) -> BatcherResult, +) -> BatcherResult<()> { + verify_non_empty_retrospective_block_hash(height, retrospective_block_hash)?; + verify_block_number(height, block_number)?; + + Ok(()) +} + +fn verify_non_empty_retrospective_block_hash( height: BlockNumber, retrospective_block_hash: Option, ) -> BatcherResult<()> { @@ -459,5 +478,14 @@ fn verify_block_input( { return Err(BatcherError::MissingRetrospectiveBlockHash); } + + Ok(()) +} + +fn verify_block_number(height: BlockNumber, block_number: BlockNumber) -> BatcherResult<()> { + if block_number != height { + return Err(BatcherError::InvalidBlockNumber { active_height: height, block_number }); + } + Ok(()) } diff --git a/crates/starknet_batcher/src/batcher_test.rs b/crates/starknet_batcher/src/batcher_test.rs index a0e11bef264..c81dea80e36 100644 --- a/crates/starknet_batcher/src/batcher_test.rs +++ b/crates/starknet_batcher/src/batcher_test.rs @@ -10,7 +10,7 @@ use futures::FutureExt; use mockall::automock; use mockall::predicate::{always, eq}; use rstest::rstest; -use starknet_api::block::BlockNumber; +use starknet_api::block::{BlockInfo, BlockNumber}; use starknet_api::core::{ContractAddress, Nonce, StateDiffCommitment}; use starknet_api::executable_transaction::Transaction; use starknet_api::hash::PoseidonHash; @@ -263,7 +263,7 @@ async fn validate_block_full_flow() { proposal_id: PROPOSAL_ID, deadline: deadline(), retrospective_block_hash: None, - block_info: Default::default(), + block_info: BlockInfo { block_number: INITIAL_HEIGHT, ..Default::default() }, }; batcher.validate_block(validate_block_input).await.unwrap(); @@ -387,7 +387,7 @@ async fn send_finish_to_an_invalid_proposal() { proposal_id: PROPOSAL_ID, deadline: deadline(), retrospective_block_hash: None, - block_info: Default::default(), + block_info: BlockInfo { block_number: INITIAL_HEIGHT, ..Default::default() }, }; batcher.validate_block(validate_block_input).await.unwrap(); @@ -424,7 +424,7 @@ async fn propose_block_full_flow() { proposal_id: PROPOSAL_ID, retrospective_block_hash: None, deadline: chrono::Utc::now() + chrono::Duration::seconds(1), - block_info: Default::default(), + block_info: BlockInfo { block_number: INITIAL_HEIGHT, ..Default::default() }, }) .await .unwrap(); diff --git a/crates/starknet_batcher_types/src/errors.rs b/crates/starknet_batcher_types/src/errors.rs index a3a028a815e..b2fc3e5968a 100644 --- a/crates/starknet_batcher_types/src/errors.rs +++ b/crates/starknet_batcher_types/src/errors.rs @@ -20,6 +20,8 @@ pub enum BatcherError { HeightInProgress, #[error("Internal server error.")] InternalError, + #[error("Invalid block number. The active height is {active_height}, got {block_number}.")] + InvalidBlockNumber { active_height: BlockNumber, block_number: BlockNumber }, #[error("Missing retrospective block hash.")] MissingRetrospectiveBlockHash, #[error("Attempt to start proposal with no active height.")]