MCPcopy Create free account
hub / github.com/base/base / process_flashblock

Method process_flashblock

crates/execution/flashblocks/src/processor.rs:332–412  ·  view source on GitHub ↗
(
        &self,
        prev_pending_blocks: Option<Arc<PendingBlocks>>,
        flashblock: &Flashblock,
    )

Source from the content-addressed store, hash-verified

330 )
331 )]
332 fn process_flashblock(
333 &self,
334 prev_pending_blocks: Option<Arc<PendingBlocks>>,
335 flashblock: &Flashblock,
336 ) -> Result<Option<Arc<PendingBlocks>>> {
337 let pending_blocks = match &prev_pending_blocks {
338 Some(pb) => pb,
339 None => {
340 if flashblock.index == 0 {
341 return self.build_pending_state(None, std::slice::from_ref(flashblock));
342 }
343
344 return Err(StateProcessorError::MissingFirstFlashblock);
345 }
346 };
347
348 let validation_result = FlashblockSequenceValidator::validate(
349 pending_blocks.latest_block_number(),
350 pending_blocks.latest_flashblock_index(),
351 flashblock.metadata.block_number,
352 flashblock.index,
353 flashblock.metadata.prev_flashblock_id,
354 );
355
356 match validation_result {
357 SequenceValidationResult::NextInSequence => {
358 self.build_pending_state_for_same_block(pending_blocks, flashblock)
359 }
360 SequenceValidationResult::FirstOfNextBlock => {
361 self.build_pending_state_for_next_block(pending_blocks, flashblock)
362 }
363 SequenceValidationResult::Duplicate => {
364 // We have received a duplicate flashblock for the current block
365 Metrics::unexpected_block_order().increment(1);
366 warn!(
367 message = "Received duplicate Flashblock for current block, ignoring",
368 curr_block = %pending_blocks.latest_block_number(),
369 flashblock_index = %flashblock.index,
370 );
371 Ok(prev_pending_blocks)
372 }
373 SequenceValidationResult::InvalidNewBlockIndex { block_number, index: _ } => {
374 // We have received a non-zero flashblock for a new block
375 Metrics::unexpected_block_order().increment(1);
376 error!(
377 message = "Received non-zero index Flashblock for new block, zeroing Flashblocks until we receive a base Flashblock",
378 curr_block = %pending_blocks.latest_block_number(),
379 new_block = %block_number,
380 );
381 self.clear_live_state();
382 Ok(None)
383 }
384 SequenceValidationResult::NonSequentialGap { expected, actual } => {
385 Metrics::unexpected_block_order().increment(1);
386 error!(
387 curr_block = %pending_blocks.latest_block_number(),
388 expected_flashblock_index = %expected,
389 actual_flashblock_index = %actual,

Callers 1

apply_flashblockMethod · 0.45

Calls 7

build_pending_stateMethod · 0.80
clear_live_stateMethod · 0.80
latest_block_numberMethod · 0.45
incrementMethod · 0.45

Tested by

no test coverage detected