Skip to content

Commit 2900d12

Browse files
authored
Merge pull request tronprotocol#2287 from tronprotocol/Hotfix/removeAbiJson
Hotfix/remove abi json
2 parents 7db63b1 + b4ac93f commit 2900d12

File tree

3 files changed

+44
-71
lines changed

3 files changed

+44
-71
lines changed

src/main/java/org/tron/common/logsfilter/capsule/ContractTriggerCapsule.java

Lines changed: 27 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,13 @@
11
package org.tron.common.logsfilter.capsule;
22

3-
import com.alibaba.fastjson.JSON;
4-
import com.alibaba.fastjson.JSONArray;
5-
import com.alibaba.fastjson.JSONObject;
63
import java.util.List;
74
import lombok.Getter;
85
import lombok.Setter;
96
import org.apache.commons.lang3.ArrayUtils;
107
import org.pf4j.util.StringUtils;
118
import org.spongycastle.util.encoders.Hex;
129
import org.tron.common.crypto.Hash;
13-
import org.tron.common.logsfilter.ContractEventParserJson;
10+
import org.tron.common.logsfilter.ContractEventParserAbi;
1411
import org.tron.common.logsfilter.EventPluginLoader;
1512
import org.tron.common.logsfilter.FilterQuery;
1613
import org.tron.common.logsfilter.trigger.ContractEventTrigger;
@@ -19,6 +16,7 @@
1916
import org.tron.common.runtime.vm.DataWord;
2017
import org.tron.common.runtime.vm.LogInfo;
2118
import org.tron.core.config.args.Args;
19+
import org.tron.protos.Protocol.SmartContract.ABI;
2220

