public Bytes process(
      final Address callAddress, final BlockProcessingContext context, final Bytes inputData) {
    WorldUpdater updater = context.getWorldState().updater();
    final Account maybeContract = updater.get(callAddress);
    if (maybeContract == null) {
      LOG.error("Invalid system call address: {}", callAddress);
      throw new InvalidSystemCallAddressException("Invalid system call address: " + callAddress);
    }
    if (maybeContract.getCode().isEmpty()) {
      LOG.error("Invalid system call address: {}", callAddress);
      throw new InvalidSystemCallAddressException(
          "Invalid system call, no code at address " + callAddress);
    }

    final AbstractMessageProcessor processor =
        mainnetTransactionProcessor.getMessageProcessor(MessageFrame.Type.MESSAGE_CALL);
    final MessageFrame frame =
        createMessageFrame(
            callAddress,
            updater,
            context.getBlockHeader(),
            context.getBlockHashLookup(),
            inputData);

    if (!frame.getCode().isValid()) {
      throw new RuntimeException("System call did not execute to completion - opcode invalid");
    }

    Deque<MessageFrame> stack = frame.getMessageFrameStack();
    while (!stack.isEmpty()) {
      processor.process(stack.peekFirst(), context.getOperationTracer());
    }

    if (frame.getState() == MessageFrame.State.COMPLETED_SUCCESS) {
      updater.commit();
      return frame.getOutputData();
    }

    // The call must execute to completion
    String errorMessage =
        frame
            .getExceptionalHaltReason()
            .map(haltReason -> "System call halted: " + haltReason.getDescription())
            .orElse("System call did not execute to completion");
    throw new RuntimeException(errorMessage);
  }
Processes a system call.

@param callAddress The address to call.
@param context The system call context. The input data to the system call.
@param inputData The input data to the system call.
@return The output of the system call.
ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/systemcall/SystemCallProcessor.java