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

Method build_pending_state_for_same_block

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

Source from the content-addressed store, hash-verified

567 )
568 )]
569 fn build_pending_state_for_same_block(
570 &self,
571 prev_pending_blocks: &Arc<PendingBlocks>,
572 flashblock: &Flashblock,
573 ) -> Result<Option<Arc<PendingBlocks>>> {
574 let latest_block_base = prev_pending_blocks.latest_block_base().clone();
575 let latest_block_l1_block_info = prev_pending_blocks.latest_block_l1_block_info().clone();
576 let latest_flashblock_tx_start = prev_pending_blocks.pending_transaction_count();
577
578 let mut live_state = self.lock_live_state();
579 let Some(LivePendingState { mut db, state_overrides }) = live_state.take() else {
580 warn!(
581 message = "live pending state unavailable, falling back to full rebuild",
582 block_number = flashblock.metadata.block_number,
583 flashblock_index = flashblock.index,
584 path = "same_block"
585 );
586 let mut flashblocks = prev_pending_blocks.get_flashblocks();
587 flashblocks.push(flashblock.clone());
588 return self.build_pending_state(Some(Arc::clone(prev_pending_blocks)), &flashblocks);
589 };
590 drop(live_state);
591
592 let latest_header = prev_pending_blocks.latest_header();
593 let mut latest_block_flashblocks = prev_pending_blocks.latest_block_flashblocks();
594 latest_block_flashblocks.push(flashblock.clone());
595 let latest_block_header =
596 BlockAssembler::refresh_same_block_header(&latest_header, &latest_block_flashblocks)?;
597
598 db.block_hashes.insert(latest_block_base.block_number - 1, latest_block_base.parent_hash);
599
600 let evm_config = BaseEvmConfig::base(self.client.chain_spec());
601 let evm_env = evm_config
602 .evm_env(&latest_header)
603 .map_err(|e| ExecutionError::EvmEnv(e.to_string()))?;
604 let evm = evm_config.evm_with_env(db, evm_env);
605
606 let previous_block_transaction_count = prev_pending_blocks.latest_block_transaction_count();
607 let pending_block = Block {
608 header: Header {
609 parent_hash: latest_block_base.parent_hash,
610 number: latest_block_base.block_number,
611 timestamp: latest_block_base.timestamp,
612 gas_limit: latest_block_base.gas_limit,
613 base_fee_per_gas: Some(latest_block_base.base_fee_per_gas.saturating_to()),
614 ..Default::default()
615 },
616 body: BlockBody {
617 transactions: flashblock
618 .diff
619 .transactions
620 .iter()
621 .map(|tx| {
622 base_common_consensus::decode_2718_canonical::<BaseTxEnvelope>(tx.as_ref())
623 })
624 .collect::<std::result::Result<_, _>>()
625 .map_err(|e| ExecutionError::BlockConversion(e.to_string()))?,
626 ..Default::default()

Callers 1

process_flashblockMethod · 0.80

Tested by

no test coverage detected