docs: public void verify() throws VerificationException {
          if (inputs.size() == 0 || outputs.size() == 0)
              throw new VerificationException.EmptyInputsOrOutputs();
          if (this.getMessageSize() > Block.MAX_BLOCK_SIZE)
              throw new VerificationException.LargerThanMaxBlockSize();
  
          HashSet<TransactionOutPoint> outpoints = new HashSet<>();
          for (TransactionInput input : inputs) {
              if (outpoints.contains(input.getOutpoint()))
                  throw new VerificationException.DuplicatedOutPoint();
              outpoints.add(input.getOutpoint());
          }
  
          Coin valueOut = Coin.ZERO;
          for (TransactionOutput output : outputs) {
              Coin value = output.getValue();
              if (value.signum() < 0)
                  throw new VerificationException.NegativeValueOutput();
              try {
                  valueOut = valueOut.add(value);
              } catch (ArithmeticException e) {
                  throw new VerificationException.ExcessiveValue();
              }
              if (params.hasMaxMoney() && valueOut.compareTo(params.getMaxMoney()) > 0)
                  throw new VerificationException.ExcessiveValue();
          }
  
          if (isCoinBase()) {
              if (inputs.get(0).getScriptBytes().length < 2 || inputs.get(0).getScriptBytes().length > 100)
                  throw new VerificationException.CoinbaseScriptSizeOutOfRange();
          } else {
              for (TransactionInput input : inputs)
                  if (input.isCoinBase())
                      throw new VerificationException.UnexpectedCoinbaseInput();
          }
      }