Skip to content

Commit 0a6b89b

Browse files
authored
Merge pull request #1452 from tronprotocol/develop
update master
2 parents 4234850 + da9a8ac commit 0a6b89b

23 files changed

+209
-186
lines changed

src/main/java/org/tron/common/runtime/Runtime.java

Lines changed: 45 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
import org.apache.commons.lang3.StringUtils;
2626
import org.joda.time.DateTime;
2727
import org.spongycastle.util.encoders.Hex;
28-
import org.tron.common.runtime.config.SystemProperties;
28+
import org.tron.common.runtime.config.VMConfig;
2929
import org.tron.common.runtime.vm.DataWord;
3030
import org.tron.common.runtime.vm.EnergyCost;
3131
import org.tron.common.runtime.vm.PrecompiledContracts;
@@ -34,6 +34,7 @@
3434
import org.tron.common.runtime.vm.program.InternalTransaction.ExecutorType;
3535
import org.tron.common.runtime.vm.program.Program;
3636
import org.tron.common.runtime.vm.program.Program.JVMStackOverFlowException;
37+
import org.tron.common.runtime.vm.program.Program.OutOfResourceException;
3738
import org.tron.common.runtime.vm.program.ProgramPrecompile;
3839
import org.tron.common.runtime.vm.program.ProgramResult;
3940
import org.tron.common.runtime.vm.program.invoke.ProgramInvoke;
@@ -70,7 +71,7 @@
7071
public class Runtime {
7172

7273

73-
private SystemProperties config = SystemProperties.getInstance();
74+
private VMConfig config = VMConfig.getInstance();
7475

7576
private Transaction trx;
7677
private BlockCapsule blockCap = null;
@@ -184,18 +185,24 @@ public BigInteger getBlockCPULeftInUs() {
184185
}
185186

186187
public void execute() throws ContractValidateException, ContractExeException {
187-
switch (trxType) {
188-
case TRX_PRECOMPILED_TYPE:
189-
precompiled();
190-
break;
191-
case TRX_CONTRACT_CREATION_TYPE:
192-
create();
193-
break;
194-
case TRX_CONTRACT_CALL_TYPE:
195-
call();
196-
break;
197-
default:
198-
throw new ContractValidateException("Unknown contract type");
188+
try {
189+
switch (trxType) {
190+
case TRX_PRECOMPILED_TYPE:
191+
precompiled();
192+
break;
193+
case TRX_CONTRACT_CREATION_TYPE:
194+
create();
195+
break;
196+
case TRX_CONTRACT_CALL_TYPE:
197+
call();
198+
break;
199+
default:
200+
throw new ContractValidateException("Unknown contract type");
201+
}
202+
} catch (ContractExeException | ContractValidateException e) {
203+
throw e;
204+
} catch (Exception e) {
205+
throw new ContractValidateException("Unknown contract error");
199206
}
200207
}
201208

@@ -303,7 +310,10 @@ private void create()
303310

304311
CreateSmartContract contract = ContractCapsule.getSmartContractFromTransaction(trx);
305312
SmartContract newSmartContract = contract.getNewContract();
306-
313+
if (!contract.getOwnerAddress().equals(newSmartContract.getOriginAddress())) {
314+
logger.error("OwnerAddress not equals OriginAddress");
315+
throw new ContractValidateException("OwnerAddress not equals OriginAddress");
316+
}
307317
byte[] code = newSmartContract.getBytecode().toByteArray();
308318
byte[] contractAddress = Wallet.generateContractAddress(trx);
309319
byte[] ownerAddress = contract.getOwnerAddress().toByteArray();
@@ -348,9 +358,10 @@ private void create()
348358
long vmShouldEndInUs = vmStartInUs + thisTxCPULimitInUs;
349359

350360
long feeLimit = trx.getRawData().getFeeLimit();
351-
if (feeLimit < 0) {
352-
logger.info("feeLimit < 0");
353-
throw new ContractValidateException("feeLimit must be >= 0");
361+
if (feeLimit < 0 || feeLimit > VMConfig.MAX_FEE_LIMIT) {
362+
logger.warn("invalid feeLimit {}", feeLimit);
363+
throw new ContractValidateException(
364+
"feeLimit must be >= 0 and <= " + VMConfig.MAX_FEE_LIMIT);
354365
}
355366

356367
long energyLimit = getEnergyLimit(creator, feeLimit, callValue);
@@ -425,9 +436,10 @@ private void call()
425436
long vmShouldEndInUs = vmStartInUs + thisTxCPULimitInUs;
426437

427438
long feeLimit = trx.getRawData().getFeeLimit();
428-
if (feeLimit < 0) {
429-
logger.info("feeLimit < 0");
430-
throw new ContractValidateException("feeLimit must be >= 0");
439+
if (feeLimit < 0 || feeLimit > VMConfig.MAX_FEE_LIMIT) {
440+
logger.warn("invalid feeLimit {}", feeLimit);
441+
throw new ContractValidateException(
442+
"feeLimit must be >= 0 and <= " + VMConfig.MAX_FEE_LIMIT);
431443
}
432444
long energyLimit;
433445
if (isCallConstant(contractAddress)) {
@@ -489,10 +501,12 @@ public void go() {
489501
long saveCodeEnergy = getLength(code) * EnergyCost.getInstance().getCREATE_DATA();
490502
long afterSpend = program.getEnergyLimitLeft().longValue() - saveCodeEnergy;
491503
if (afterSpend < 0) {
492-
result.setException(
493-
Program.Exception
494-
.notEnoughSpendEnergy("No energy to save just created contract code",
495-
saveCodeEnergy, program.getEnergyLimitLeft().longValue()));
504+
if (null == result.getException()) {
505+
result.setException(
506+
Program.Exception
507+
.notEnoughSpendEnergy("save just created contract code",
508+
saveCodeEnergy, program.getEnergyLimitLeft().longValue()));
509+
}
496510
} else {
497511
result.spendEnergy(saveCodeEnergy);
498512
// have saveCode in create()
@@ -518,6 +532,12 @@ public void go() {
518532
deposit.commit();
519533
}
520534
} catch (JVMStackOverFlowException e) {
535+
program.spendAllEnergy();
536+
result.setException(e);
537+
runtimeError = result.getException().getMessage();
538+
logger.error("runtime error is :{}", result.getException().getMessage());
539+
} catch (OutOfResourceException e) {
540+
program.spendAllEnergy();
521541
result.setException(e);
522542
runtimeError = result.getException().getMessage();
523543
logger.error("runtime error is :{}", result.getException().getMessage());

src/main/java/org/tron/common/runtime/config/DefaultConfig.java

Lines changed: 0 additions & 16 deletions
This file was deleted.

src/main/java/org/tron/common/runtime/config/SystemProperties.java renamed to src/main/java/org/tron/common/runtime/config/VMConfig.java

Lines changed: 9 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -17,36 +17,31 @@
1717
*/
1818
package org.tron.common.runtime.config;
1919

20-
import org.slf4j.Logger;
21-
import org.slf4j.LoggerFactory;
22-
2320
/**
24-
* For developer only
21+
* For developer only
2522
*/
26-
public class SystemProperties {
23+
public class VMConfig {
24+
25+
public static final int MAX_CODE_LENGTH = 1024 * 1024;
2726

28-
private static Logger logger = LoggerFactory.getLogger("general");
27+
public static final int MAX_FEE_LIMIT = 1_000_000_000; //1000 trx
2928

3029
private boolean vmTraceCompressed = false;
31-
private boolean vmOn = true;
3230
private boolean vmTrace = false;
3331

34-
private SystemProperties() {
32+
33+
private VMConfig() {
3534
}
3635

3736
private static class SystemPropertiesInstance {
3837

39-
private static final SystemProperties INSTANCE = new SystemProperties();
38+
private static final VMConfig INSTANCE = new VMConfig();
4039
}
4140

42-
public static SystemProperties getInstance() {
41+
public static VMConfig getInstance() {
4342
return SystemPropertiesInstance.INSTANCE;
4443
}
4544

46-
public boolean vmOn() {
47-
return vmOn;
48-
}
49-
5045
public boolean vmTrace() {
5146
return vmTrace;
5247
}

src/main/java/org/tron/common/runtime/vm/PrecompiledContracts.java

Lines changed: 49 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -88,17 +88,17 @@ public class PrecompiledContracts {
8888
private static final BN128Addition altBN128Add = new BN128Addition();
8989
private static final BN128Multiplication altBN128Mul = new BN128Multiplication();
9090
private static final BN128Pairing altBN128Pairing = new BN128Pairing();
91-
private static final VoteWitnessNative voteContract = new VoteWitnessNative();
92-
// private static final FreezeBalanceNative freezeBalance = new FreezeBalanceNative();
91+
// private static final VoteWitnessNative voteContract = new VoteWitnessNative();
92+
// private static final FreezeBalanceNative freezeBalance = new FreezeBalanceNative();
9393
// private static final UnfreezeBalanceNative unFreezeBalance = new UnfreezeBalanceNative();
94-
private static final WithdrawBalanceNative withdrawBalance = new WithdrawBalanceNative();
95-
private static final ProposalApproveNative proposalApprove = new ProposalApproveNative();
96-
private static final ProposalCreateNative proposalCreate = new ProposalCreateNative();
97-
private static final ProposalDeleteNative proposalDelete = new ProposalDeleteNative();
98-
private static final ConvertFromTronBytesAddressNative convertFromTronBytesAddress = new ConvertFromTronBytesAddressNative();
99-
private static final ConvertFromTronBase58AddressNative convertFromTronBase58Address = new ConvertFromTronBase58AddressNative();
94+
// private static final WithdrawBalanceNative withdrawBalance = new WithdrawBalanceNative();
95+
// private static final ProposalApproveNative proposalApprove = new ProposalApproveNative();
96+
// private static final ProposalCreateNative proposalCreate = new ProposalCreateNative();
97+
// private static final ProposalDeleteNative proposalDelete = new ProposalDeleteNative();
98+
// private static final ConvertFromTronBytesAddressNative convertFromTronBytesAddress = new ConvertFromTronBytesAddressNative();
99+
// private static final ConvertFromTronBase58AddressNative convertFromTronBase58Address = new ConvertFromTronBase58AddressNative();
100100
// private static final TransferAssetNative transferAsset = new TransferAssetNative();
101-
private static final GetTransferAssetNative getTransferAssetAmount = new GetTransferAssetNative();
101+
// private static final GetTransferAssetNative getTransferAssetAmount = new GetTransferAssetNative();
102102

103103
private static final ECKey addressCheckECKey = new ECKey();
104104
private static final String addressCheckECKeyAddress = Wallet
@@ -121,28 +121,28 @@ public class PrecompiledContracts {
121121
"0000000000000000000000000000000000000000000000000000000000000007");
122122
private static final DataWord altBN128PairingAddr = new DataWord(
123123
"0000000000000000000000000000000000000000000000000000000000000008");
124-
private static final DataWord voteContractAddr = new DataWord(
125-
"0000000000000000000000000000000000000000000000000000000000010001");
124+
// private static final DataWord voteContractAddr = new DataWord(
125+
// "0000000000000000000000000000000000000000000000000000000000010001");
126126
// private static final DataWord freezeBalanceAddr = new DataWord(
127127
// "0000000000000000000000000000000000000000000000000000000000010002");
128128
// private static final DataWord unFreezeBalanceAddr = new DataWord(
129129
// "0000000000000000000000000000000000000000000000000000000000010003");
130-
private static final DataWord withdrawBalanceAddr = new DataWord(
131-
"0000000000000000000000000000000000000000000000000000000000010004");
132-
private static final DataWord proposalApproveAddr = new DataWord(
133-
"0000000000000000000000000000000000000000000000000000000000010005");
134-
private static final DataWord proposalCreateAddr = new DataWord(
135-
"0000000000000000000000000000000000000000000000000000000000010006");
136-
private static final DataWord proposalDeleteAddr = new DataWord(
137-
"0000000000000000000000000000000000000000000000000000000000010007");
138-
private static final DataWord convertFromTronBytesAddressAddr = new DataWord(
139-
"0000000000000000000000000000000000000000000000000000000000010008");
140-
private static final DataWord convertFromTronBase58AddressAddr = new DataWord(
141-
"0000000000000000000000000000000000000000000000000000000000010009");
130+
// private static final DataWord withdrawBalanceAddr = new DataWord(
131+
// "0000000000000000000000000000000000000000000000000000000000010004");
132+
// private static final DataWord proposalApproveAddr = new DataWord(
133+
// "0000000000000000000000000000000000000000000000000000000000010005");
134+
// private static final DataWord proposalCreateAddr = new DataWord(
135+
// "0000000000000000000000000000000000000000000000000000000000010006");
136+
// private static final DataWord proposalDeleteAddr = new DataWord(
137+
// "0000000000000000000000000000000000000000000000000000000000010007");
138+
// private static final DataWord convertFromTronBytesAddressAddr = new DataWord(
139+
// "0000000000000000000000000000000000000000000000000000000000010008");
140+
// private static final DataWord convertFromTronBase58AddressAddr = new DataWord(
141+
// "0000000000000000000000000000000000000000000000000000000000010009");
142142
// private static final DataWord transferAssetAddr = new DataWord(
143143
// "000000000000000000000000000000000000000000000000000000000001000a");
144-
private static final DataWord getTransferAssetAmountAddr = new DataWord(
145-
"000000000000000000000000000000000000000000000000000000000001000b");
144+
// private static final DataWord getTransferAssetAmountAddr = new DataWord(
145+
// "000000000000000000000000000000000000000000000000000000000001000b");
146146

147147
public static PrecompiledContract getContractForAddress(DataWord address) {
148148

@@ -161,39 +161,39 @@ public static PrecompiledContract getContractForAddress(DataWord address) {
161161
if (address.equals(identityAddr)) {
162162
return identity;
163163
}
164-
if (address.equals(voteContractAddr)) {
165-
return voteContract;
166-
}
164+
// if (address.equals(voteContractAddr)) {
165+
// return voteContract;
166+
// }
167167
// if (address.equals(freezeBalanceAddr)) {
168168
// return freezeBalance;
169169
// }
170170
// if (address.equals(unFreezeBalanceAddr)) {
171171
// return unFreezeBalance;
172172
// }
173-
if (address.equals(withdrawBalanceAddr)) {
174-
return withdrawBalance;
175-
}
176-
if (address.equals(proposalApproveAddr)) {
177-
return proposalApprove;
178-
}
179-
if (address.equals(proposalCreateAddr)) {
180-
return proposalCreate;
181-
}
182-
if (address.equals(proposalDeleteAddr)) {
183-
return proposalDelete;
184-
}
185-
if (address.equals(convertFromTronBytesAddressAddr)) {
186-
return convertFromTronBytesAddress;
187-
}
188-
if (address.equals(convertFromTronBase58AddressAddr)) {
189-
return convertFromTronBase58Address;
190-
}
173+
// if (address.equals(withdrawBalanceAddr)) {
174+
// return withdrawBalance;
175+
// }
176+
// if (address.equals(proposalApproveAddr)) {
177+
// return proposalApprove;
178+
// }
179+
// if (address.equals(proposalCreateAddr)) {
180+
// return proposalCreate;
181+
// }
182+
// if (address.equals(proposalDeleteAddr)) {
183+
// return proposalDelete;
184+
// }
185+
// if (address.equals(convertFromTronBytesAddressAddr)) {
186+
// return convertFromTronBytesAddress;
187+
// }
188+
// if (address.equals(convertFromTronBase58AddressAddr)) {
189+
// return convertFromTronBase58Address;
190+
// }
191191
// if (address.equals(transferAssetAddr)) {
192192
// return transferAsset;
193193
// }
194-
if (address.equals(getTransferAssetAmountAddr)) {
195-
return getTransferAssetAmount;
196-
}
194+
// if (address.equals(getTransferAssetAmountAddr)) {
195+
// return getTransferAssetAmount;
196+
// }
197197

198198
// Byzantium precompiles
199199
if (address.equals(modExpAddr)) {
@@ -912,10 +912,6 @@ public Pair<Boolean, byte[]> execute(byte[] data) {
912912
return Pair.of(true, new DataWord(0).getData());
913913
}
914914

915-
if (data == null) {
916-
data = EMPTY_BYTE_ARRAY;
917-
}
918-
919915
Contract.WithdrawBalanceContract.Builder builder = Contract.WithdrawBalanceContract
920916
.newBuilder();
921917
ByteString byteAddress = ByteString.copyFrom(getCallerAddress());

src/main/java/org/tron/common/runtime/vm/VM.java

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,11 @@
1414
import org.spongycastle.util.encoders.Hex;
1515
import org.springframework.beans.factory.annotation.Autowired;
1616
import org.springframework.util.StringUtils;
17-
import org.tron.common.runtime.config.SystemProperties;
17+
import org.tron.common.runtime.config.VMConfig;
1818
import org.tron.common.runtime.vm.program.Program;
1919
import org.tron.common.runtime.vm.program.Program.JVMStackOverFlowException;
2020
import org.tron.common.runtime.vm.program.Program.OutOfEnergyException;
21+
import org.tron.common.runtime.vm.program.Program.OutOfResourceException;
2122
import org.tron.common.runtime.vm.program.Stack;
2223

2324
@Slf4j(topic = "VM")
@@ -41,14 +42,14 @@ public class VM {
4142
private boolean vmTrace;
4243
// private long dumpBlock;
4344

44-
private final SystemProperties config;
45+
private final VMConfig config;
4546

4647
public VM() {
47-
config = SystemProperties.getInstance();
48+
config = VMConfig.getInstance();
4849
}
4950

5051
@Autowired
51-
public VM(SystemProperties config) {
52+
public VM(VMConfig config) {
5253
this.config = config;
5354
// vmTrace = config.vmTrace();
5455
// dumpBlock = config.dumpBlock();
@@ -1332,7 +1333,9 @@ public void play(Program program) {
13321333
}
13331334

13341335
} catch (JVMStackOverFlowException e) {
1335-
throw new JVMStackOverFlowException();
1336+
throw e;
1337+
} catch (OutOfResourceException e) {
1338+
throw e;
13361339
} catch (RuntimeException e) {
13371340
if (StringUtils.isEmpty(e.getMessage())) {
13381341
program.setRuntimeFailure(new RuntimeException("Unknown Exception"));

0 commit comments

Comments
 (0)