Skip to content

Commit 658a4e2

Browse files
committed
feat(event): optimize transaction trigger acquisition
1 parent a75e41d commit 658a4e2

5 files changed

Lines changed: 152 additions & 10 deletions

File tree

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

Lines changed: 40 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,12 @@ public TransactionLogTriggerCapsule(TransactionCapsule trxCapsule, BlockCapsule
4949
this(trxCapsule, blockCapsule, 0, 0, 0, null, 0);
5050
}
5151

52+
public TransactionLogTriggerCapsule(TransactionCapsule trxCapsule,
53+
BlockCapsule blockCapsule,
54+
TransactionInfo transactionInfo) {
55+
this(trxCapsule, blockCapsule, 0, 0, 0, transactionInfo, 0);
56+
}
57+
5258
public TransactionLogTriggerCapsule(TransactionCapsule trxCapsule, BlockCapsule blockCapsule,
5359
int txIndex, long preCumulativeEnergyUsed, long preCumulativeLogCount,
5460
TransactionInfo transactionInfo, long energyUnitPrice) {
@@ -63,7 +69,7 @@ public TransactionLogTriggerCapsule(TransactionCapsule trxCapsule, BlockCapsule
6369
String transactionHash = trxCapsule.getTransactionId().toString();
6470
transactionLogTrigger.setTransactionId(transactionHash);
6571
transactionLogTrigger.setTimeStamp(blockCapsule.getTimeStamp());
66-
transactionLogTrigger.setBlockNumber(trxCapsule.getBlockNum());
72+
transactionLogTrigger.setBlockNumber(blockCapsule.getNum());
6773
transactionLogTrigger.setData(Hex.toHexString(trxCapsule
6874
.getInstance().getRawData().getData().toByteArray()));
6975

@@ -281,6 +287,7 @@ public TransactionLogTriggerCapsule(TransactionCapsule trxCapsule, BlockCapsule
281287

282288
if (Objects.nonNull(contractAddress) && contractAddress.size() > 0) {
283289
if (Objects.nonNull(transactionInfo)
290+
&& EventPluginLoader.getInstance().isTransactionLogTriggerEthCompatible()
284291
&& contractType != null && contractType != CreateSmartContract) {
285292
transactionLogTrigger.setContractAddress(null);
286293
} else {
@@ -294,8 +301,38 @@ public TransactionLogTriggerCapsule(TransactionCapsule trxCapsule, BlockCapsule
294301
getInternalTransactionList(programResult.getInternalTransactions()));
295302
}
296303

304+
if (Objects.isNull(trxTrace) && Objects.nonNull(transactionInfo)) {
305+
Protocol.ResourceReceipt receipt = transactionInfo.getReceipt();
306+
energyUsageTotal = receipt.getEnergyUsageTotal();
307+
transactionLogTrigger.setEnergyFee(receipt.getEnergyFee());
308+
transactionLogTrigger.setOriginEnergyUsage(receipt.getOriginEnergyUsage());
309+
transactionLogTrigger.setEnergyUsageTotal(energyUsageTotal);
310+
transactionLogTrigger.setNetUsage(receipt.getNetUsage());
311+
transactionLogTrigger.setNetFee(receipt.getNetFee());
312+
transactionLogTrigger.setEnergyUsage(receipt.getEnergyUsage());
313+
314+
if (transactionInfo.getContractResultCount() > 0) {
315+
ByteString contractResult = transactionInfo.getContractResult(0);
316+
if (Objects.nonNull(contractResult) && contractResult.size() > 0) {
317+
transactionLogTrigger.setContractResult(Hex.toHexString(contractResult.toByteArray()));
318+
}
319+
}
320+
321+
ByteString contractAddress = transactionInfo.getContractAddress();
322+
if (Objects.nonNull(contractAddress) && contractAddress.size() > 0) {
323+
if (EventPluginLoader.getInstance().isTransactionLogTriggerEthCompatible()
324+
&& contractType != null && contractType != CreateSmartContract) {
325+
transactionLogTrigger.setContractAddress(null);
326+
} else {
327+
transactionLogTrigger
328+
.setContractAddress(StringUtil.encode58Check((contractAddress.toByteArray())));
329+
}
330+
}
331+
}
332+
297333
// process transactionInfo list, only enabled when ethCompatible is true
298-
if (Objects.nonNull(transactionInfo)) {
334+
if (Objects.nonNull(transactionInfo)
335+
&& EventPluginLoader.getInstance().isTransactionLogTriggerEthCompatible()) {
299336
transactionLogTrigger.setTransactionIndex(txIndex);
300337
transactionLogTrigger.setCumulativeEnergyUsed(preCumulativeEnergyUsed + energyUsageTotal);
301338
transactionLogTrigger.setPreCumulativeLogCount(preCumulativeLogCount);
@@ -309,7 +346,7 @@ public TransactionLogTriggerCapsule(TransactionCapsule trxCapsule, BlockCapsule
309346
logPojo.setAddress((log.getAddress() != null)
310347
? Hex.toHexString(log.getAddress().toByteArray()) : "");
311348
logPojo.setBlockHash(blockHash);
312-
logPojo.setBlockNumber(trxCapsule.getBlockNum());
349+
logPojo.setBlockNumber(blockCapsule.getNum());
313350
logPojo.setData(Hex.toHexString(log.getData().toByteArray()));
314351
logPojo.setLogIndex(preCumulativeLogCount + index);
315352

framework/src/main/java/org/tron/core/services/event/BlockEventGet.java

Lines changed: 41 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -322,12 +322,7 @@ public List<TransactionLogTriggerCapsule> getTransactionLogTrigger(BlockCapsule
322322
long solidNum) {
323323
List<TransactionLogTriggerCapsule> transactionLogTriggerCapsules = new ArrayList<>();
324324
if (!EventPluginLoader.getInstance().isTransactionLogTriggerEthCompatible()) {
325-
for (TransactionCapsule t : block.getTransactions()) {
326-
TransactionLogTriggerCapsule trx = new TransactionLogTriggerCapsule(t, block);
327-
trx.setLatestSolidifiedBlockNumber(solidNum);
328-
transactionLogTriggerCapsules.add(trx);
329-
}
330-
return transactionLogTriggerCapsules;
325+
return getTransactionTriggers(block, solidNum);
331326
}
332327
List<TransactionCapsule> transactionCapsuleList = block.getTransactions();
333328
GrpcAPI.TransactionInfoList transactionInfoList = GrpcAPI
@@ -389,4 +384,44 @@ public long getEnergyPrice(long blockTime) {
389384
}
390385
return energyPrice;
391386
}
387+
388+
public List<TransactionLogTriggerCapsule> getTransactionTriggers(BlockCapsule block,
389+
long solidNum) {
390+
List<TransactionLogTriggerCapsule> list = new ArrayList<>();
391+
if (block.getTransactions().size() == 0) {
392+
return list;
393+
}
394+
GrpcAPI.TransactionInfoList transactionInfoList = GrpcAPI
395+
.TransactionInfoList.newBuilder().build();
396+
GrpcAPI.TransactionInfoList.Builder transactionInfoListBuilder = GrpcAPI
397+
.TransactionInfoList.newBuilder();
398+
try {
399+
TransactionRetCapsule result = manager.getChainBaseManager().getTransactionRetStore()
400+
.getTransactionInfoByBlockNum(ByteArray.fromLong(block.getNum()));
401+
if (!Objects.isNull(result) && !Objects.isNull(result.getInstance())) {
402+
result.getInstance().getTransactioninfoList()
403+
.forEach(transactionInfoListBuilder::addTransactionInfo);
404+
transactionInfoList = transactionInfoListBuilder.build();
405+
}
406+
} catch (Exception e) {
407+
logger.warn("Get TransactionInfo failed, blockNum {}, {}.", block.getNum(), e.getMessage());
408+
}
409+
410+
if (block.getTransactions().size() != transactionInfoList.getTransactionInfoCount()) {
411+
for (TransactionCapsule t : block.getTransactions()) {
412+
TransactionLogTriggerCapsule triggerCapsule = new TransactionLogTriggerCapsule(t, block);
413+
triggerCapsule.setLatestSolidifiedBlockNumber(solidNum);
414+
list.add(triggerCapsule);
415+
}
416+
} else {
417+
for (int i = 0; i < transactionInfoList.getTransactionInfoCount(); i++) {
418+
TransactionLogTriggerCapsule triggerCapsule = new TransactionLogTriggerCapsule(
419+
block.getTransactions().get(i), block, transactionInfoList.getTransactionInfo(i));
420+
triggerCapsule.setLatestSolidifiedBlockNumber(solidNum);
421+
list.add(triggerCapsule);
422+
}
423+
}
424+
425+
return list;
426+
}
392427
}

framework/src/main/java/org/tron/core/services/event/HistoryEventService.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ public void init() {
3939

4040
isRunning = true;
4141

42-
new Thread(() -> syncEvent()).start();
42+
new Thread(() -> syncEvent(), "history-event").start();
4343

4444
logger.info("History event service start.");
4545
}

framework/src/test/java/org/tron/common/logsfilter/TransactionLogTriggerCapsuleTest.java

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,13 @@
44
import static org.tron.protos.contract.Common.ResourceCode.BANDWIDTH;
55

66
import com.google.protobuf.ByteString;
7+
import org.bouncycastle.util.encoders.Hex;
78
import org.junit.Assert;
89
import org.junit.Before;
910
import org.junit.Test;
1011
import org.tron.common.logsfilter.capsule.TransactionLogTriggerCapsule;
1112
import org.tron.common.utils.Sha256Hash;
13+
import org.tron.common.utils.StringUtil;
1214
import org.tron.core.capsule.BlockCapsule;
1315
import org.tron.core.capsule.TransactionCapsule;
1416
import org.tron.p2p.utils.ByteArray;
@@ -242,6 +244,46 @@ public void testConstructorWithCreateSmartContract() {
242244
Assert.assertNotNull(triggerCapsule.getTransactionLogTrigger().getFromAddress());
243245
}
244246

247+
@Test
248+
public void testConstructorWithCreateTransactionInfo() {
249+
Protocol.TransactionInfo.Builder infoBuild = Protocol.TransactionInfo.newBuilder();
250+
251+
Protocol.ResourceReceipt.Builder resourceBuild = Protocol.ResourceReceipt.newBuilder();
252+
resourceBuild.setEnergyFee(1);
253+
resourceBuild.setEnergyUsageTotal(2);
254+
resourceBuild.setEnergyUsage(3);
255+
resourceBuild.setOriginEnergyUsage(4);
256+
resourceBuild.setNetFee(5);
257+
resourceBuild.setNetUsage(6);
258+
259+
infoBuild
260+
.setContractAddress(ByteString.copyFrom(ByteArray.fromHexString(CONTRACT_ADDRESS)))
261+
.addContractResult(ByteString.copyFrom(ByteArray.fromHexString("112233")))
262+
.setReceipt(resourceBuild.build());
263+
264+
SmartContractOuterClass.CreateSmartContract.Builder builder2 =
265+
SmartContractOuterClass.CreateSmartContract.newBuilder()
266+
.setOwnerAddress(ByteString.copyFrom(ByteArray.fromHexString(OWNER_ADDRESS)));
267+
TransactionCapsule tc = new TransactionCapsule(builder2.build(),
268+
Protocol.Transaction.Contract.ContractType.CreateSmartContract);
245269

270+
BlockCapsule bc = new BlockCapsule(1, Sha256Hash.ZERO_HASH,
271+
System.currentTimeMillis(), Sha256Hash.ZERO_HASH.getByteString());
272+
273+
274+
TransactionLogTriggerCapsule trigger =
275+
new TransactionLogTriggerCapsule(tc, bc, infoBuild.build());
276+
277+
Assert.assertEquals(1, trigger.getTransactionLogTrigger().getEnergyFee());
278+
Assert.assertEquals(2, trigger.getTransactionLogTrigger().getEnergyUsageTotal());
279+
Assert.assertEquals(3, trigger.getTransactionLogTrigger().getEnergyUsage());
280+
Assert.assertEquals(4, trigger.getTransactionLogTrigger().getOriginEnergyUsage());
281+
Assert.assertEquals(5, trigger.getTransactionLogTrigger().getNetFee());
282+
Assert.assertEquals(6, trigger.getTransactionLogTrigger().getNetUsage());
283+
284+
Assert.assertEquals(StringUtil.encode58Check(Hex.decode(CONTRACT_ADDRESS)),
285+
trigger.getTransactionLogTrigger().getContractAddress());
286+
Assert.assertEquals("112233", trigger.getTransactionLogTrigger().getContractResult());
287+
}
246288

247289
}

framework/src/test/java/org/tron/core/event/BlockEventGetTest.java

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import java.time.ZoneId;
77
import java.time.ZonedDateTime;
88
import java.util.ArrayList;
9+
import java.util.List;
910
import java.util.concurrent.atomic.AtomicInteger;
1011
import lombok.extern.slf4j.Slf4j;
1112
import org.junit.After;
@@ -18,9 +19,11 @@
1819
import org.tron.common.logsfilter.EventPluginConfig;
1920
import org.tron.common.logsfilter.EventPluginLoader;
2021
import org.tron.common.logsfilter.TriggerConfig;
22+
import org.tron.common.logsfilter.capsule.TransactionLogTriggerCapsule;
2123
import org.tron.common.runtime.TvmTestUtils;
2224
import org.tron.common.utils.ByteArray;
2325
import org.tron.common.utils.PublicMethod;
26+
import org.tron.common.utils.Sha256Hash;
2427
import org.tron.core.ChainBaseManager;
2528
import org.tron.core.Constant;
2629
import org.tron.core.capsule.AccountCapsule;
@@ -182,4 +185,29 @@ public void test() throws Exception {
182185
Assert.fail();
183186
}
184187
}
188+
189+
@Test
190+
public void getTransactionTriggers() {
191+
BlockEventGet blockEventGet = new BlockEventGet();
192+
BlockCapsule bc = new BlockCapsule(1, Sha256Hash.ZERO_HASH,
193+
100, Sha256Hash.ZERO_HASH.getByteString());
194+
195+
List<TransactionLogTriggerCapsule> list = blockEventGet.getTransactionTriggers(bc, 1);
196+
Assert.assertEquals(0, list.size());
197+
198+
List<Protocol.Transaction> transactionList = new ArrayList<>();
199+
200+
Protocol.Transaction.raw rw = Protocol.Transaction.raw.newBuilder()
201+
.addContract(Protocol.Transaction.Contract.newBuilder().build()).build();
202+
203+
Protocol.Transaction transaction = Protocol.Transaction.newBuilder().setRawData(rw).build();
204+
205+
transactionList.add(transaction);
206+
207+
bc = new BlockCapsule(100, ByteString.empty(), 1, transactionList);
208+
209+
list = blockEventGet.getTransactionTriggers(bc, 1);
210+
Assert.assertEquals(1, list.size());
211+
Assert.assertEquals(100, list.get(0).getTransactionLogTrigger().getTimeStamp());
212+
}
185213
}

0 commit comments

Comments
 (0)