Skip to content

Commit 4807521

Browse files
authored
Merge pull request tronprotocol#3100 from tronprotocol/hotfix/solidityEventLogContract
Hotfix/solidity event log contract
2 parents d9cb8b7 + 49432d8 commit 4807521

File tree

10 files changed

+209
-17
lines changed

10 files changed

+209
-17
lines changed

common/src/main/java/org/tron/common/logsfilter/EventPluginConfig.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ public class EventPluginConfig {
1212
public static final String CONTRACTEVENT_TRIGGER_NAME = "contractevent";
1313
public static final String CONTRACTLOG_TRIGGER_NAME = "contractlog";
1414
public static final String SOLIDITY_TRIGGER_NAME = "solidity";
15+
public static final String SOLIDITY_EVENT_NAME = "solidityevent";
16+
public static final String SOLIDITY_LOG_NAME= "soliditylog";
1517

1618
@Getter
1719
@Setter

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,16 @@ public class Trigger {
1010
public static final int CONTRACTLOG_TRIGGER = 2;
1111
public static final int CONTRACTEVENT_TRIGGER = 3;
1212
public static final int SOLIDITY_TRIGGER = 4;
13+
public static final int SOLIDITY_EVENT_TRIGGER = 5;
14+
public static final int SOLIDITY_LOG_TRIGGER = 6;
15+
1316
public static final String BLOCK_TRIGGER_NAME = "blockTrigger";
1417
public static final String TRANSACTION_TRIGGER_NAME = "transactionTrigger";
1518
public static final String CONTRACTLOG_TRIGGER_NAME = "contractLogTrigger";
1619
public static final String CONTRACTEVENT_TRIGGER_NAME = "contractEventTrigger";
1720
public static final String SOLIDITY_TRIGGER_NAME = "solidityTrigger";
21+
public static final String SOLIDITYLOG_TRIGGER_NAME = "solidityLogTrigger";
22+
public static final String SOLIDITYEVENT_TRIGGER_NAME = "solidityEventTrigger";
1823
@Getter
1924
@Setter
2025
protected long timeStamp;

framework/src/main/java/org/tron/common/logsfilter/EventPluginLoader.java

Lines changed: 55 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,11 @@ public class EventPluginLoader {
4848

4949
private boolean contractLogTriggerEnable = false;
5050

51-
private boolean solidityLogTriggerEnable = true;
51+
private boolean solidityEventTriggerEnable = false;
52+
53+
private boolean solidityLogTriggerEnable = false;
54+
55+
private boolean solidityTriggerEnable = false;
5256

5357
private FilterQuery filterQuery;
5458

@@ -277,13 +281,34 @@ private void setSingleTriggerConfig(TriggerConfig triggerConfig) {
277281
}
278282
} else if (EventPluginConfig.SOLIDITY_TRIGGER_NAME
279283
.equalsIgnoreCase(triggerConfig.getTriggerName())) {
284+
if (triggerConfig.isEnabled()) {
285+
solidityTriggerEnable = true;
286+
} else {
287+
solidityTriggerEnable = false;
288+
}
289+
if (!useNativeQueue) {
290+
setPluginTopic(Trigger.SOLIDITY_TRIGGER, triggerConfig.getTopic());
291+
}
292+
} else if (EventPluginConfig.SOLIDITY_EVENT_NAME
293+
.equalsIgnoreCase(triggerConfig.getTriggerName())) {
294+
if (triggerConfig.isEnabled()) {
295+
solidityEventTriggerEnable = true;
296+
} else {
297+
solidityEventTriggerEnable = false;
298+
}
299+
300+
if (!useNativeQueue) {
301+
setPluginTopic(Trigger.SOLIDITY_EVENT_TRIGGER, triggerConfig.getTopic());
302+
}
303+
} else if (EventPluginConfig.SOLIDITY_LOG_NAME
304+
.equalsIgnoreCase(triggerConfig.getTriggerName())) {
280305
if (triggerConfig.isEnabled()) {
281306
solidityLogTriggerEnable = true;
282307
} else {
283308
solidityLogTriggerEnable = false;
284309
}
285310
if (!useNativeQueue) {
286-
setPluginTopic(Trigger.SOLIDITY_TRIGGER, triggerConfig.getTopic());
311+
setPluginTopic(Trigger.SOLIDITY_LOG_TRIGGER, triggerConfig.getTopic());
287312
}
288313
}
289314
}
@@ -302,6 +327,14 @@ public synchronized boolean isBlockLogTriggerEnable() {
302327
return blockLogTriggerEnable;
303328
}
304329

330+
public synchronized boolean isSolidityTriggerEnable() {
331+
return solidityTriggerEnable;
332+
}
333+
334+
public synchronized boolean isSolidityEventTriggerEnable() {
335+
return solidityEventTriggerEnable;
336+
}
337+
305338
public synchronized boolean isSolidityLogTriggerEnable() {
306339
return solidityLogTriggerEnable;
307340
}
@@ -383,6 +416,26 @@ public void postBlockTrigger(BlockLogTrigger trigger) {
383416
}
384417
}
385418

