Skip to content

Commit f8bab83

Browse files
committed
feature(tvm): optimize the check of cpu time
1 parent 662959d commit f8bab83

File tree

2 files changed

+21
-7
lines changed

2 files changed

+21
-7
lines changed

actuator/src/main/java/org/tron/core/vm/PrecompiledContracts.java

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -52,20 +52,20 @@
5252
import org.tron.common.utils.BIUtil;
5353
import org.tron.common.utils.ByteArray;
5454
import org.tron.common.utils.ByteUtil;
55-
import org.tron.common.utils.ForkController;
5655
import org.tron.common.utils.Sha256Hash;
5756
import org.tron.common.zksnark.JLibrustzcash;
5857
import org.tron.common.zksnark.LibrustzcashParam;
5958
import org.tron.core.capsule.AccountCapsule;
6059
import org.tron.core.capsule.TransactionCapsule;
6160
import org.tron.core.capsule.WitnessCapsule;
62-
import org.tron.core.config.Parameter;
6361
import org.tron.core.db.TransactionTrace;
6462
import org.tron.core.exception.ZksnarkException;
6563
import org.tron.core.vm.config.VMConfig;
6664
import org.tron.core.vm.program.Program;
65+
import org.tron.core.vm.program.Program.OutOfTimeException;
6766
import org.tron.core.vm.repository.Repository;
6867
import org.tron.core.vm.utils.FreezeV2Util;
68+
import org.tron.core.vm.utils.MUtil;
6969
import org.tron.core.vm.utils.VoteRewardUtil;
7070
import org.tron.protos.Protocol;
7171
import org.tron.protos.Protocol.Permission;
@@ -948,11 +948,12 @@ public Pair<Boolean, byte[]> execute(byte[] rawData) {
948948
for (byte[] sign : signatures) {
949949
byte[] recoveredAddr = recoverAddrBySign(sign, hash);
950950

951-
if (ForkController.instance().pass(Parameter.ForkBlockVersionEnum.VERSION_4_7_1)) {
952-
sign = recoveredAddr;
953-
}
954-
if (ByteArray.matrixContains(executedSignList, sign)) {
955-
continue;
951+
sign = merge(recoveredAddr, sign);
952+
if (ByteArray.matrixContains(executedSignList, recoveredAddr)) {
953+
if (ByteArray.matrixContains(executedSignList, sign)) {
954+
continue;
955+
}
956+
MUtil.checkCPUTime();
956957
}
957958
long weight = TransactionCapsule.getWeight(permission, recoveredAddr);
958959
if (weight == 0) {
@@ -961,13 +962,17 @@ public Pair<Boolean, byte[]> execute(byte[] rawData) {
961962
}
962963
totalWeight += weight;
963964
executedSignList.add(sign);
965+
executedSignList.add(recoveredAddr);
964966
}
965967

966968
if (totalWeight >= permission.getThreshold()) {
967969
return Pair.of(true, dataOne());
968970
}
969971
}
970972
} catch (Throwable t) {
973+
if (t instanceof OutOfTimeException) {
974+
throw t;
975+
}
971976
logger.info("ValidateMultiSign error:{}", t.getMessage());
972977
}
973978
}

actuator/src/main/java/org/tron/core/vm/utils/MUtil.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
11
package org.tron.core.vm.utils;
22

3+
import org.tron.common.utils.ForkController;
34
import org.tron.core.capsule.AccountCapsule;
5+
import org.tron.core.config.Parameter;
46
import org.tron.core.exception.ContractValidateException;
57
import org.tron.core.vm.VMUtils;
8+
import org.tron.core.vm.program.Program.OutOfTimeException;
69
import org.tron.core.vm.repository.Repository;
710
import org.tron.protos.Protocol;
811

@@ -55,4 +58,10 @@ public static boolean isNullOrEmpty(String str) {
5558
public static boolean isNotNullOrEmpty(String str) {
5659
return !isNullOrEmpty(str);
5760
}
61+
62+
public static void checkCPUTime() {
63+
if (ForkController.instance().pass(Parameter.ForkBlockVersionEnum.VERSION_4_7_1)) {
64+
throw new OutOfTimeException("CPU timeout for 0x0a executing");
65+
}
66+
}
5867
}

0 commit comments

Comments
 (0)