From 24d6efd95ef479afadf1e0d14ca01e262dd51894 Mon Sep 17 00:00:00 2001 From: llwslc Date: Wed, 5 Jun 2019 14:46:01 +0800 Subject: [PATCH 1/2] remove Json abi --- .../capsule/ContractTriggerCapsule.java | 73 +++++++------------ .../logsfilter/trigger/ContractTrigger.java | 5 ++ .../runtime/vm/LogInfoTriggerParser.java | 36 +++------ 3 files changed, 43 insertions(+), 71 deletions(-) diff --git a/src/main/java/org/tron/common/logsfilter/capsule/ContractTriggerCapsule.java b/src/main/java/org/tron/common/logsfilter/capsule/ContractTriggerCapsule.java index a17d41930be..5793644309b 100644 --- a/src/main/java/org/tron/common/logsfilter/capsule/ContractTriggerCapsule.java +++ b/src/main/java/org/tron/common/logsfilter/capsule/ContractTriggerCapsule.java @@ -1,8 +1,5 @@ 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; @@ -10,7 +7,7 @@ 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; @@ -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 { @@ -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 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() + ")"; @@ -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; } @@ -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; @@ -135,8 +114,8 @@ 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.setUniqueId(contractTrigger.getUniqueId()); event.setTransactionId(contractTrigger.getTransactionId()); event.setContractAddress(contractTrigger.getContractAddress()); diff --git a/src/main/java/org/tron/common/logsfilter/trigger/ContractTrigger.java b/src/main/java/org/tron/common/logsfilter/trigger/ContractTrigger.java index 3780c49e5ef..cc5fad8f50f 100644 --- a/src/main/java/org/tron/common/logsfilter/trigger/ContractTrigger.java +++ b/src/main/java/org/tron/common/logsfilter/trigger/ContractTrigger.java @@ -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 { @@ -75,6 +76,10 @@ public class ContractTrigger extends Trigger { @Setter private RawData rawData; + @Getter + @Setter + private ABI abi; + @Getter @Setter private String abiString; diff --git a/src/main/java/org/tron/common/runtime/vm/LogInfoTriggerParser.java b/src/main/java/org/tron/common/runtime/vm/LogInfoTriggerParser.java index bfbce112e10..e71d2da2fb9 100644 --- a/src/main/java/org/tron/common/runtime/vm/LogInfoTriggerParser.java +++ b/src/main/java/org/tron/common/runtime/vm/LogInfoTriggerParser.java @@ -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; @@ -44,50 +42,40 @@ public List parseLogInfos(List logInfos, Deposit depos return list; } - Map signMap = new HashMap<>(); - Map abiMap = new HashMap<>(); + Map addrMap = new HashMap<>(); + Map 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); @@ -97,7 +85,7 @@ public List parseLogInfos(List logInfos, Deposit depos event.setBlockNumber(blockNum); event.setTimeStamp(blockTimestamp); event.setLogInfo(logInfo); - event.setAbiString(abiString); + event.setAbi(abi); list.add(event); index++; From b4ac93f982b4235c0cacec7abc00c3c57708bf9a Mon Sep 17 00:00:00 2001 From: llwslc Date: Wed, 5 Jun 2019 15:09:37 +0800 Subject: [PATCH 2/2] add removed --- .../tron/common/logsfilter/capsule/ContractTriggerCapsule.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/org/tron/common/logsfilter/capsule/ContractTriggerCapsule.java b/src/main/java/org/tron/common/logsfilter/capsule/ContractTriggerCapsule.java index 5793644309b..774dda3e485 100644 --- a/src/main/java/org/tron/common/logsfilter/capsule/ContractTriggerCapsule.java +++ b/src/main/java/org/tron/common/logsfilter/capsule/ContractTriggerCapsule.java @@ -116,6 +116,7 @@ public void processTrigger() { event.setRawData(rawData); event.setLatestSolidifiedBlockNumber(contractTrigger.getLatestSolidifiedBlockNumber()); + event.setRemoved(contractTrigger.isRemoved()); event.setUniqueId(contractTrigger.getUniqueId()); event.setTransactionId(contractTrigger.getTransactionId()); event.setContractAddress(contractTrigger.getContractAddress());