@NotNull
  @Override
  public PrecompileContractResult computePrecompile(
      final Bytes input, @NotNull final MessageFrame messageFrame) {

    if (input.size() >= 64 && input.slice(0, 64).equals(POINT_AT_INFINITY)) {
      return new PrecompileContractResult(
          POINT_AT_INFINITY, false, MessageFrame.State.COMPLETED_SUCCESS, Optional.empty());
    }

    PrecompileInputResultTuple res;
    Integer cacheKey = null;
    if (enableResultCaching) {
      cacheKey = getCacheKey(input);
      res = bnMulCache.getIfPresent(cacheKey);
      if (res != null) {
        if (res.cachedInput().equals(input)) {
          cacheEventConsumer.accept(new CacheEvent(PRECOMPILE_NAME, CacheMetric.HIT));
          return res.cachedResult();
        } else {
          LOG.debug(
              "false positive altbn128Mul {}, cache key {}, cached input: {}, input: {}",
              input.getClass().getSimpleName(),
              cacheKey,
              res.cachedInput().toHexString(),
              input.toHexString());

          cacheEventConsumer.accept(new CacheEvent(PRECOMPILE_NAME, CacheMetric.FALSE_POSITIVE));
        }
      } else {
        cacheEventConsumer.accept(new CacheEvent(PRECOMPILE_NAME, CacheMetric.MISS));
      }
    }

    if (useNative) {
      res =
          new PrecompileInputResultTuple(
              enableResultCaching ? input.copy() : input, computeNative(input, messageFrame));
    } else {
      res =
          new PrecompileInputResultTuple(
              enableResultCaching ? input.copy() : input, computeDefault(input));
    }
    if (cacheKey != null) {
      bnMulCache.put(cacheKey, res);
    }
    return res.cachedResult();
  }
Create Istanbul AltBN128Mul precompiled contract.

@param gasCalculator the gas calculator
@return the alt bn 128 mul precompiled contract
evm/src/main/java/org/hyperledger/besu/evm/precompile/AltBN128MulPrecompiledContract.java