diff --git a/src/main/java/org/tron/common/runtime/Runtime.java b/src/main/java/org/tron/common/runtime/Runtime.java index 123284e3e1f..294117da387 100644 --- a/src/main/java/org/tron/common/runtime/Runtime.java +++ b/src/main/java/org/tron/common/runtime/Runtime.java @@ -341,9 +341,8 @@ private long getGasLimit(AccountCapsule account, long feeLimit) { cpuGasFromFeeLimit = feeLimit / Constant.SUN_PER_GAS; } else { long totalCpuGasFromFreeze = cpuProcessor.calculateGlobalCpuLimit(balanceForCpuFreeze); - long leftBalanceForCpuFreeze = BigInteger.valueOf(cpuGasFromFreeze) - .multiply(BigInteger.valueOf(balanceForCpuFreeze)) - .divide(BigInteger.valueOf(totalCpuGasFromFreeze)).longValue(); + long leftBalanceForCpuFreeze = getCpuFee(balanceForCpuFreeze, cpuGasFromFreeze, + totalCpuGasFromFreeze); if (leftBalanceForCpuFreeze >= feeLimit) { cpuGasFromFeeLimit = BigInteger.valueOf(totalCpuGasFromFreeze) @@ -627,15 +626,14 @@ private boolean spendUsage(long usedStorageSize) { long callerCpuFrozen = caller.getCpuFrozenBalance(); long callerCpuLeft = cpuProcessor.getAccountLeftCpuInUsFromFreeze(caller); long callerCpuTotal = cpuProcessor.calculateGlobalCpuLimit(callerCpuFrozen); + if (callerCpuUsage <= callerCpuLeft) { - long cpuFee = BigInteger.valueOf(callerCpuFrozen).multiply(BigInteger.valueOf(callerCpuUsage)) - .divide(BigInteger.valueOf(callerCpuTotal)).longValue(); + long cpuFee = getCpuFee(callerCpuUsage, callerCpuFrozen, callerCpuTotal); storageFee -= cpuFee; } else { - long cpuFee = BigInteger.valueOf(callerCpuFrozen).multiply(BigInteger.valueOf(callerCpuLeft)) - .divide(BigInteger.valueOf(callerCpuTotal)).longValue(); - storageFee -= cpuFee + Math - .multiplyExact(callerCpuUsage - callerCpuLeft, Constant.SUN_PER_GAS); + long cpuFee = getCpuFee(callerCpuLeft, callerCpuFrozen, callerCpuTotal); + storageFee -= (cpuFee + Math + .multiplyExact(callerCpuUsage - callerCpuLeft, Constant.SUN_PER_GAS)); } long tryBuyStorage = storageMarket.tryBuyStorage(storageFee); if (tryBuyStorage + caller.getStorageLeft() < callerStorageUsage) { @@ -646,6 +644,14 @@ private boolean spendUsage(long usedStorageSize) { return true; } + private long getCpuFee(long callerCpuUsage, long callerCpuFrozen, long callerCpuTotal) { + if (callerCpuTotal <= 0) { + return 0; + } + return BigInteger.valueOf(callerCpuFrozen).multiply(BigInteger.valueOf(callerCpuUsage)) + .divide(BigInteger.valueOf(callerCpuTotal)).longValue(); + } + private boolean isCallConstant() { if (TRX_CONTRACT_CALL_TYPE.equals(trxType)) { ABI abi = deposit.getContract(result.getContractAddress()).getInstance().getAbi(); diff --git a/src/main/java/org/tron/core/services/WitnessService.java b/src/main/java/org/tron/core/services/WitnessService.java index 6211213c4f7..eaad0658e5e 100755 --- a/src/main/java/org/tron/core/services/WitnessService.java +++ b/src/main/java/org/tron/core/services/WitnessService.java @@ -4,7 +4,6 @@ import com.google.common.collect.Maps; import com.google.protobuf.ByteString; -import java.util.Date; import java.util.Map; import lombok.Getter; import lombok.extern.slf4j.Slf4j; @@ -248,9 +247,6 @@ private BlockProductionCondition tryProduceBlock() throws InterruptedException { try { - logger.error("setGeneratingBlock true " + String - .format("%tF %tT", new Date(), new Date())); - controller.setGeneratingBlock(true); BlockCapsule block = generateBlock(scheduledTime, scheduledWitness); @@ -280,11 +276,7 @@ private BlockProductionCondition tryProduceBlock() throws InterruptedException { return BlockProductionCondition.EXCEPTION_PRODUCING_BLOCK; } finally { controller.setGeneratingBlock(false); - logger.error("setGeneratingBlock true " + String - .format("%tF %tT", new Date(), new Date())); } - - } private void broadcastBlock(BlockCapsule block) {