2321
public class ContractTriggerCapsule extends TriggerCapsule {
2422

@@ -39,58 +37,39 @@ public void processTrigger() {
3937
ContractTrigger event;
4038
boolean isEvent = false;
4139
LogInfo logInfo = contractTrigger.getLogInfo();
42-
JSONObject abi = null;
43-
JSONArray entrys = null;
44-
String abiString = contractTrigger.getAbiString();
45-
46-
Object abiObj = JSON.parse(abiString);
47-
if (abiObj instanceof JSONObject) {
48-
abi = (JSONObject) abiObj;
49-
entrys = abi.getJSONArray("entrys");
50-
}
51-
40+
ABI abi = contractTrigger.getAbi();
5241
List<DataWord> topics = logInfo.getTopics();
5342

5443
String eventSignature = "";
5544
String eventSignatureFull = "fallback()";
5645
String entryName = "";
57-
JSONObject entryObj = new JSONObject();
46+
ABI.Entry eventEntry = null;
5847

59-
if (entrys != null && topics != null && !topics.isEmpty() && !ArrayUtils
60-
.isEmpty(topics.get(0).getData()) && Args.getInstance().getStorage()
48+
if (abi != null && abi.getEntrysCount() > 0 && topics != null && !topics.isEmpty()
49+
&& !ArrayUtils.isEmpty(topics.get(0).getData()) && Args.getInstance().getStorage()
6150
.isContractParseSwitch()) {
6251
String logHash = topics.get(0).toString();
63-
for (int i = 0; i < entrys.size(); i++) {
64-
JSONObject entry = entrys.getJSONObject(i);
65-
66-
String funcType = entry.getString("type");
67-
Boolean anonymous = entry.getBoolean("anonymous");
68-
if (funcType == null || !"event".equalsIgnoreCase(funcType)) {
69-
continue;
70-
}
7152

72-
if (anonymous != null && anonymous) {
53+
for (ABI.Entry entry : abi.getEntrysList()) {
54+
if (entry.getType() != ABI.Entry.EntryType.Event || entry.getAnonymous()) {
7355
continue;
7456
}
7557

76-
String signature = entry.getString("name") + "(";
77-
String signatureFull = entry.getString("name") + "(";
58+
String signature = entry.getName() + "(";
59+
String signatureFull = entry.getName() + "(";
7860
StringBuilder signBuilder = new StringBuilder();
7961
StringBuilder signFullBuilder = new StringBuilder();
80-
JSONArray inputs = entry.getJSONArray("inputs");
81-
if (inputs != null) {
82-
for (int j = 0; j < inputs.size(); j++) {
83-
if (signBuilder.length() > 0) {
84-
signBuilder.append(",");
85-
signFullBuilder.append(",");
86-
}
87-
String type = inputs.getJSONObject(j).getString("type");
88-
String name = inputs.getJSONObject(j).getString("name");
89-
signBuilder.append(type);
90-
signFullBuilder.append(type);
91-
if (StringUtils.isNotNullOrEmpty(name)) {
92-
signFullBuilder.append(" ").append(name);
93-
}
62+
for (ABI.Entry.Param param : entry.getInputsList()) {
63+
if (signBuilder.length() > 0) {
64+
signBuilder.append(",");
65+
signFullBuilder.append(",");
66+
}
67+
String type = param.getType();
68+
String name = param.getName();
69+
signBuilder.append(type);
70+
signFullBuilder.append(type);
71+
if (StringUtils.isNotNullOrEmpty(name)) {
72+
signFullBuilder.append(" ").append(name);
9473
}
9574
}
9675
signature += signBuilder.toString() + ")";
@@ -99,8 +78,8 @@ public void processTrigger() {
9978
if (sha3.equals(logHash)) {
10079
eventSignature = signature;
10180
eventSignatureFull = signatureFull;
102-
entryName = entry.getString("name");
103-
entryObj = entry;
81+
entryName = entry.getName();
82+
eventEntry = entry;
10483
isEvent = true;
10584
break;
10685
}
@@ -120,9 +99,9 @@ public void processTrigger() {
12099
byte[] data = logInfo.getClonedData();
121100

122101
((ContractEventTrigger) event)
123-
.setTopicMap(ContractEventParserJson.parseTopics(topicList, entryObj));
102+
.setTopicMap(ContractEventParserAbi.parseTopics(topicList, eventEntry));
124103
((ContractEventTrigger) event)
125-
.setDataMap(ContractEventParserJson.parseEventData(data, topicList, entryObj));
104+
.setDataMap(ContractEventParserAbi.parseEventData(data, topicList, eventEntry));
126105
} else {
127106
if (!EventPluginLoader.getInstance().isContractLogTriggerEnable()) {
128107
return;
@@ -135,8 +114,9 @@ public void processTrigger() {
135114
RawData rawData = new RawData(logInfo.getAddress(), logInfo.getTopics(), logInfo.getData());
136115

137116
event.setRawData(rawData);
138-
event.setAbiString(contractTrigger.getAbiString());
139117

118+
event.setLatestSolidifiedBlockNumber(contractTrigger.getLatestSolidifiedBlockNumber());
119+
event.setRemoved(contractTrigger.isRemoved());
140120
event.setUniqueId(contractTrigger.getUniqueId());
141121
event.setTransactionId(contractTrigger.getTransactionId());
142122
event.setContractAddress(contractTrigger.getContractAddress());

src/main/java/org/tron/common/logsfilter/trigger/ContractTrigger.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import lombok.Setter;
55
import org.tron.common.logsfilter.capsule.RawData;
66
import org.tron.common.runtime.vm.LogInfo;
7+
import org.tron.protos.Protocol.SmartContract.ABI;
78

89
public class ContractTrigger extends Trigger {
910

@@ -75,6 +76,10 @@ public class ContractTrigger extends Trigger {
7576
@Setter
7677
private RawData rawData;
7778

79+
@Getter
80+
@Setter
81+
private ABI abi;
82+
7883
@Getter
7984
@Setter
8085
private String abiString;

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

Lines changed: 12 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
package org.tron.common.runtime.vm;
22

3-
import com.google.protobuf.InvalidProtocolBufferException;
4-
import com.google.protobuf.util.JsonFormat;
53
import java.util.HashMap;
64
import java.util.LinkedList;
75
import java.util.List;
@@ -44,50 +42,40 @@ public List<ContractTrigger> parseLogInfos(List<LogInfo> logInfos, Deposit depos
4442
return list;
4543
}
4644

47-
Map<String, String> signMap = new HashMap<>();
48-
Map<String, String> abiMap = new HashMap<>();
45+
Map<String, String> addrMap = new HashMap<>();
46+
Map<String, ABI> abiMap = new HashMap<>();
4947

5048
for (LogInfo logInfo : logInfos) {
5149

5250
byte[] contractAddress = MUtil.convertToTronAddress(logInfo.getAddress());
5351
String strContractAddr =
5452
ArrayUtils.isEmpty(contractAddress) ? "" : Wallet.encode58Check(contractAddress);
55-
if (signMap.get(strContractAddr) != null) {
53+
if (addrMap.get(strContractAddr) != null) {
5654
continue;
5755
}
5856
ContractCapsule contract = deposit.getContract(contractAddress);
5957
if (contract == null) {
60-
signMap.put(strContractAddr, originAddress); // mark as found.
61-
abiMap.put(strContractAddr, "");
58+
// never
59+
addrMap.put(strContractAddr, originAddress);
60+
abiMap.put(strContractAddr, ABI.getDefaultInstance());
6261
continue;
6362
}
6463
ABI abi = contract.getInstance().getAbi();
6564
String creatorAddr = Wallet.encode58Check(
6665
MUtil.convertToTronAddress(contract.getInstance().getOriginAddress().toByteArray()));
67-
signMap.put(strContractAddr, creatorAddr); // mark as found.
68-
69-
if (abi != null && abi.getEntrysCount() > 0) {
70-
try {
71-
abiMap
72-
.put(strContractAddr, JsonFormat.printer().includingDefaultValueFields().print(abi));
73-
} catch (InvalidProtocolBufferException e) {
74-
abiMap.put(strContractAddr, "");
75-
logger.info("abi to json empty:" + txId, e);
76-
}
77-
} else {
78-
abiMap.put(strContractAddr, "");
79-
}
66+
addrMap.put(strContractAddr, creatorAddr);
67+
abiMap.put(strContractAddr, abi);
8068
}
8169

8270
int index = 1;
8371
for (LogInfo logInfo : logInfos) {
72+
8473
byte[] contractAddress = MUtil.convertToTronAddress(logInfo.getAddress());
8574
String strContractAddr =
8675
ArrayUtils.isEmpty(contractAddress) ? "" : Wallet.encode58Check(contractAddress);
87-
88-
String abiString = abiMap.get(strContractAddr);
76+
ABI abi = abiMap.get(strContractAddr);
8977
ContractTrigger event = new ContractTrigger();
90-
String creatorAddr = signMap.get(strContractAddr);
78+
String creatorAddr = addrMap.get(strContractAddr);
9179
event.setUniqueId(txId + "_" + index);
9280
event.setTransactionId(txId);
9381
event.setContractAddress(strContractAddr);
@@ -97,7 +85,7 @@ public List<ContractTrigger> parseLogInfos(List<LogInfo> logInfos, Deposit depos
9785
event.setBlockNumber(blockNum);
9886
event.setTimeStamp(blockTimestamp);
9987
event.setLogInfo(logInfo);
100-
event.setAbiString(abiString);
88+
event.setAbi(abi);
10189

10290
list.add(event);
10391
index++;

0 commit comments

Comments
 (0)