Skip to content

Commit 145aa45

Browse files
committed
Tron EVM 1.0
1 parent 3e903e9 commit 145aa45

File tree

11 files changed

+234
-107
lines changed

11 files changed

+234
-107
lines changed

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

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
import org.tron.core.capsule.*;
1818
import org.tron.core.db.Manager;
1919
import org.tron.protos.Contract;
20-
import org.tron.protos.Contract.ContractCreationContract;
20+
import org.tron.protos.Contract.ContractDeployContract;
2121
import org.tron.protos.Protocol;
2222
import org.tron.protos.Protocol.Block;
2323
import org.tron.protos.Protocol.Transaction;
@@ -66,10 +66,10 @@ public Runtime(Transaction tx, Block block, Manager dbManager,
6666

6767
Transaction.Contract.ContractType contractType = tx.getRawData().getContract(0).getType();
6868
switch (contractType.getNumber()) {
69-
case Transaction.Contract.ContractType.ContractCallContract_VALUE:
69+
case Transaction.Contract.ContractType.TriggerContract_VALUE:
7070
trxType = TRX_CONTRACT_CALL_TYPE;
7171
break;
72-
case Transaction.Contract.ContractType.ContractCreationContract_VALUE:
72+
case Transaction.Contract.ContractType.DeployContract_VALUE:
7373
trxType = TRX_CONTRACT_CREATION_TYPE;
7474
break;
7575
default:
@@ -92,10 +92,10 @@ public Runtime(Transaction tx, Manager dbManager, ProgramInvokeFactory programIn
9292
this.executerType = ET_PRE_TYPE;
9393
Transaction.Contract.ContractType contractType = tx.getRawData().getContract(0).getType();
9494
switch (contractType.getNumber()) {
95-
case Transaction.Contract.ContractType.ContractCallContract_VALUE:
95+
case Transaction.Contract.ContractType.TriggerContract_VALUE:
9696
trxType = TRX_CONTRACT_CALL_TYPE;
9797
break;
98-
case Transaction.Contract.ContractType.ContractCreationContract_VALUE:
98+
case Transaction.Contract.ContractType.DeployContract_VALUE:
9999
trxType = TRX_CONTRACT_CREATION_TYPE;
100100
break;
101101
default:
@@ -159,7 +159,7 @@ public void execute() {
159159
}
160160

161161
private void call() {
162-
Contract.ContractCallContract contract = ContractCapsule.getCallContractFromTransaction(trx);
162+
Contract.ContractTriggerContract contract = ContractCapsule.getTriggerContractFromTransaction(trx);
163163
if (contract == null) return;
164164

165165
byte[] contractAddress = contract.getContractAddress().toByteArray();
@@ -178,11 +178,11 @@ private void call() {
178178
/*
179179
**/
180180
private void create() {
181-
ContractCreationContract contract = ContractCapsule.getCreationContractFromTransaction(trx);
181+
ContractDeployContract contract = ContractCapsule.getDeployContractFromTransaction(trx);
182182

183183
// Create a Contract Account by ownerAddress or If the address exist, random generate one
184184
byte[] code = contract.getBytecode().toByteArray();
185-
ContractCreationContract.ABI abi = contract.getAbi();
185+
ContractDeployContract.ABI abi = contract.getAbi();
186186
byte[] ownerAddress = contract.getOwnerAddress().toByteArray();
187187
ByteString newContractAddress = contract.getContractAddress();
188188

src/main/java/org/tron/common/runtime/vm/program/invoke/ProgramInvokeFactoryImpl.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,8 @@
2727
import org.tron.core.capsule.AccountCapsule;
2828
import org.tron.core.capsule.ContractCapsule;
2929
import org.tron.core.db.Manager;
30-
import org.tron.protos.Contract;
30+
import org.tron.protos.Contract.ContractDeployContract;
31+
import org.tron.protos.Contract.ContractTriggerContract;
3132
import org.tron.protos.Protocol.Block;
3233
import org.tron.protos.Protocol.Transaction;
3334

@@ -57,7 +58,7 @@ public ProgramInvoke createProgramInvoke(InternalTransaction.TrxType trxType, In
5758
long number = -1L;
5859

5960
if (trxType == TRX_CONTRACT_CREATION_TYPE) {
60-
Contract.ContractCreationContract contract = ContractCapsule.getCreationContractFromTransaction(tx);
61+
ContractDeployContract contract = ContractCapsule.getDeployContractFromTransaction(tx);
6162
contractAddress = contract.getContractAddress().toByteArray();
6263
ownerAddress = contract.getOwnerAddress().toByteArray();
6364
AccountCapsule accountCapsule = manager.getAccountStore().get(ownerAddress);
@@ -82,7 +83,7 @@ public ProgramInvoke createProgramInvoke(InternalTransaction.TrxType trxType, In
8283
lastHash, coinbase, timestamp, number, manager);
8384

8485
} else if (trxType == TRX_CONTRACT_CALL_TYPE) {
85-
Contract.ContractCallContract contract = ContractCapsule.getCallContractFromTransaction(tx);
86+
ContractTriggerContract contract = ContractCapsule.getTriggerContractFromTransaction(tx);
8687
/*** ADDRESS op ***/
8788
// YP: Get address of currently executing account.
8889
// byte[] address = tx.isContractCreation() ? tx.getContractAddress() : tx.getReceiveAddress();

src/main/java/org/tron/core/Wallet.java

Lines changed: 121 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,14 @@
1818

1919
package org.tron.core;
2020

21+
import com.google.protobuf.Any;
2122
import com.google.protobuf.ByteString;
23+
24+
import java.util.Arrays;
2225
import java.util.List;
2326
import java.util.Objects;
27+
28+
import com.google.protobuf.InvalidProtocolBufferException;
2429
import lombok.Getter;
2530
import lombok.extern.slf4j.Slf4j;
2631
import org.apache.commons.lang3.ArrayUtils;
@@ -38,15 +43,13 @@
3843
import org.tron.common.crypto.ECKey;
3944
import org.tron.common.crypto.Hash;
4045
import org.tron.common.overlay.message.Message;
46+
import org.tron.common.runtime.vm.program.ProgramResult;
4147
import org.tron.common.utils.Base58;
4248
import org.tron.common.utils.ByteArray;
4349
import org.tron.common.utils.Utils;
44-
import org.tron.core.capsule.AccountCapsule;
45-
import org.tron.core.capsule.AssetIssueCapsule;
46-
import org.tron.core.capsule.BlockCapsule;
47-
import org.tron.core.capsule.TransactionCapsule;
48-
import org.tron.core.capsule.WitnessCapsule;
50+
import org.tron.core.capsule.*;
4951
import org.tron.core.db.AccountStore;
52+
import org.tron.core.db.ContractStore;
5053
import org.tron.core.db.Manager;
5154
import org.tron.core.db.PendingManager;
5255
import org.tron.core.exception.ContractExeException;
@@ -60,6 +63,8 @@
6063
import org.tron.core.exception.ValidateSignatureException;
6164
import org.tron.core.net.message.TransactionMessage;
6265
import org.tron.core.net.node.NodeImpl;
66+
import org.tron.protos.Contract.ContractDeployContract;
67+
import org.tron.protos.Contract.ContractTriggerContract;
6368
import org.tron.protos.Contract.AssetIssueContract;
6469
import org.tron.protos.Contract.TransferContract;
6570
import org.tron.protos.Protocol.Account;
@@ -392,4 +397,115 @@ public Transaction getTransactionById(ByteString transactionId) {
392397
}
393398
return transaction;
394399
}
400+
401+
public Transaction deployContract(ContractDeployContract contractDeployContract) {
402+
return new TransactionCapsule(contractDeployContract, Transaction.Contract.ContractType.DeployContract)
403+
.getInstance();
404+
}
405+
406+
public Transaction triggerContract(ContractTriggerContract contractTriggerContract) {
407+
ContractStore contractStore = dbManager.getContractStore();
408+
byte[] contractAddress = contractTriggerContract.getContractAddress().toByteArray();
409+
ContractDeployContract.ABI abi = contractStore.getABI(contractAddress);
410+
if (abi == null) {
411+
return null;
412+
}
413+
414+
try {
415+
byte[] selector = getSelector(contractTriggerContract.getData().toByteArray());
416+
if (selector == null) {
417+
return null;
418+
}
419+
420+
Transaction trx = null;
421+
if (!isConstant(abi, selector)) {
422+
trx = new TransactionCapsule(contractTriggerContract, Transaction.Contract.ContractType.TriggerContract)
423+
.getInstance();
424+
} else {
425+
TransactionCapsule trxCap = new TransactionCapsule(contractTriggerContract, Transaction.Contract.ContractType.TriggerContract);
426+
/*ProgramResult programResult = DepositController.getInstance().processConstantTransaction(trxCap);
427+
Transaction.Result.Builder builder = Transaction.Result.newBuilder();
428+
builder.setConstantResult(ByteString.copyFrom(programResult.getHReturn()));
429+
trx = trxCap.getInstance();
430+
trx = trx.toBuilder().addRet(builder.build()).build();*/
431+
}
432+
433+
return trx;
434+
} catch (Exception e) {
435+
logger.error(e.getMessage());
436+
return null;
437+
}
438+
}
439+
440+
public ContractDeployContract getContract(GrpcAPI.BytesMessage bytesMessage) {
441+
byte[] address = bytesMessage.getValue().toByteArray();
442+
AccountCapsule accountCapsule = dbManager.getAccountStore().get(address);
443+
if (accountCapsule == null || ArrayUtils.isEmpty(accountCapsule.getCodeHash())) {
444+
logger.error("Get contract failed, the account is not exist or the account does not have code hash!");
445+
return null;
446+
}
447+
448+
ContractCapsule contractCapsule = dbManager.getContractStore().get(bytesMessage.getValue().toByteArray());
449+
Transaction trx = contractCapsule.getInstance();
450+
Any contract = trx.getRawData().getContract(0).getParameter();
451+
if (contract.is(ContractDeployContract.class)) {
452+
try {
453+
return contract.unpack(ContractDeployContract.class);
454+
} catch (InvalidProtocolBufferException e) {
455+
return null;
456+
}
457+
}
458+
return null;
459+
}
460+
461+
private byte[] getSelector(byte[] data) {
462+
if (data == null ||
463+
data.length < 4) {
464+
return null;
465+
}
466+
467+
byte[] ret = new byte[4];
468+
System.arraycopy(data, 0, ret, 0, 4);
469+
return ret;
470+
}
471+
472+
private boolean isConstant(ContractDeployContract.ABI abi, byte[] selector) throws Exception{
473+
if (selector == null || selector.length != 4) {
474+
throw new Exception("Selector's length or selector itself is invalid");
475+
}
476+
477+
for (int i = 0; i < abi.getEntrysCount(); i++) {
478+
ContractDeployContract.ABI.Entry entry = abi.getEntrys(i);
479+
if (entry.getType() != ContractDeployContract.ABI.Entry.EntryType.Function) {
480+
continue;
481+
}
482+
483+
int inputCount = entry.getInputsCount();
484+
StringBuffer sb = new StringBuffer();
485+
sb.append(entry.getName().toStringUtf8());
486+
sb.append("(");
487+
for (int k = 0; k < inputCount; k++) {
488+
ContractDeployContract.ABI.Entry.Param param = entry.getInputs(k);
489+
sb.append(param.getType().toStringUtf8());
490+
if (k + 1 < inputCount) {
491+
sb.append(",");
492+
}
493+
}
494+
sb.append(")");
495+
496+
byte[] funcSelector = new byte[4];
497+
System.arraycopy(Hash.sha3(sb.toString().getBytes()), 0, funcSelector, 0, 4);
498+
if (Arrays.equals(funcSelector, selector)) {
499+
if (entry.getConstant() == true) {
500+
return true;
501+
} else {
502+
return false;
503+
}
504+
}
505+
}
506+
507+
throw new Exception("There is no the selector!");
508+
}
509+
510+
395511
}

src/main/java/org/tron/core/capsule/CodeCapsule.java

Lines changed: 3 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,9 @@
2121
import lombok.extern.slf4j.Slf4j;
2222
import org.tron.common.crypto.ECKey.ECDSASignature;
2323
import org.tron.common.utils.Sha256Hash;
24-
import org.tron.protos.Contract.ContractCallContract;
25-
import org.tron.protos.Contract.ContractCreationContract;
24+
import org.tron.protos.Contract;
25+
import org.tron.protos.Contract.ContractDeployContract;
26+
import org.tron.protos.Contract.ContractTriggerContract;
2627
import org.tron.protos.Protocol.Transaction;
2728

2829
/**
@@ -42,26 +43,6 @@ public CodeCapsule(ByteString bs) {
4243
this.code = bs.toByteArray();
4344
}
4445

45-
public static ContractCreationContract getCreationContractFromTransaction(Transaction trx) {
46-
try {
47-
Any any = trx.getRawData().getContract(0).getParameter();
48-
ContractCreationContract contractCreationContract = any.unpack(ContractCreationContract.class);
49-
return contractCreationContract;
50-
} catch (InvalidProtocolBufferException e) {
51-
return null;
52-
}
53-
}
54-
55-
public static ContractCallContract getCallContractFromTransaction(Transaction trx) {
56-
try {
57-
Any any = trx.getRawData().getContract(0).getParameter();
58-
ContractCallContract contractCallContract = any.unpack(ContractCallContract.class);
59-
return contractCallContract;
60-
} catch (InvalidProtocolBufferException e) {
61-
return null;
62-
}
63-
}
64-
6546
public Sha256Hash getHash() {
6647
return Sha256Hash.of(this.code);
6748
}

src/main/java/org/tron/core/capsule/ContractCapsule.java

Lines changed: 10 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -22,15 +22,10 @@
2222
import org.tron.common.crypto.ECKey;
2323
import org.tron.common.crypto.ECKey.ECDSASignature;
2424
import org.tron.common.utils.Sha256Hash;
25-
import org.tron.core.Wallet;
26-
import org.tron.protos.Contract.ContractCallContract;
27-
import org.tron.protos.Contract.ContractCreationContract;
25+
import org.tron.protos.Contract.ContractDeployContract;
26+
import org.tron.protos.Contract.ContractTriggerContract;
2827
import org.tron.protos.Protocol.Transaction;
2928

30-
/**
31-
*
32-
* Created by Guo Yonggang on 04.14.2018
33-
*/
3429
@Slf4j
3530
public class ContractCapsule implements ProtoCapsule<Transaction> {
3631

@@ -51,21 +46,21 @@ public ContractCapsule(byte[] data) {
5146
}
5247
}
5348

54-
public static ContractCreationContract getCreationContractFromTransaction(Transaction trx) {
49+
public static ContractDeployContract getDeployContractFromTransaction(Transaction trx) {
5550
try {
5651
Any any = trx.getRawData().getContract(0).getParameter();
57-
ContractCreationContract contractCreationContract = any.unpack(ContractCreationContract.class);
58-
return contractCreationContract;
52+
ContractDeployContract contractDeployContract = any.unpack(ContractDeployContract.class);
53+
return contractDeployContract;
5954
} catch (InvalidProtocolBufferException e) {
6055
return null;
6156
}
6257
}
6358

64-
public static ContractCallContract getCallContractFromTransaction(Transaction trx) {
59+
public static ContractTriggerContract getTriggerContractFromTransaction(Transaction trx) {
6560
try {
6661
Any any = trx.getRawData().getContract(0).getParameter();
67-
ContractCallContract contractCallContract = any.unpack(ContractCallContract.class);
68-
return contractCallContract;
62+
ContractTriggerContract contractTriggerContract = any.unpack(ContractTriggerContract.class);
63+
return contractTriggerContract;
6964
} catch (InvalidProtocolBufferException e) {
7065
return null;
7166
}
@@ -83,8 +78,8 @@ public Sha256Hash getRawHash() {
8378
public Sha256Hash getCodeHash() {
8479
try {
8580
Any any = transaction.getRawData().getContract(0).getParameter();
86-
ContractCreationContract contractCreationContract = any.unpack(ContractCreationContract.class);
87-
byte[] bytecode = contractCreationContract.getBytecode().toByteArray();
81+
ContractDeployContract contractDeployContract = any.unpack(ContractDeployContract.class);
82+
byte[] bytecode = contractDeployContract.getBytecode().toByteArray();
8883
return Sha256Hash.of(bytecode);
8984
} catch (InvalidProtocolBufferException e) {
9085
return null;

src/main/java/org/tron/core/capsule/TransactionCapsule.java

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616
package org.tron.core.capsule;
1717

1818
import static org.tron.protos.Contract.AssetIssueContract;
19-
import static org.tron.protos.Contract.DeployContract;
2019
import static org.tron.protos.Contract.VoteAssetContract;
2120
import static org.tron.protos.Contract.VoteWitnessContract;
2221
import static org.tron.protos.Contract.WitnessCreateContract;
@@ -38,6 +37,7 @@
3837
import org.tron.core.Wallet;
3938
import org.tron.core.db.AccountStore;
4039
import org.tron.core.exception.ValidateSignatureException;
40+
import org.tron.protos.Contract;
4141
import org.tron.protos.Contract.AccountCreateContract;
4242
import org.tron.protos.Contract.AccountUpdateContract;
4343
import org.tron.protos.Contract.FreezeBalanceContract;
@@ -254,9 +254,6 @@ public static byte[] getOwner(Transaction.Contract contract) {
254254
case AssetIssueContract:
255255
owner = contractParameter.unpack(AssetIssueContract.class).getOwnerAddress();
256256
break;
257-
case DeployContract:
258-
owner = contractParameter.unpack(DeployContract.class).getOwnerAddress();
259-
break;
260257
case WitnessUpdateContract:
261258
owner = contractParameter.unpack(WitnessUpdateContract.class).getOwnerAddress();
262259
break;
@@ -275,6 +272,12 @@ public static byte[] getOwner(Transaction.Contract contract) {
275272
case WithdrawBalanceContract:
276273
owner = contractParameter.unpack(WithdrawBalanceContract.class).getOwnerAddress();
277274
break;
275+
case DeployContract:
276+
owner = contractParameter.unpack(Contract.ContractDeployContract.class).getOwnerAddress();
277+
break;
278+
case TriggerContract:
279+
owner = contractParameter.unpack(Contract.ContractTriggerContract.class).getOwnerAddress();
280+
break;
278281
// todo add other contract
279282
default:
280283
return null;

0 commit comments

Comments
 (0)