diff --git a/crates/starknet_batcher/src/batcher.rs b/crates/starknet_batcher/src/batcher.rs index 9183b8f2d4..e337a05d2e 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(), @@ -176,7 +180,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) = @@ -459,6 +467,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<()> { @@ -467,5 +486,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 1c161c3d04..a9a8ce8327 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::{fixture, 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; @@ -268,7 +268,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(); @@ -388,7 +388,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(); @@ -421,7 +421,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 a3a028a815..b2fc3e5968 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.")]