private PluginBlockSimulationResult processSimulation(
      final long blockNumber,
      final List<? extends Transaction> transactions,
      final BlockOverrides blockOverrides,
      final StateOverrideMap stateOverrides,
      final boolean persistWorldState) {
    BlockHeader header = getBlockHeader(blockNumber);
    List<CallParameter> callParameters =
        transactions.stream().map(CallParameter::fromTransaction).toList();
    BlockStateCall blockStateCall =
        new BlockStateCall(callParameters, blockOverrides, stateOverrides);
    try (final MutableWorldState ws = getWorldState(header, persistWorldState)) {
      BlockSimulationParameter blockSimulationParameter =
          new BlockSimulationParameter.BlockSimulationParameterBuilder()
              .blockStateCalls(List.of(blockStateCall))
              .validation(true)
              .fakeSignature(FAKE_SIGNATURE)
              .build();

      List<BlockSimulationResult> results =
          blockSimulator.process(header, blockSimulationParameter, ws);
      BlockSimulationResult result = results.getFirst();
      if (persistWorldState) {
        ws.persist(result.getBlock().getHeader());
      }
      return response(result);
    } catch (final Exception e) {
      throw new RuntimeException("Error simulating block", e);
    }
  }
This method is experimental and should be used with caution. Simulate the processing of a block
given a header, a list of transactions, and blockOverrides and persist the WorldState

@param blockNumber the block number
@param transactions the transactions to include in the block
@param blockOverrides block overrides for the block
@param stateOverrides state overrides of the block
@return the PluginBlockSimulationResult
app/src/main/java/org/hyperledger/besu/services/BlockSimulatorServiceImpl.java