Skip to content

Commit

Permalink
optimize code
Browse files Browse the repository at this point in the history
  • Loading branch information
neo hong committed Aug 31, 2021
1 parent 0a234bc commit 6c72845
Show file tree
Hide file tree
Showing 10 changed files with 100 additions and 58 deletions.
12 changes: 6 additions & 6 deletions actuator/src/main/java/org/tron/core/actuator/VMActuator.java
Original file line number Diff line number Diff line change
Expand Up @@ -188,11 +188,10 @@ public void execute(Object object) throws ContractExeException {

if (TrxType.TRX_CONTRACT_CREATION_TYPE == trxType && !result.isRevert()) {
byte[] code = program.getResult().getHReturn();
if (vmConfig.allowTvmLondon() && code[0] == (byte) 0xEF) {
// todo deal with exception
if (code.length != 0 && vmConfig.allowTvmLondon() && code[0] == (byte) 0xEF) {
if (null == result.getException()) {
result.setException(Program.Exception
.invalidOpCode((byte) 0xEF));
.invalidCodeException());
}
}
long saveCodeEnergy = (long) getLength(code) * EnergyCost.getInstance().getCREATE_DATA();
Expand Down Expand Up @@ -297,9 +296,11 @@ private void create()
if (contract == null) {
throw new ContractValidateException("Cannot get CreateSmartContract from transaction");
}
SmartContract newSmartContract = contract.getNewContract();
SmartContract newSmartContract;
if (VMConfig.allowTvmCompatibleEvm()) {
newSmartContract = contract.getNewContract().toBuilder().setVersion(1).build();
} else {
newSmartContract = contract.getNewContract().toBuilder().clearVersion().build();
}
if (!contract.getOwnerAddress().equals(newSmartContract.getOriginAddress())) {
logger.info("OwnerAddress not equals OriginAddress");
Expand Down Expand Up @@ -488,8 +489,7 @@ private void call()
rootInternalTransaction = new InternalTransaction(trx, trxType);
this.program = new Program(code, programInvoke, rootInternalTransaction, vmConfig);
if (VMConfig.allowTvmCompatibleEvm()) {
this.program.setContractVersion(
repository.getContract(contractAddress).getContractVersion());
this.program.setContractVersion(deployedContract.getContractVersion());
}
byte[] txId = TransactionUtil.getTransactionId(trx).getBytes();
this.program.setRootTransactionId(txId);
Expand Down
52 changes: 25 additions & 27 deletions actuator/src/main/java/org/tron/core/utils/ProposalUtil.java
Original file line number Diff line number Diff line change
Expand Up @@ -477,30 +477,6 @@ public static void validator(DynamicPropertiesStore dynamicPropertiesStore,
}
break;
}
case ALLOW_TVM_LONDON: {
// todo version modify
// if (!forkController.pass(ForkBlockVersionEnum.VERSION_4_3)) {
// throw new ContractValidateException(
// "Bad chain parameter id [ALLOW_TVM_LONDON]");
// }
if (value != 1) {
throw new ContractValidateException(
"This value[ALLOW_TVM_LONDON] is only allowed to be 1");
}
break;
}
case ALLOW_TVM_COMPATIBLE_EVM: {
// todo version modify
// if (!forkController.pass(ForkBlockVersionEnum.VERSION_4_3)) {
// throw new ContractValidateException(
// "Bad chain parameter id [ALLOW_TVM_COMPATIBLE_EVM]");
// }
if (value != 1) {
throw new ContractValidateException(
"This value[ALLOW_TVM_COMPATIBLE_EVM] is only allowed to be 1");
}
break;
}
case FREE_NET_LIMIT: {
if (!forkController.pass(ForkBlockVersionEnum.VERSION_4_3)) {
throw new ContractValidateException("Bad chain parameter id [FREE_NET_LIMIT]");
Expand Down Expand Up @@ -533,6 +509,28 @@ public static void validator(DynamicPropertiesStore dynamicPropertiesStore,
}
break;
}
case ALLOW_TVM_LONDON: {
if (!forkController.pass(ForkBlockVersionEnum.VERSION_4_4)) {
throw new ContractValidateException(
"Bad chain parameter id [ALLOW_TVM_LONDON]");
}
if (value != 1) {
throw new ContractValidateException(
"This value[ALLOW_TVM_LONDON] is only allowed to be 1");
}
break;
}
case ALLOW_TVM_COMPATIBLE_EVM: {
if (!forkController.pass(ForkBlockVersionEnum.VERSION_4_4)) {
throw new ContractValidateException(
"Bad chain parameter id [ALLOW_TVM_COMPATIBLE_EVM]");
}
if (value != 1) {
throw new ContractValidateException(
"This value[ALLOW_TVM_COMPATIBLE_EVM] is only allowed to be 1");
}
break;
}
default:
break;
}
Expand Down Expand Up @@ -583,18 +581,18 @@ public enum ProposalType { // current value, value range
ALLOW_MARKET_TRANSACTION(44), // {0, 1}
MARKET_SELL_FEE(45), // 0 [0,10_000_000_000]
MARKET_CANCEL_FEE(46), // 0 [0,10_000_000_000]
MAX_FEE_LIMIT(47), // [0, 10_000_000_000]
MAX_FEE_LIMIT(47), // [0, 100_000_000_000] TRX
ALLOW_TRANSACTION_FEE_POOL(48), // 0, 1
ALLOW_BLACKHOLE_OPTIMIZATION(49),// 0,1
ALLOW_NEW_RESOURCE_MODEL(51),// 0,1
ALLOW_TVM_FREEZE(52), // 0, 1
ALLOW_ACCOUNT_ASSET_OPTIMIZATION(53), // 1
// ALLOW_NEW_REWARD_ALGORITHM(58), // 0, 1
ALLOW_TVM_VOTE(59), // 0, 1
ALLOW_TVM_COMPATIBLE_EVM(60),
ALLOW_TVM_COMPATIBLE_EVM(60), // 0, 1
FREE_NET_LIMIT(61), // 5000, [0, 100_000]
TOTAL_NET_LIMIT(62), // 43_200_000_000L, [0, 1000_000_000_000L]
ALLOW_TVM_LONDON(63);
ALLOW_TVM_LONDON(63); // 0, 1

private long code;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1783,19 +1783,19 @@ public Pair<Boolean, byte[]> execute(byte[] data) {

if (data.length != 213) {
logger.info("Incorrect input length. Expected {} and got {}", 213, data.length);
return Pair.of(true, DataWord.ZERO().getData());
return Pair.of(false, DataWord.ZERO().getData());
}
if ((data[212] & 0xFE) != 0) {
logger.info("Incorrect finalization flag, expected 0 or 1 and got {}", data[212]);
return Pair.of(true, DataWord.ZERO().getData());
return Pair.of(false, DataWord.ZERO().getData());
}
final MessageDigest digest = new Blake2bfMessageDigest();
byte[] result;
try {
digest.update(data);
result = digest.digest();
} catch (Exception e) {
return Pair.of(true, new DataWord(EMPTY_BYTE_ARRAY).getData());
return Pair.of(true, EMPTY_BYTE_ARRAY);
}
return Pair.of(true, result);
}
Expand Down
27 changes: 23 additions & 4 deletions actuator/src/main/java/org/tron/core/vm/VM.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,27 @@
import static org.tron.common.crypto.Hash.sha3;
import static org.tron.common.utils.ByteUtil.EMPTY_BYTE_ARRAY;
import static org.tron.core.db.TransactionTrace.convertToTronAddress;
import static org.tron.core.vm.OpCode.*;
import static org.tron.core.vm.OpCode.CALL;
import static org.tron.core.vm.OpCode.CALLTOKEN;
import static org.tron.core.vm.OpCode.CALLTOKENID;
import static org.tron.core.vm.OpCode.CALLTOKENVALUE;
import static org.tron.core.vm.OpCode.CHAINID;
import static org.tron.core.vm.OpCode.CREATE2;
import static org.tron.core.vm.OpCode.EXTCODEHASH;
import static org.tron.core.vm.OpCode.FREEZE;
import static org.tron.core.vm.OpCode.FREEZEEXPIRETIME;
import static org.tron.core.vm.OpCode.ISCONTRACT;
import static org.tron.core.vm.OpCode.PUSH1;
import static org.tron.core.vm.OpCode.REVERT;
import static org.tron.core.vm.OpCode.SAR;
import static org.tron.core.vm.OpCode.SELFBALANCE;
import static org.tron.core.vm.OpCode.SHL;
import static org.tron.core.vm.OpCode.SHR;
import static org.tron.core.vm.OpCode.TOKENBALANCE;
import static org.tron.core.vm.OpCode.UNFREEZE;
import static org.tron.core.vm.OpCode.VOTEWITNESS;
import static org.tron.core.vm.OpCode.WITHDRAWREWARD;
import static org.tron.core.vm.OpCode.BASEFEE;

import java.math.BigInteger;
import java.util.ArrayList;
Expand Down Expand Up @@ -100,8 +120,7 @@ public void step(Program program) {
&& (op == FREEZE || op == UNFREEZE || op == FREEZEEXPIRETIME))
|| (!VMConfig.allowTvmVote()
&& (op == VOTEWITNESS || op == WITHDRAWREWARD))
|| (!VMConfig.allowTvmLondon()
&& (op == BASEFEE))
|| (!VMConfig.allowTvmLondon() && (op == BASEFEE))
) {
throw Program.Exception.invalidOpCode(program.getCurrentOp());
}
Expand Down Expand Up @@ -812,7 +831,7 @@ && isDeadAccount(program, callAddressWord)
break;
case GASPRICE: {
DataWord energyPrice = new DataWord(0);
if (program.getContractVersion() == 1) {
if (VMConfig.allowTvmCompatibleEvm() && program.getContractVersion() == 1) {
energyPrice = new DataWord(program.getContractState()
.getDynamicPropertiesStore().getEnergyFee());
}
Expand Down
4 changes: 3 additions & 1 deletion actuator/src/main/java/org/tron/core/vm/config/VMConfig.java
Original file line number Diff line number Diff line change
Expand Up @@ -138,7 +138,9 @@ public static boolean allowShieldedTRC20Transaction() {
return ALLOW_SHIELDED_TRC20_TRANSACTION;
}

public static boolean allowTvmIstanbul() {return ALLOW_TVM_ISTANBUL; }
public static boolean allowTvmIstanbul() {
return ALLOW_TVM_ISTANBUL;
}

public static boolean allowTvmFreeze() {
return ALLOW_TVM_FREEZE;
Expand Down
35 changes: 25 additions & 10 deletions actuator/src/main/java/org/tron/core/vm/program/Program.java
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,6 @@
import static org.apache.commons.lang3.ArrayUtils.isEmpty;
import static org.apache.commons.lang3.ArrayUtils.isNotEmpty;
import static org.apache.commons.lang3.ArrayUtils.nullToEmpty;
import static org.tron.common.utils.ByteUtil.intToBytes;
import static org.tron.common.utils.ByteUtil.stripLeadingZeroes;
import static org.tron.core.config.Parameter.ChainConstant.TRX_PRECISION;

Expand Down Expand Up @@ -728,8 +727,8 @@ private void createContractImpl(DataWord value, byte[] programCode, byte[] newAd

if (!contractAlreadyExists) {
Builder builder = SmartContract.newBuilder();
if (getContractVersion() == 1) {
builder.setVersion(1);
if (VMConfig.allowTvmCompatibleEvm()) {
builder.setVersion(getContractVersion());
}
builder.setContractAddress(ByteString.copyFrom(newAddress))
.setConsumeUserResourcePercent(100)
Expand All @@ -744,8 +743,8 @@ private void createContractImpl(DataWord value, byte[] programCode, byte[] newAd
deposit.createAccount(newAddress, "CreatedByContract",
Protocol.AccountType.Contract);
Builder builder = SmartContract.newBuilder();
if (getContractVersion() == 1) {
builder.setVersion(1);
if (VMConfig.allowTvmCompatibleEvm()) {
builder.setVersion(getContractVersion());
}
SmartContract newSmartContract = builder.setContractAddress(ByteString.copyFrom(newAddress))
.setConsumeUserResourcePercent(100)
Expand Down Expand Up @@ -797,7 +796,7 @@ this, new DataWord(newAddress), getContractAddress(), value, new DataWord(0),
Program program = new Program(programCode, programInvoke, internalTx, config);
program.setRootTransactionId(this.rootTransactionId);
if (VMConfig.allowTvmCompatibleEvm()) {
program.setContractVersion(this.contractVersion);
program.setContractVersion(getContractVersion());
}
vm.play(program);
createResult = program.getResult();
Expand All @@ -811,9 +810,8 @@ this, new DataWord(newAddress), getContractAddress(), value, new DataWord(0),
byte[] code = createResult.getHReturn();

if (code.length != 0 && config.allowTvmLondon() && code[0] == (byte) 0xEF) {
// todo dealwith exception
createResult.setException(new BytecodeExecutionException(
"can't create a contract start with 0xef"));
createResult.setException(Program.Exception
.invalidCodeException());
}

long saveCodeEnergy = (long) getLength(code) * EnergyCost.getInstance().getCREATE_DATA();
Expand Down Expand Up @@ -1687,7 +1685,7 @@ public void checkTokenIdInTokenBalance(DataWord tokenIdDataWord) {
}

public DataWord getCallEnergy(OpCode op, DataWord requestedEnergy, DataWord availableEnergy) {
if (getContractVersion() == 1) {
if (VMConfig.allowTvmCompatibleEvm() && getContractVersion() == 1) {
DataWord availableEnergyReduce = availableEnergy.clone();
availableEnergyReduce.div(new DataWord(64));
availableEnergy.sub(availableEnergyReduce);
Expand All @@ -1696,6 +1694,11 @@ public DataWord getCallEnergy(OpCode op, DataWord requestedEnergy, DataWord avai
}

public DataWord getCreateEnergy(DataWord availableEnergy) {
if (VMConfig.allowTvmCompatibleEvm() && getContractVersion() == 1) {
DataWord availableEnergyReduce = availableEnergy.clone();
availableEnergyReduce.div(new DataWord(64));
availableEnergy.sub(availableEnergyReduce);
}
return availableEnergy;
}

Expand Down Expand Up @@ -2071,6 +2074,14 @@ public IllegalOperationException(String message, Object... args) {
}
}

@SuppressWarnings("serial")
public static class InvalidCodeException extends BytecodeExecutionException {

public InvalidCodeException(String message) {
super(message);
}
}

@SuppressWarnings("serial")
public static class BadJumpDestinationException extends BytecodeExecutionException {

Expand Down Expand Up @@ -2177,6 +2188,10 @@ public static IllegalOperationException invalidOpCode(byte... opCode) {
Hex.toHexString(opCode, 0, 1));
}

public static InvalidCodeException invalidCodeException() {
return new InvalidCodeException("invalid code: must not begin with 0xef");
}

public static BadJumpDestinationException badJumpDestination(int pc) {
return new BadJumpDestinationException("Operation with pc isn't 'JUMPDEST': PC[%d];", pc);
}
Expand Down
3 changes: 2 additions & 1 deletion common/src/main/java/org/tron/core/config/Parameter.java
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,8 @@ public enum ForkBlockVersionEnum {
VERSION_4_1(19, 1596780000000L, 80),//GMT 2020-08-07 06:00:00,80 means 22 SR upgrade
VERSION_4_1_2(20, 1596780000000L, 80),
VERSION_4_2(21, 1596780000000L, 80),
VERSION_4_3(22, 1596780000000L, 80);
VERSION_4_3(22, 1596780000000L, 80),
VERSION_4_4(23, 1596780000000L, 80);

@Getter
private int value;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -131,6 +131,10 @@ private void setResultCode(ProgramResult result) {
result.setResultCode(contractResult.TRANSFER_FAILED);
return;
}
if (exception instanceof Program.InvalidCodeException) {
result.setResultCode(contractResult.INVALID_CODE);
return;
}
result.setResultCode(contractResult.UNKNOWN);
}

Expand Down
14 changes: 8 additions & 6 deletions framework/src/main/java/org/tron/core/Wallet.java
Original file line number Diff line number Diff line change
Expand Up @@ -1005,13 +1005,15 @@ public Protocol.ChainParameters getChainParameters() {
.setValue(dbManager.getDynamicPropertiesStore().getAllowTvmVote())
.build());

builder.addChainParameter(
Protocol.ChainParameters.ChainParameter.newBuilder().setKey("getAllowTvmLondon")
.setValue(dbManager.getDynamicPropertiesStore().getAllowTvmLondon()).build());
builder.addChainParameter(Protocol.ChainParameters.ChainParameter.newBuilder()
.setKey("getAllowTvmLondon")
.setValue(dbManager.getDynamicPropertiesStore().getAllowTvmLondon())
.build());

builder.addChainParameter(
Protocol.ChainParameters.ChainParameter.newBuilder().setKey("getAllowTvmCompatibleEvm")
.setValue(dbManager.getDynamicPropertiesStore().getAllowTvmCompatibleEvm()).build());
builder.addChainParameter(Protocol.ChainParameters.ChainParameter.newBuilder()
.setKey("getAllowTvmCompatibleEvm")
.setValue(dbManager.getDynamicPropertiesStore().getAllowTvmCompatibleEvm())
.build());

builder.addChainParameter(Protocol.ChainParameters.ChainParameter.newBuilder()
.setKey("getAllowAccountAssetOptimization")
Expand Down
1 change: 1 addition & 0 deletions protocol/src/main/protos/core/Tron.proto
Original file line number Diff line number Diff line change
Expand Up @@ -405,6 +405,7 @@ message Transaction {
JVM_STACK_OVER_FLOW = 12;
UNKNOWN = 13;
TRANSFER_FAILED = 14;
INVALID_CODE = 15;
}
int64 fee = 1;
code ret = 2;
Expand Down

0 comments on commit 6c72845

Please sign in to comment.