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
Expand Up @@ -52,11 +52,11 @@ public void startup() {
@Override
public void shutdown() {
this.shutdownServices();
eventService.close();
if (!Args.getInstance().isSolidityNode() && (!Args.getInstance().p2pDisable)) {
tronNetService.close();
}
consensusService.stop();
eventService.close();
dbManager.close();
shutdown.countDown();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,9 @@
import com.google.protobuf.Any;
import com.google.protobuf.ByteString;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import lombok.Getter;
import lombok.Setter;
Expand Down Expand Up @@ -49,9 +51,21 @@ public TransactionLogTriggerCapsule(TransactionCapsule trxCapsule, BlockCapsule
this(trxCapsule, blockCapsule, 0, 0, 0, null, 0);
}

public TransactionLogTriggerCapsule(TransactionCapsule trxCapsule,
BlockCapsule blockCapsule, TransactionInfo transactionInfo) {
this(trxCapsule, blockCapsule, 0, 0, 0, transactionInfo, 0, true);
}

public TransactionLogTriggerCapsule(TransactionCapsule trxCapsule, BlockCapsule blockCapsule,
int txIndex, long preCumulativeEnergyUsed, long preCumulativeLogCount,
TransactionInfo transactionInfo, long energyUnitPrice) {
this(trxCapsule, blockCapsule, txIndex, preCumulativeEnergyUsed, preCumulativeLogCount,
transactionInfo, energyUnitPrice, false);
}

public TransactionLogTriggerCapsule(TransactionCapsule trxCapsule, BlockCapsule blockCapsule,
int txIndex, long preCumulativeEnergyUsed, long preCumulativeLogCount,
TransactionInfo transactionInfo, long energyUnitPrice, boolean flag) {
transactionLogTrigger = new TransactionLogTrigger();

String blockHash = "";
Expand Down Expand Up @@ -281,6 +295,7 @@ public TransactionLogTriggerCapsule(TransactionCapsule trxCapsule, BlockCapsule

if (Objects.nonNull(contractAddress) && contractAddress.size() > 0) {
if (Objects.nonNull(transactionInfo)
&& EventPluginLoader.getInstance().isTransactionLogTriggerEthCompatible()
&& contractType != null && contractType != CreateSmartContract) {
transactionLogTrigger.setContractAddress(null);
} else {
Expand All @@ -294,8 +309,38 @@ public TransactionLogTriggerCapsule(TransactionCapsule trxCapsule, BlockCapsule
getInternalTransactionList(programResult.getInternalTransactions()));
}

if (Objects.isNull(trxTrace) && Objects.nonNull(transactionInfo) && flag) {
Protocol.ResourceReceipt receipt = transactionInfo.getReceipt();
energyUsageTotal = receipt.getEnergyUsageTotal();
transactionLogTrigger.setEnergyFee(receipt.getEnergyFee());
transactionLogTrigger.setOriginEnergyUsage(receipt.getOriginEnergyUsage());
transactionLogTrigger.setEnergyUsageTotal(energyUsageTotal);
transactionLogTrigger.setNetUsage(receipt.getNetUsage());
transactionLogTrigger.setNetFee(receipt.getNetFee());
transactionLogTrigger.setEnergyUsage(receipt.getEnergyUsage());

if (transactionInfo.getContractResultCount() > 0) {
ByteString contractResult = transactionInfo.getContractResult(0);
if (Objects.nonNull(contractResult) && contractResult.size() > 0) {
transactionLogTrigger.setContractResult(Hex.toHexString(contractResult.toByteArray()));
}
}

ByteString contractAddress = transactionInfo.getContractAddress();
if (Objects.nonNull(contractAddress) && contractAddress.size() > 0) {
if (EventPluginLoader.getInstance().isTransactionLogTriggerEthCompatible()
&& contractType != null && contractType != CreateSmartContract) {
transactionLogTrigger.setContractAddress(null);
} else {
transactionLogTrigger
.setContractAddress(StringUtil.encode58Check((contractAddress.toByteArray())));
}
}
}

// process transactionInfo list, only enabled when ethCompatible is true
if (Objects.nonNull(transactionInfo)) {
if (Objects.nonNull(transactionInfo)
&& EventPluginLoader.getInstance().isTransactionLogTriggerEthCompatible()) {
transactionLogTrigger.setTransactionIndex(txIndex);
transactionLogTrigger.setCumulativeEnergyUsed(preCumulativeEnergyUsed + energyUsageTotal);
transactionLogTrigger.setPreCumulativeLogCount(preCumulativeLogCount);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@ public class BlockEventGet {

public BlockEvent getBlockEvent(long blockNum) throws Exception {
BlockCapsule block = manager.getChainBaseManager().getBlockByNum(blockNum);
block.getTransactions().forEach(t -> t.setBlockNum(block.getNum()));
long solidNum = manager.getDynamicPropertiesStore().getLatestSolidifiedBlockNum();
BlockEvent blockEvent = new BlockEvent();
blockEvent.setBlockId(block.getBlockId());
Expand Down Expand Up @@ -322,12 +323,7 @@ public List<TransactionLogTriggerCapsule> getTransactionLogTrigger(BlockCapsule
long solidNum) {
List<TransactionLogTriggerCapsule> transactionLogTriggerCapsules = new ArrayList<>();
if (!EventPluginLoader.getInstance().isTransactionLogTriggerEthCompatible()) {
for (TransactionCapsule t : block.getTransactions()) {
TransactionLogTriggerCapsule trx = new TransactionLogTriggerCapsule(t, block);
trx.setLatestSolidifiedBlockNumber(solidNum);
transactionLogTriggerCapsules.add(trx);
}
return transactionLogTriggerCapsules;
return getTransactionTriggers(block, solidNum);
}
List<TransactionCapsule> transactionCapsuleList = block.getTransactions();
GrpcAPI.TransactionInfoList transactionInfoList = GrpcAPI
Expand Down Expand Up @@ -364,7 +360,7 @@ public List<TransactionLogTriggerCapsule> getTransactionLogTrigger(BlockCapsule
TransactionCapsule transactionCapsule = transactionCapsuleList.get(i);
transactionCapsule.setBlockNum(block.getNum());
TransactionLogTriggerCapsule trx = new TransactionLogTriggerCapsule(transactionCapsule, block,
i, cumulativeEnergyUsed, cumulativeLogCount, transactionInfo, energyUnitPrice);
i, cumulativeEnergyUsed, cumulativeLogCount, transactionInfo, energyUnitPrice, true);
trx.setLatestSolidifiedBlockNumber(solidNum);
cumulativeEnergyUsed += trx.getTransactionLogTrigger().getEnergyUsageTotal();
cumulativeLogCount += transactionInfo.getLogCount();
Expand All @@ -389,4 +385,45 @@ public long getEnergyPrice(long blockTime) {
}
return energyPrice;
}

public List<TransactionLogTriggerCapsule> getTransactionTriggers(BlockCapsule block,
long solidNum) {
List<TransactionLogTriggerCapsule> list = new ArrayList<>();
if (block.getTransactions().size() == 0) {
return list;
}

GrpcAPI.TransactionInfoList transactionInfoList = GrpcAPI
.TransactionInfoList.newBuilder().build();
GrpcAPI.TransactionInfoList.Builder transactionInfoListBuilder = GrpcAPI
.TransactionInfoList.newBuilder();
try {
TransactionRetCapsule result = manager.getChainBaseManager().getTransactionRetStore()
.getTransactionInfoByBlockNum(ByteArray.fromLong(block.getNum()));
if (!Objects.isNull(result) && !Objects.isNull(result.getInstance())) {
result.getInstance().getTransactioninfoList()
.forEach(transactionInfoListBuilder::addTransactionInfo);
transactionInfoList = transactionInfoListBuilder.build();
}
} catch (Exception e) {
logger.warn("Get TransactionInfo failed, blockNum {}, {}.", block.getNum(), e.getMessage());
}

if (block.getTransactions().size() != transactionInfoList.getTransactionInfoCount()) {
for (TransactionCapsule t : block.getTransactions()) {
TransactionLogTriggerCapsule triggerCapsule = new TransactionLogTriggerCapsule(t, block);
triggerCapsule.setLatestSolidifiedBlockNumber(solidNum);
list.add(triggerCapsule);
}
} else {
for (int i = 0; i < transactionInfoList.getTransactionInfoCount(); i++) {
TransactionLogTriggerCapsule triggerCapsule = new TransactionLogTriggerCapsule(
block.getTransactions().get(i), block, transactionInfoList.getTransactionInfo(i));
triggerCapsule.setLatestSolidifiedBlockNumber(solidNum);
list.add(triggerCapsule);
}
}

return list;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -42,11 +42,16 @@ public void init() {
}

public void close() {
executor.shutdown();
logger.info("Event load service close.");
try {
load();
executor.shutdown();
logger.info("Event load service close.");
} catch (Exception e) {
logger.warn("Stop event load service fail. {}", e.getMessage());
}
}

public void load() throws Exception {
public synchronized void load() throws Exception {
long cacheHeadNum = BlockEventCache.getHead().getBlockId().getNum();
long tmpNum = manager.getDynamicPropertiesStore().getLatestBlockHeaderNumber();
if (cacheHeadNum >= tmpNum) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,9 @@ public class EventService {
@Autowired
private HistoryEventService historyEventService;

@Autowired
private SolidEventService solidEventService;

@Autowired
private Manager manager;

Expand Down Expand Up @@ -54,8 +57,9 @@ public void init() {
}

public void close() {
realtimeEventService.close();
blockEventLoad.close();
historyEventService.close();
blockEventLoad.close();
realtimeEventService.close();
solidEventService.close();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ public void init() {

isRunning = true;

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

logger.info("History event service start.");
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,8 +45,13 @@ public void init() {
}

public void close() {
executor.shutdown();
logger.info("Realtime event service close.");
try {
work();
executor.shutdown();
logger.info("Realtime event service close.");
} catch (Exception e) {
logger.warn("Close realtime event service fail. {}", e.getMessage());
}
}

public void add(Event event) {
Expand All @@ -57,7 +62,7 @@ public void add(Event event) {
queue.offer(event);
}

public void work() {
public synchronized void work() {
while (queue.size() > 0) {
Event event = queue.poll();
flush(event.getBlockEvent(), event.isRemove());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,11 +37,16 @@ public void init() {
}

public void close() {
executor.shutdown();
logger.info("Solid event service close.");
try {
work();
executor.shutdown();
logger.info("Solid event service close.");
} catch (Exception e) {
logger.warn("Close solid event service fail. {}", e.getMessage());
}
}

public void work() {
public synchronized void work() {
BlockCapsule.BlockId solidId = BlockEventCache.getSolidId();
if (solidId.getNum() <= BlockEventCache.getSolidNum()) {
return;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,13 @@
import static org.tron.protos.contract.Common.ResourceCode.BANDWIDTH;

import com.google.protobuf.ByteString;
import org.bouncycastle.util.encoders.Hex;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.tron.common.logsfilter.capsule.TransactionLogTriggerCapsule;
import org.tron.common.utils.Sha256Hash;
import org.tron.common.utils.StringUtil;
import org.tron.core.capsule.BlockCapsule;
import org.tron.core.capsule.TransactionCapsule;
import org.tron.p2p.utils.ByteArray;
Expand Down Expand Up @@ -242,6 +244,46 @@ public void testConstructorWithCreateSmartContract() {
Assert.assertNotNull(triggerCapsule.getTransactionLogTrigger().getFromAddress());
}

@Test
public void testConstructorWithCreateTransactionInfo() {
Protocol.TransactionInfo.Builder infoBuild = Protocol.TransactionInfo.newBuilder();

Protocol.ResourceReceipt.Builder resourceBuild = Protocol.ResourceReceipt.newBuilder();
resourceBuild.setEnergyFee(1);
resourceBuild.setEnergyUsageTotal(2);
resourceBuild.setEnergyUsage(3);
resourceBuild.setOriginEnergyUsage(4);
resourceBuild.setNetFee(5);
resourceBuild.setNetUsage(6);

infoBuild
.setContractAddress(ByteString.copyFrom(ByteArray.fromHexString(CONTRACT_ADDRESS)))
.addContractResult(ByteString.copyFrom(ByteArray.fromHexString("112233")))
.setReceipt(resourceBuild.build());

SmartContractOuterClass.CreateSmartContract.Builder builder2 =
SmartContractOuterClass.CreateSmartContract.newBuilder()
.setOwnerAddress(ByteString.copyFrom(ByteArray.fromHexString(OWNER_ADDRESS)));
TransactionCapsule tc = new TransactionCapsule(builder2.build(),
Protocol.Transaction.Contract.ContractType.CreateSmartContract);

BlockCapsule bc = new BlockCapsule(1, Sha256Hash.ZERO_HASH,
System.currentTimeMillis(), Sha256Hash.ZERO_HASH.getByteString());


TransactionLogTriggerCapsule trigger =
new TransactionLogTriggerCapsule(tc, bc, infoBuild.build());

Assert.assertEquals(1, trigger.getTransactionLogTrigger().getEnergyFee());
Assert.assertEquals(2, trigger.getTransactionLogTrigger().getEnergyUsageTotal());
Assert.assertEquals(3, trigger.getTransactionLogTrigger().getEnergyUsage());
Assert.assertEquals(4, trigger.getTransactionLogTrigger().getOriginEnergyUsage());
Assert.assertEquals(5, trigger.getTransactionLogTrigger().getNetFee());
Assert.assertEquals(6, trigger.getTransactionLogTrigger().getNetUsage());

Assert.assertEquals(StringUtil.encode58Check(Hex.decode(CONTRACT_ADDRESS)),
trigger.getTransactionLogTrigger().getContractAddress());
Assert.assertEquals("112233", trigger.getTransactionLogTrigger().getContractResult());
}

}
Loading