419+
public void postSolidityLogTrigger(ContractLogTrigger trigger) {
420+
if (useNativeQueue) {
421+
NativeMessageQueue.getInstance()
422+
.publishTrigger(toJsonString(trigger), trigger.getTriggerName());
423+
} else {
424+
eventListeners.forEach(listener ->
425+
listener.handleSolidityLogTrigger(toJsonString(trigger)));
426+
}
427+
}
428+
429+
public void postSolidityEventTrigger(ContractEventTrigger trigger) {
430+
if (useNativeQueue) {
431+
NativeMessageQueue.getInstance()
432+
.publishTrigger(toJsonString(trigger), trigger.getTriggerName());
433+
} else {
434+
eventListeners.forEach(listener ->
435+
listener.handleSolidityEventTrigger(toJsonString(trigger)));
436+
}
437+
}
438+
386439
public void postTransactionTrigger(TransactionLogTrigger trigger) {
387440
if (useNativeQueue) {
388441
NativeMessageQueue.getInstance()

framework/src/main/java/org/tron/common/logsfilter/IPluginEventListener.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,4 +22,8 @@ public interface IPluginEventListener extends ExtensionPoint {
2222
void handleContractEventTrigger(Object trigger);
2323

2424
void handleSolidityTrigger(Object trigger);
25+
26+
void handleSolidityLogTrigger(Object trigger);
27+
28+
void handleSolidityEventTrigger(Object trigger);
2529
}

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

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,11 @@
22

33
import static org.tron.common.logsfilter.EventPluginLoader.matchFilter;
44

5+
import java.util.ArrayList;
56
import java.util.List;
67
import lombok.Getter;
78
import lombok.Setter;
9+
import lombok.extern.slf4j.Slf4j;
810
import org.apache.commons.lang3.ArrayUtils;
911
import org.pf4j.util.StringUtils;
1012
import org.spongycastle.util.encoders.Hex;
@@ -14,11 +16,13 @@
1416
import org.tron.common.logsfilter.trigger.ContractEventTrigger;
1517
import org.tron.common.logsfilter.trigger.ContractLogTrigger;
1618
import org.tron.common.logsfilter.trigger.ContractTrigger;
19+
import org.tron.common.logsfilter.trigger.Trigger;
1720
import org.tron.common.runtime.vm.DataWord;
1821
import org.tron.common.runtime.vm.LogInfo;
1922
import org.tron.core.config.args.Args;
2023
import org.tron.protos.contract.SmartContractOuterClass.SmartContract.ABI;
2124

25+
@Slf4j(topic = "DB")
2226
public class ContractTriggerCapsule extends TriggerCapsule {
2327

2428
@Getter
@@ -88,9 +92,6 @@ public void processTrigger() {
8892
}
8993

9094
if (isEvent) {
91-
if (!EventPluginLoader.getInstance().isContractEventTriggerEnable()) {
92-
return;
93-
}
9495
event = new ContractEventTrigger();
9596
((ContractEventTrigger) event).setEventSignature(eventSignature);
9697
((ContractEventTrigger) event).setEventSignatureFull(eventSignatureFull);
@@ -104,9 +105,6 @@ public void processTrigger() {
104105
((ContractEventTrigger) event)
105106
.setDataMap(ContractEventParserAbi.parseEventData(data, topicList, eventEntry));
106107
} else {
107-
if (!EventPluginLoader.getInstance().isContractLogTriggerEnable()) {
108-
return;
109-
}
110108
event = new ContractLogTrigger();
111109
((ContractLogTrigger) event).setTopicList(logInfo.getHexTopics());
112110
((ContractLogTrigger) event).setData(logInfo.getHexData());
@@ -129,9 +127,24 @@ public void processTrigger() {
129127

130128
if (matchFilter(contractTrigger)) {
131129
if (isEvent) {
132-
EventPluginLoader.getInstance().postContractEventTrigger((ContractEventTrigger) event);
130+
if (EventPluginLoader.getInstance().isContractEventTriggerEnable()) {
131+
EventPluginLoader.getInstance().postContractEventTrigger((ContractEventTrigger) event);
132+
}
133+
134+
if (EventPluginLoader.getInstance().isSolidityEventTriggerEnable()) {
135+
Args.getSolidityContractEventTriggerList().computeIfAbsent(event
136+
.getBlockNumber(), listBlk -> new ArrayList<>()).add((ContractEventTrigger) event);
137+
}
138+
133139
} else {
134-
EventPluginLoader.getInstance().postContractLogTrigger((ContractLogTrigger) event);
140+
if (EventPluginLoader.getInstance().isContractLogTriggerEnable()) {
141+
EventPluginLoader.getInstance().postContractLogTrigger((ContractLogTrigger) event);
142+
}
143+
144+
if (EventPluginLoader.getInstance().isSolidityLogTriggerEnable()) {
145+
Args.getSolidityContractLogTriggerList().computeIfAbsent(event
146+
.getBlockNumber(), listBlk -> new ArrayList<>()).add((ContractLogTrigger) event);
147+
}
135148
}
136149
}
137150
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package org.tron.common.logsfilter.capsule;
2+
3+
import lombok.Getter;
4+
import lombok.Setter;
5+
import org.tron.common.logsfilter.EventPluginLoader;
6+
import org.tron.common.logsfilter.trigger.ContractEventTrigger;
7+
8+
public class SolidityEventCapsule extends TriggerCapsule {
9+
@Getter
10+
@Setter
11+
private ContractEventTrigger solidityEventTrigger;
12+
13+
public SolidityEventCapsule(ContractEventTrigger solidityEventTrigger) {
14+
this.solidityEventTrigger = solidityEventTrigger;
15+
}
16+
17+
@Override
18+
public void processTrigger() {
19+
EventPluginLoader.getInstance().postSolidityEventTrigger(solidityEventTrigger);
20+
}
21+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package org.tron.common.logsfilter.capsule;
2+
3+
import lombok.Getter;
4+
import lombok.Setter;
5+
import org.tron.common.logsfilter.EventPluginLoader;
6+
import org.tron.common.logsfilter.trigger.ContractLogTrigger;
7+
8+
public class SolidityLogCapsule extends TriggerCapsule {
9+
@Getter
10+
@Setter
11+
private ContractLogTrigger solidityLogTrigger;
12+
13+
public SolidityLogCapsule(ContractLogTrigger solidityLogTrigger) {
14+
this.solidityLogTrigger = solidityLogTrigger;
15+
}
16+
17+
@Override
18+
public void processTrigger() {
19+
EventPluginLoader.getInstance().postSolidityLogTrigger(solidityLogTrigger);
20+
}
21+
}

framework/src/main/java/org/tron/core/config/args/Args.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,13 +24,15 @@
2424
import java.util.List;
2525
import java.util.Objects;
2626
import java.util.Optional;
27+
import java.util.concurrent.ConcurrentHashMap;
2728
import java.util.stream.Collectors;
2829
import lombok.Getter;
2930
import lombok.NoArgsConstructor;
3031
import lombok.Setter;
3132
import lombok.extern.slf4j.Slf4j;
3233
import org.apache.commons.collections4.CollectionUtils;
3334
import org.apache.commons.lang3.StringUtils;
35+
import org.springframework.beans.factory.annotation.Autowired;
3436
import org.springframework.stereotype.Component;
3537
import org.tron.common.args.Account;
3638
import org.tron.common.args.GenesisBlock;
@@ -40,6 +42,9 @@
4042
import org.tron.common.logsfilter.EventPluginConfig;
4143
import org.tron.common.logsfilter.FilterQuery;
4244
import org.tron.common.logsfilter.TriggerConfig;
45+
import org.tron.common.logsfilter.capsule.ContractTriggerCapsule;
46+
import org.tron.common.logsfilter.trigger.ContractEventTrigger;
47+
import org.tron.common.logsfilter.trigger.ContractLogTrigger;
4348
import org.tron.common.overlay.discover.node.Node;
4449
import org.tron.common.parameter.CommonParameter;
4550
import org.tron.common.parameter.RateLimiterInitialization;
@@ -67,6 +72,16 @@ public class Args extends CommonParameter {
6772
@Setter
6873
private static LocalWitnesses localWitnesses = new LocalWitnesses();
6974

75+
@Autowired(required = false)
76+
@Getter
77+
private static ConcurrentHashMap<Long, List<ContractLogTrigger>>
78+
solidityContractLogTriggerList = new ConcurrentHashMap<>();
79+
80+
@Autowired(required = false)
81+
@Getter
82+
private static ConcurrentHashMap<Long, List<ContractEventTrigger>>
83+
solidityContractEventTriggerList = new ConcurrentHashMap<>();
84+
7085
public static void clearParam() {
7186
PARAMETER.outputDirectory = "output-directory";
7287
PARAMETER.help = false;

0 commit comments

Comments
 (0)