Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 6 additions & 6 deletions src/main/java/org/tron/common/runtime/Runtime.java
Original file line number Diff line number Diff line change
Expand Up @@ -224,7 +224,7 @@ private long getEnergyLimit(AccountCapsule account, long feeLimit, long callValu
if (leftBalanceForEnergyFreeze >= feeLimit) {
energyFromFeeLimit = BigInteger.valueOf(totalEnergyFromFreeze)
.multiply(BigInteger.valueOf(feeLimit))
.divide(BigInteger.valueOf(totalBalanceForEnergyFreeze)).longValue();
.divide(BigInteger.valueOf(totalBalanceForEnergyFreeze)).longValueExact();
} else {
energyFromFeeLimit = Math
.addExact(leftEnergyFromFreeze,
Expand Down Expand Up @@ -326,7 +326,7 @@ private void create()
AccountCapsule creator = this.deposit
.getAccount(newSmartContract.getOriginAddress().toByteArray());
// if (executorType == ET_NORMAL_TYPE) {
// long blockENERGYLeftInUs = getBlockENERGYLeftInUs().longValue();
// long blockENERGYLeftInUs = getBlockENERGYLeftInUs().longValueExact();
// thisTxENERGYLimitInUs = min(blockENERGYLeftInUs,
// Constant.ENERGY_LIMIT_IN_ONE_TX_OF_SMART_CONTRACT);
// } else {
Expand All @@ -337,6 +337,7 @@ private void create()
.getMaxCpuTimeOfOneTX() * 1000;

long thisTxCPULimitInUs = (long) (MAX_CPU_TIME_OF_ONE_TX * getThisTxCPULimitInUsRatio());

long vmStartInUs = System.nanoTime() / 1000;
long vmShouldEndInUs = vmStartInUs + thisTxCPULimitInUs;

Expand Down Expand Up @@ -413,12 +414,11 @@ private void call()

long feeLimit = trx.getRawData().getFeeLimit();
long energyLimit;

if (isCallConstant(contractAddress)) {
energyLimit = Constant.MAX_ENERGY_IN_TX;
}
else
} else {
energyLimit = getEnergyLimit(creator, caller, contract, feeLimit, callValue);
}

ProgramInvoke programInvoke = programInvokeFactory
.createProgramInvoke(TRX_CONTRACT_CALL_TYPE, executorType, trx,
Expand Down Expand Up @@ -498,7 +498,7 @@ private long getEnergyFee(long callerEnergyUsage, long callerEnergyFrozen,
return 0;
}
return BigInteger.valueOf(callerEnergyFrozen).multiply(BigInteger.valueOf(callerEnergyUsage))
.divide(BigInteger.valueOf(callerEnergyTotal)).longValue();
.divide(BigInteger.valueOf(callerEnergyTotal)).longValueExact();
}

public boolean isCallConstant() throws ContractValidateException {
Expand Down
76 changes: 39 additions & 37 deletions src/main/java/org/tron/common/runtime/vm/PrecompiledContracts.java
Original file line number Diff line number Diff line change
Expand Up @@ -35,31 +35,25 @@
import java.util.HashMap;
import java.util.List;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.tuple.Pair;
import org.spongycastle.util.encoders.Hex;
import org.tron.common.crypto.ECKey;
import org.tron.common.crypto.Hash;
import org.tron.common.crypto.zksnark.BN128;
import org.tron.common.crypto.zksnark.BN128Fp;
import org.tron.common.crypto.zksnark.BN128G1;
import org.tron.common.crypto.zksnark.BN128G2;
import org.tron.common.crypto.zksnark.Fp;
import org.tron.common.crypto.zksnark.PairingCheck;
import org.tron.common.runtime.vm.program.Program;
import org.tron.common.runtime.vm.program.Program.PrecompiledContractException;
import org.tron.common.runtime.vm.program.ProgramResult;
import org.tron.common.storage.Deposit;
import org.tron.common.utils.BIUtil;
import org.tron.common.utils.ByteArray;
import org.tron.common.utils.ByteUtil;
import org.tron.common.utils.Sha256Hash;
import org.tron.core.Constant;
import org.tron.core.Wallet;
import org.tron.core.actuator.Actuator;
import org.tron.core.actuator.ActuatorFactory;
import org.tron.core.capsule.TransactionCapsule;
import org.tron.core.config.args.Args;
import org.tron.core.exception.ContractExeException;
import org.tron.core.exception.ContractValidateException;
import org.tron.protos.Contract;
Expand Down Expand Up @@ -88,7 +82,7 @@ public class PrecompiledContracts {
private static final BN128Multiplication altBN128Mul = new BN128Multiplication();
private static final BN128Pairing altBN128Pairing = new BN128Pairing();
private static final VoteWitnessNative voteContract = new VoteWitnessNative();
// private static final FreezeBalanceNative freezeBalance = new FreezeBalanceNative();
// private static final FreezeBalanceNative freezeBalance = new FreezeBalanceNative();
// private static final UnfreezeBalanceNative unFreezeBalance = new UnfreezeBalanceNative();
private static final WithdrawBalanceNative withdrawBalance = new WithdrawBalanceNative();
private static final ProposalApproveNative proposalApprove = new ProposalApproveNative();
Expand All @@ -97,10 +91,11 @@ public class PrecompiledContracts {
private static final ConvertFromTronBytesAddressNative convertFromTronBytesAddress = new ConvertFromTronBytesAddressNative();
private static final ConvertFromTronBase58AddressNative convertFromTronBase58Address = new ConvertFromTronBase58AddressNative();
private static final TransferAssetNative transferAsset = new TransferAssetNative();
private static final GetTransferAssetNative getTransferAssetAmount = new GetTransferAssetNative();
private static final GetTransferAssetNative getTransferAssetAmount = new GetTransferAssetNative();

private static final ECKey addressCheckECKey = new ECKey();
private static final String addressCheckECKeyAddress = Wallet.encode58Check(addressCheckECKey.getAddress());
private static final String addressCheckECKeyAddress = Wallet
.encode58Check(addressCheckECKey.getAddress());


private static final DataWord ecRecoverAddr = new DataWord(
Expand All @@ -121,7 +116,7 @@ public class PrecompiledContracts {
"0000000000000000000000000000000000000000000000000000000000000008");
private static final DataWord voteContractAddr = new DataWord(
"0000000000000000000000000000000000000000000000000000000000010001");
// private static final DataWord freezeBalanceAddr = new DataWord(
// private static final DataWord freezeBalanceAddr = new DataWord(
// "0000000000000000000000000000000000000000000000000000000000010002");
// private static final DataWord unFreezeBalanceAddr = new DataWord(
// "0000000000000000000000000000000000000000000000000000000000010003");
Expand Down Expand Up @@ -194,10 +189,18 @@ public static PrecompiledContract getContractForAddress(DataWord address) {
}

// Byzantium precompiles
if (address.equals(modExpAddr)) return modExp;
if (address.equals(altBN128AddAddr)) return altBN128Add;
if (address.equals(altBN128MulAddr)) return altBN128Mul;
if (address.equals(altBN128PairingAddr)) return altBN128Pairing;
if (address.equals(modExpAddr)) {
return modExp;
}
if (address.equals(altBN128AddAddr)) {
return altBN128Add;
}
if (address.equals(altBN128MulAddr)) {
return altBN128Mul;
}
if (address.equals(altBN128PairingAddr)) {
return altBN128Pairing;
}
return null;
}

Expand Down Expand Up @@ -423,7 +426,7 @@ public long getEnergyForData(byte[] data) {
.multiply(BigInteger.valueOf(Math.max(adjExpLen, 1)))
.divide(GQUAD_DIVISOR);

return isLessThan(energy, BigInteger.valueOf(Long.MAX_VALUE)) ? energy.longValue()
return isLessThan(energy, BigInteger.valueOf(Long.MAX_VALUE)) ? energy.longValueExact()
: Long.MAX_VALUE;
}

Expand Down Expand Up @@ -701,7 +704,7 @@ public long getEnergyForData(byte[] data) {
@Override
public Pair<Boolean, byte[]> execute(byte[] data) {

if (isRootCallConstant()){
if (isRootCallConstant()) {
return Pair.of(true, new DataWord(0).getData());
}
if (data == null || data.length != 2 * DataWord.DATAWORD_UNIT_SIZE) {
Expand Down Expand Up @@ -887,7 +890,7 @@ public long getEnergyForData(byte[] data) {
@Override
public Pair<Boolean, byte[]> execute(byte[] data) {

if (isRootCallConstant()){
if (isRootCallConstant()) {
return Pair.of(true, new DataWord(0).getData());
}

Expand Down Expand Up @@ -944,7 +947,7 @@ public long getEnergyForData(byte[] data) {
@Override
public Pair<Boolean, byte[]> execute(byte[] data) {

if (isRootCallConstant()){
if (isRootCallConstant()) {
return Pair.of(true, new DataWord(0).getData());
}

Expand Down Expand Up @@ -1008,11 +1011,12 @@ public long getEnergyForData(byte[] data) {
@Override
public Pair<Boolean, byte[]> execute(byte[] data) {

if (isRootCallConstant()){
if (isRootCallConstant()) {
return Pair.of(true, new DataWord(0).getData());
}

if (data == null || data.length == 0 || (data.length % (2 * DataWord.DATAWORD_UNIT_SIZE) != 0 )) {
if (data == null || data.length == 0 || (data.length % (2 * DataWord.DATAWORD_UNIT_SIZE)
!= 0)) {
return Pair.of(false, new DataWord(0).getData());
}

Expand Down Expand Up @@ -1078,7 +1082,7 @@ public long getEnergyForData(byte[] data) {
@Override
public Pair<Boolean, byte[]> execute(byte[] data) {

if (isRootCallConstant()){
if (isRootCallConstant()) {
return Pair.of(true, new DataWord(0).getData());
}

Expand Down Expand Up @@ -1175,8 +1179,7 @@ public Pair<Boolean, byte[]> execute(byte[] data) {
}

/**
* Native function for transferring Asset to another account. <br/>
* <br/>
* Native function for transferring Asset to another account. <br/> <br/>
*
* Input data[]: <br/> toAddress, amount, assetName <br/>
*
Expand All @@ -1192,11 +1195,12 @@ public long getEnergyForData(byte[] data) {
@Override
public Pair<Boolean, byte[]> execute(byte[] data) {

if (isRootCallConstant()){
if (isRootCallConstant()) {
return Pair.of(true, new DataWord(0).getData());
}

if (data == null || (data.length <= DataWord.DATAWORD_UNIT_SIZE * 2 || data.length > DataWord.DATAWORD_UNIT_SIZE * 3)) {
if (data == null || (data.length <= DataWord.DATAWORD_UNIT_SIZE * 2
|| data.length > DataWord.DATAWORD_UNIT_SIZE * 3)) {
return Pair.of(false, new DataWord(0).getData());
}

Expand All @@ -1206,20 +1210,20 @@ public Pair<Boolean, byte[]> execute(byte[] data) {
System.arraycopy(data, 32 + 16 + 8, amount, 0, 8);
// we already have a restrict for token name length, no more than 32 bytes. don't need to check again
byte[] name = new byte[32];
System.arraycopy(data, 64, name, 0, data.length-64);
int length =name.length;
while(length>0 && name[length -1] ==0){
System.arraycopy(data, 64, name, 0, data.length - 64);
int length = name.length;
while (length > 0 && name[length - 1] == 0) {
length--;
}
name = ByteArray.subArray(name,0,length);
name = ByteArray.subArray(name, 0, length);
Contract.TransferAssetContract.Builder builder = Contract.TransferAssetContract
.newBuilder();
builder.setOwnerAddress(ByteString.copyFrom(getCallerAddress()));
builder.setToAddress(ByteString.copyFrom(convertToTronAddress(new DataWord(toAddress).getLast20Bytes())));
builder.setToAddress(
ByteString.copyFrom(convertToTronAddress(new DataWord(toAddress).getLast20Bytes())));
builder.setAmount(Longs.fromByteArray(amount));
builder.setAssetName(ByteString.copyFrom(name));


TransferAssetContract contract = builder.build();

TransactionCapsule trx = new TransactionCapsule(contract,
Expand All @@ -1246,10 +1250,8 @@ public Pair<Boolean, byte[]> execute(byte[] data) {
}



/**
* Native function for check Asset balance basing on targetAddress and Asset name. <br/>
* <br/>
* Native function for check Asset balance basing on targetAddress and Asset name. <br/> <br/>
*
* Input data[]: <br/> address targetAddress, byte[] assetName <br/>
*
Expand All @@ -1274,11 +1276,11 @@ public Pair<Boolean, byte[]> execute(byte[] data) {
// we already have a restrict for token name length, no more than 32 bytes. don't need to check again
byte[] name = new byte[32];
System.arraycopy(data, 32, name, 0, 32);
int length =name.length;
while(length>0 && name[length -1] ==0){
int length = name.length;
while (length > 0 && name[length - 1] == 0) {
length--;
}
name = ByteArray.subArray(name,0,length);
name = ByteArray.subArray(name, 0, length);

long assetBalance = this.getDeposit().getDbManager().getAccountStore().
get(convertToTronAddress(new DataWord(targetAddress).getLast20Bytes())).
Expand Down
6 changes: 3 additions & 3 deletions src/main/java/org/tron/common/runtime/vm/VM.java
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ private long calcMemEnergy(EnergyCost energyCosts, long oldMemSize, BigInteger n
checkMemorySize(op, newMemSize);

// memory drop consume calc
long memoryUsage = (newMemSize.longValue() + 31) / 32 * 32;
long memoryUsage = (newMemSize.longValueExact() + 31) / 32 * 32;
if (memoryUsage > oldMemSize) {
long memWords = (memoryUsage / 32);
long memWordsOld = (oldMemSize / 32);
Expand Down Expand Up @@ -258,7 +258,7 @@ public void step(Program program) {
throw new OutOfEnergyException(
"Not enough energy for '%s' operation executing: opEnergy[%d], programEnergy[%d]",
op.name(),
dataCost.longValue(), program.getEnergyLimitLeft().longValueSafe());
dataCost.longValueExact(), program.getEnergyLimitLeft().longValueSafe());
}
energyCost = energyCosts.getLOG_ENERGY() +
energyCosts.getLOG_TOPIC_ENERGY() * nTopics +
Expand Down Expand Up @@ -1331,7 +1331,7 @@ public void play(Program program) {
this.step(program);
}

} catch (JVMStackOverFlowException e){
} catch (JVMStackOverFlowException e) {
throw new JVMStackOverFlowException();
} catch (RuntimeException e) {
if (StringUtils.isEmpty(e.getMessage())) {
Expand Down
21 changes: 11 additions & 10 deletions src/main/java/org/tron/common/runtime/vm/program/Program.java
Original file line number Diff line number Diff line change
Expand Up @@ -111,13 +111,13 @@ public static Boolean getRootCallConstant() {
return isRootCallConstant;
}

public static void setRootCallConstant(Boolean rootCallConstant) {
public static void setRootCallConstant(Boolean rootCallConstant) {
isRootCallConstant = rootCallConstant;
}

private static long nonce = 0;
private static byte[] rootTransactionId = null;
private static Boolean isRootCallConstant = null;
private static Boolean isRootCallConstant = null;

private InternalTransaction transaction;

Expand Down Expand Up @@ -445,7 +445,7 @@ public void createContract(DataWord value, DataWord memStart, DataWord memSize)

byte[] senderAddress = convertToTronAddress(this.getOwnerAddress().getLast20Bytes());
// todo: need check the value > 0?
long endowment = value.value().longValue();
long endowment = value.value().longValueExact();
if (getContractState().getBalance(senderAddress) < endowment) {
stackPushZero();
return;
Expand Down Expand Up @@ -508,7 +508,7 @@ public void createContract(DataWord value, DataWord memStart, DataWord memSize)
newBalance = deposit.addBalance(newAddress, endowment);
}

// BlockchainConfig blockchainConfig = config.getBlockchainConfig().getConfigForBlock(getNumber().longValue());
// BlockchainConfig blockchainConfig = config.getBlockchainConfig().getConfigForBlock(getNumber().longValueExact());
// actual energy subtract
DataWord energyLimit = this.getCreateEnergy(getEnergyLimitLeft());
spendEnergy(energyLimit.longValue(), "internal call");
Expand Down Expand Up @@ -637,7 +637,7 @@ public void callToAddress(MessageCall msg) {

// 2.1 PERFORM THE VALUE (endowment) PART
// todo: need to check value >= 0?
long endowment = msg.getEndowment().value().longValue();
long endowment = msg.getEndowment().value().longValueExact();
long senderBalance = deposit.getBalance(senderAddress);
if (senderBalance < endowment) {
stackPushZero();
Expand Down Expand Up @@ -739,7 +739,7 @@ this, new DataWord(contextAddress),
if (result != null) {
BigInteger refundEnergy = msg.getEnergy().value().subtract(toBI(result.getEnergyUsed()));
if (isPositive(refundEnergy)) {
refundEnergy(refundEnergy.longValue(), "remaining energy from the internal call");
refundEnergy(refundEnergy.longValueExact(), "remaining energy from the internal call");
if (logger.isInfoEnabled()) {
logger.info("The remaining energy refunded, account: [{}], energy: [{}] ",
Hex.toHexString(senderAddress),
Expand Down Expand Up @@ -1278,7 +1278,7 @@ public void callToPrecompiledAddress(MessageCall msg,
byte[] contextAddress = msg.getType().callIsStateless() ? senderAddress : codeAddress;

// todo: need check endowment > 0 and not exceed?? because of "senderBalance < endowment"
long endowment = msg.getEndowment().value().longValue();
long endowment = msg.getEndowment().value().longValueExact();
long senderBalance = deposit.getBalance(senderAddress);
if (senderBalance < endowment) {
stackPushZero();
Expand All @@ -1291,9 +1291,10 @@ public void callToPrecompiledAddress(MessageCall msg,

// Charge for endowment - is not reversible by rollback
if (!ArrayUtils.isEmpty(senderAddress) && !ArrayUtils.isEmpty(contextAddress)
&& senderAddress != contextAddress && msg.getEndowment().value().longValue() > 0) {
&& senderAddress != contextAddress && msg.getEndowment().value().longValueExact() > 0) {
try {
transfer(deposit, senderAddress, contextAddress, msg.getEndowment().value().longValue());
transfer(deposit, senderAddress, contextAddress,
msg.getEndowment().value().longValueExact());
} catch (ContractValidateException e) {
throw new BytecodeExecutionException("transfer failure");
}
Expand Down Expand Up @@ -1490,7 +1491,7 @@ public static PrecompiledContractException contractExecuteException(TronExceptio
public static OutOfEnergyException energyOverflow(BigInteger actualEnergy,
BigInteger energyLimit) {
return new OutOfEnergyException("Energy value overflow: actualEnergy[%d], energyLimit[%d];",
actualEnergy.longValue(), energyLimit.longValue());
actualEnergy.longValueExact(), energyLimit.longValueExact());
}

public static IllegalOperationException invalidOpCode(byte... opCode) {
Expand Down
Loading