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
Original file line number Diff line number Diff line change
@@ -1,16 +1,13 @@
package org.tron.common.logsfilter.capsule;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import java.util.List;
import lombok.Getter;
import lombok.Setter;
import org.apache.commons.lang3.ArrayUtils;
import org.pf4j.util.StringUtils;
import org.spongycastle.util.encoders.Hex;
import org.tron.common.crypto.Hash;
import org.tron.common.logsfilter.ContractEventParserJson;
import org.tron.common.logsfilter.ContractEventParserAbi;
import org.tron.common.logsfilter.EventPluginLoader;
import org.tron.common.logsfilter.FilterQuery;
import org.tron.common.logsfilter.trigger.ContractEventTrigger;
Expand All @@ -19,6 +16,7 @@
import org.tron.common.runtime.vm.DataWord;
import org.tron.common.runtime.vm.LogInfo;
import org.tron.core.config.args.Args;
import org.tron.protos.Protocol.SmartContract.ABI;

public class ContractTriggerCapsule extends TriggerCapsule {

Expand All @@ -39,58 +37,39 @@ public void processTrigger() {
ContractTrigger event;
boolean isEvent = false;
LogInfo logInfo = contractTrigger.getLogInfo();
JSONObject abi = null;
JSONArray entrys = null;
String abiString = contractTrigger.getAbiString();

Object abiObj = JSON.parse(abiString);
if (abiObj instanceof JSONObject) {
abi = (JSONObject) abiObj;
entrys = abi.getJSONArray("entrys");
}

ABI abi = contractTrigger.getAbi();
List<DataWord> topics = logInfo.getTopics();

String eventSignature = "";
String eventSignatureFull = "fallback()";
String entryName = "";
JSONObject entryObj = new JSONObject();
ABI.Entry eventEntry = null;

if (entrys != null && topics != null && !topics.isEmpty() && !ArrayUtils
.isEmpty(topics.get(0).getData()) && Args.getInstance().getStorage()
if (abi != null && abi.getEntrysCount() > 0 && topics != null && !topics.isEmpty()
&& !ArrayUtils.isEmpty(topics.get(0).getData()) && Args.getInstance().getStorage()
.isContractParseSwitch()) {
String logHash = topics.get(0).toString();
for (int i = 0; i < entrys.size(); i++) {
JSONObject entry = entrys.getJSONObject(i);

String funcType = entry.getString("type");
Boolean anonymous = entry.getBoolean("anonymous");
if (funcType == null || !"event".equalsIgnoreCase(funcType)) {
continue;
}

if (anonymous != null && anonymous) {
for (ABI.Entry entry : abi.getEntrysList()) {
if (entry.getType() != ABI.Entry.EntryType.Event || entry.getAnonymous()) {
continue;
}

String signature = entry.getString("name") + "(";
String signatureFull = entry.getString("name") + "(";
String signature = entry.getName() + "(";
String signatureFull = entry.getName() + "(";
StringBuilder signBuilder = new StringBuilder();
StringBuilder signFullBuilder = new StringBuilder();
JSONArray inputs = entry.getJSONArray("inputs");
if (inputs != null) {
for (int j = 0; j < inputs.size(); j++) {
if (signBuilder.length() > 0) {
signBuilder.append(",");
signFullBuilder.append(",");
}
String type = inputs.getJSONObject(j).getString("type");
String name = inputs.getJSONObject(j).getString("name");
signBuilder.append(type);
signFullBuilder.append(type);
if (StringUtils.isNotNullOrEmpty(name)) {
signFullBuilder.append(" ").append(name);
}
for (ABI.Entry.Param param : entry.getInputsList()) {
if (signBuilder.length() > 0) {
signBuilder.append(",");
signFullBuilder.append(",");
}
String type = param.getType();
String name = param.getName();
signBuilder.append(type);
signFullBuilder.append(type);
if (StringUtils.isNotNullOrEmpty(name)) {
signFullBuilder.append(" ").append(name);
}
}
signature += signBuilder.toString() + ")";
Expand All @@ -99,8 +78,8 @@ public void processTrigger() {
if (sha3.equals(logHash)) {
eventSignature = signature;
eventSignatureFull = signatureFull;
entryName = entry.getString("name");
entryObj = entry;
entryName = entry.getName();
eventEntry = entry;
isEvent = true;
break;
}
Expand All @@ -120,9 +99,9 @@ public void processTrigger() {
byte[] data = logInfo.getClonedData();

((ContractEventTrigger) event)
.setTopicMap(ContractEventParserJson.parseTopics(topicList, entryObj));
.setTopicMap(ContractEventParserAbi.parseTopics(topicList, eventEntry));
((ContractEventTrigger) event)
.setDataMap(ContractEventParserJson.parseEventData(data, topicList, entryObj));
.setDataMap(ContractEventParserAbi.parseEventData(data, topicList, eventEntry));
} else {
if (!EventPluginLoader.getInstance().isContractLogTriggerEnable()) {
return;
Expand All @@ -135,8 +114,9 @@ public void processTrigger() {
RawData rawData = new RawData(logInfo.getAddress(), logInfo.getTopics(), logInfo.getData());

event.setRawData(rawData);
event.setAbiString(contractTrigger.getAbiString());

event.setLatestSolidifiedBlockNumber(contractTrigger.getLatestSolidifiedBlockNumber());
event.setRemoved(contractTrigger.isRemoved());
event.setUniqueId(contractTrigger.getUniqueId());
event.setTransactionId(contractTrigger.getTransactionId());
event.setContractAddress(contractTrigger.getContractAddress());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import lombok.Setter;
import org.tron.common.logsfilter.capsule.RawData;
import org.tron.common.runtime.vm.LogInfo;
import org.tron.protos.Protocol.SmartContract.ABI;

public class ContractTrigger extends Trigger {

Expand Down Expand Up @@ -75,6 +76,10 @@ public class ContractTrigger extends Trigger {
@Setter
private RawData rawData;

@Getter
@Setter
private ABI abi;

@Getter
@Setter
private String abiString;
Expand Down
36 changes: 12 additions & 24 deletions src/main/java/org/tron/common/runtime/vm/LogInfoTriggerParser.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
package org.tron.common.runtime.vm;

import com.google.protobuf.InvalidProtocolBufferException;
import com.google.protobuf.util.JsonFormat;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
Expand Down Expand Up @@ -44,50 +42,40 @@ public List<ContractTrigger> parseLogInfos(List<LogInfo> logInfos, Deposit depos
return list;
}

Map<String, String> signMap = new HashMap<>();
Map<String, String> abiMap = new HashMap<>();
Map<String, String> addrMap = new HashMap<>();
Map<String, ABI> abiMap = new HashMap<>();

for (LogInfo logInfo : logInfos) {

byte[] contractAddress = MUtil.convertToTronAddress(logInfo.getAddress());
String strContractAddr =
ArrayUtils.isEmpty(contractAddress) ? "" : Wallet.encode58Check(contractAddress);
if (signMap.get(strContractAddr) != null) {
if (addrMap.get(strContractAddr) != null) {
continue;
}
ContractCapsule contract = deposit.getContract(contractAddress);
if (contract == null) {
signMap.put(strContractAddr, originAddress); // mark as found.
abiMap.put(strContractAddr, "");
// never
addrMap.put(strContractAddr, originAddress);
abiMap.put(strContractAddr, ABI.getDefaultInstance());
continue;
}
ABI abi = contract.getInstance().getAbi();
String creatorAddr = Wallet.encode58Check(
MUtil.convertToTronAddress(contract.getInstance().getOriginAddress().toByteArray()));
signMap.put(strContractAddr, creatorAddr); // mark as found.

if (abi != null && abi.getEntrysCount() > 0) {
try {
abiMap
.put(strContractAddr, JsonFormat.printer().includingDefaultValueFields().print(abi));
} catch (InvalidProtocolBufferException e) {
abiMap.put(strContractAddr, "");
logger.info("abi to json empty:" + txId, e);
}
} else {
abiMap.put(strContractAddr, "");
}
addrMap.put(strContractAddr, creatorAddr);
abiMap.put(strContractAddr, abi);
}

int index = 1;
for (LogInfo logInfo : logInfos) {

byte[] contractAddress = MUtil.convertToTronAddress(logInfo.getAddress());
String strContractAddr =
ArrayUtils.isEmpty(contractAddress) ? "" : Wallet.encode58Check(contractAddress);

String abiString = abiMap.get(strContractAddr);
ABI abi = abiMap.get(strContractAddr);
ContractTrigger event = new ContractTrigger();
String creatorAddr = signMap.get(strContractAddr);
String creatorAddr = addrMap.get(strContractAddr);
event.setUniqueId(txId + "_" + index);
event.setTransactionId(txId);
event.setContractAddress(strContractAddr);
Expand All @@ -97,7 +85,7 @@ public List<ContractTrigger> parseLogInfos(List<LogInfo> logInfos, Deposit depos
event.setBlockNumber(blockNum);
event.setTimeStamp(blockTimestamp);
event.setLogInfo(logInfo);
event.setAbiString(abiString);
event.setAbi(abi);

list.add(event);
index++;
Expand Down