From 96c99fa718173239246e3a820a9f47f1a789c770 Mon Sep 17 00:00:00 2001 From: lvs007 Date: Fri, 22 Jan 2021 17:56:09 +0800 Subject: [PATCH 01/32] add the remove tx log --- .../main/java/org/tron/common/parameter/CommonParameter.java | 4 ++++ common/src/main/java/org/tron/core/Constant.java | 1 + framework/src/main/java/org/tron/core/config/args/Args.java | 4 ++++ framework/src/main/java/org/tron/core/db/Manager.java | 2 +- framework/src/main/java/org/tron/core/db/PendingManager.java | 4 ++++ 5 files changed, 14 insertions(+), 1 deletion(-) diff --git a/common/src/main/java/org/tron/common/parameter/CommonParameter.java b/common/src/main/java/org/tron/common/parameter/CommonParameter.java index 5b6203a24dd..142fc348b81 100644 --- a/common/src/main/java/org/tron/common/parameter/CommonParameter.java +++ b/common/src/main/java/org/tron/common/parameter/CommonParameter.java @@ -461,6 +461,10 @@ public class CommonParameter { @Parameter(names = {"--history-balance-lookup"}) public boolean historyBalanceLookup = false; + @Getter + @Setter + public boolean openPrintLog = true; + private static double calcMaxTimeRatio() { //return max(2.0, min(5.0, 5 * 4.0 / max(Runtime.getRuntime().availableProcessors(), 1))); return 5.0; diff --git a/common/src/main/java/org/tron/core/Constant.java b/common/src/main/java/org/tron/core/Constant.java index b7dbd333404..6bd5ceb6ca7 100644 --- a/common/src/main/java/org/tron/core/Constant.java +++ b/common/src/main/java/org/tron/core/Constant.java @@ -273,6 +273,7 @@ public class Constant { public static final String METRICS_REPORT_INTERVAL = "node.metrics.influxdb.metricsReportInterval"; public static final String HISTORY_BALANCE_LOOKUP = "storage.balance.history.lookup"; + public static final String OPEN_PRINT_LOG = "node.openPrintLog"; public static final String LOCAL_HOST = "127.0.0.1"; } diff --git a/framework/src/main/java/org/tron/core/config/args/Args.java b/framework/src/main/java/org/tron/core/config/args/Args.java index 83e9b5d7ccc..857ac0cd30a 100644 --- a/framework/src/main/java/org/tron/core/config/args/Args.java +++ b/framework/src/main/java/org/tron/core/config/args/Args.java @@ -185,6 +185,7 @@ public static void clearParam() { PARAMETER.allowTvmStake = 0; PARAMETER.allowTvmAssetIssue = 0; PARAMETER.historyBalanceLookup = false; + PARAMETER.openPrintLog = true; } /** @@ -744,6 +745,9 @@ public static void setParam(final String[] args, final String confFileName) { PARAMETER.historyBalanceLookup = config.hasPath(Constant.HISTORY_BALANCE_LOOKUP) && config .getBoolean(Constant.HISTORY_BALANCE_LOOKUP); + PARAMETER.openPrintLog = config.hasPath(Constant.OPEN_PRINT_LOG) ? config + .getBoolean(Constant.OPEN_PRINT_LOG) : true; + logConfig(); } diff --git a/framework/src/main/java/org/tron/core/db/Manager.java b/framework/src/main/java/org/tron/core/db/Manager.java index b233400c85e..13665c47dbb 100644 --- a/framework/src/main/java/org/tron/core/db/Manager.java +++ b/framework/src/main/java/org/tron/core/db/Manager.java @@ -1271,7 +1271,7 @@ public synchronized BlockCapsule generateBlock(Miner miner, long blockTime, long iterator.remove(); } } catch (Exception e) { - logger.error("Process trx failed when generating block: {}", e.getMessage()); + logger.error("Process trx {} failed when generating block: {}",trx.getTransactionId() ,e.getMessage()); } } diff --git a/framework/src/main/java/org/tron/core/db/PendingManager.java b/framework/src/main/java/org/tron/core/db/PendingManager.java index 4098d6b2d70..1a6f26bff59 100644 --- a/framework/src/main/java/org/tron/core/db/PendingManager.java +++ b/framework/src/main/java/org/tron/core/db/PendingManager.java @@ -23,6 +23,8 @@ public PendingManager(Manager db) { db.getPendingTransactions().forEach(transactionCapsule -> { if (System.currentTimeMillis() - transactionCapsule.getTime() < timeout) { tmpTransactions.add(transactionCapsule); + } else if (Args.getInstance().isOpenPrintLog()) { + logger.warn("remove tx from pending, txId:{}", transactionCapsule.getTransactionId()); } }); @@ -55,6 +57,8 @@ private void txIteration(TransactionCapsule tx) { if (tx.getTrxTrace() != null && tx.getTrxTrace().getTimeResultType().equals(TimeResultType.NORMAL)) { dbManager.getRePushTransactions().put(tx); + } else if (Args.getInstance().isOpenPrintLog()) { + logger.warn("remove tx from pending, txId:{}", tx.getTransactionId()); } } catch (InterruptedException e) { logger.error(e.getMessage()); From dde080479eaa5276ac18ef881956e5b57d77525f Mon Sep 17 00:00:00 2001 From: lvs007 Date: Fri, 22 Jan 2021 18:17:30 +0800 Subject: [PATCH 02/32] add log --- framework/src/main/java/org/tron/core/db/Manager.java | 2 +- framework/src/main/java/org/tron/core/db/PendingManager.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/framework/src/main/java/org/tron/core/db/Manager.java b/framework/src/main/java/org/tron/core/db/Manager.java index 13665c47dbb..1b6486d305d 100644 --- a/framework/src/main/java/org/tron/core/db/Manager.java +++ b/framework/src/main/java/org/tron/core/db/Manager.java @@ -1271,7 +1271,7 @@ public synchronized BlockCapsule generateBlock(Miner miner, long blockTime, long iterator.remove(); } } catch (Exception e) { - logger.error("Process trx {} failed when generating block: {}",trx.getTransactionId() ,e.getMessage()); + logger.error("Process trx {} failed when generating block: {}", trx.getTransactionId() ,e.getMessage()); } } diff --git a/framework/src/main/java/org/tron/core/db/PendingManager.java b/framework/src/main/java/org/tron/core/db/PendingManager.java index 1a6f26bff59..d20783233a3 100644 --- a/framework/src/main/java/org/tron/core/db/PendingManager.java +++ b/framework/src/main/java/org/tron/core/db/PendingManager.java @@ -24,7 +24,7 @@ public PendingManager(Manager db) { if (System.currentTimeMillis() - transactionCapsule.getTime() < timeout) { tmpTransactions.add(transactionCapsule); } else if (Args.getInstance().isOpenPrintLog()) { - logger.warn("remove tx from pending, txId:{}", transactionCapsule.getTransactionId()); + logger.warn("[timeout] remove tx from pending, txId:{}", transactionCapsule.getTransactionId()); } }); From 406a9bb97215c4405ab4788656e8523af1ed2fa5 Mon Sep 17 00:00:00 2001 From: lvs007 Date: Sat, 23 Jan 2021 11:13:49 +0800 Subject: [PATCH 03/32] add log --- .../tron/core/net/messagehandler/InventoryMsgHandler.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/framework/src/main/java/org/tron/core/net/messagehandler/InventoryMsgHandler.java b/framework/src/main/java/org/tron/core/net/messagehandler/InventoryMsgHandler.java index 99f088ab323..6b8a8d85c92 100644 --- a/framework/src/main/java/org/tron/core/net/messagehandler/InventoryMsgHandler.java +++ b/framework/src/main/java/org/tron/core/net/messagehandler/InventoryMsgHandler.java @@ -4,6 +4,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.tron.common.utils.Sha256Hash; +import org.tron.core.config.args.Args; import org.tron.core.net.TronNetDelegate; import org.tron.core.net.message.InventoryMessage; import org.tron.core.net.message.TronMessage; @@ -58,12 +59,18 @@ private boolean check(PeerConnection peer, InventoryMessage inventoryMessage) { if (count > maxCountIn10s) { logger.warn("Drop inv: {} size: {} from Peer {}, Inv count: {} is overload.", type, size, peer.getInetAddress(), count); + if (Args.getInstance().isOpenPrintLog()) { + logger.warn("[overload]Drop tx list is: {}", inventoryMessage.getHashList()); + } return false; } if (transactionsMsgHandler.isBusy()) { logger.warn("Drop inv: {} size: {} from Peer {}, transactionsMsgHandler is busy.", type, size, peer.getInetAddress()); + if (Args.getInstance().isOpenPrintLog()) { + logger.warn("[isBusy]Drop tx list is: {}", inventoryMessage.getHashList()); + } return false; } } From 4fd9d33970dba7d98cd89303232ccfb9628fad6c Mon Sep 17 00:00:00 2001 From: lvs007 Date: Mon, 25 Jan 2021 16:14:55 +0800 Subject: [PATCH 04/32] remove the execute long time transaction --- .../org/tron/core/db/TransactionTrace.java | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/chainbase/src/main/java/org/tron/core/db/TransactionTrace.java b/chainbase/src/main/java/org/tron/core/db/TransactionTrace.java index 984b06c1e76..5a58e331edb 100644 --- a/chainbase/src/main/java/org/tron/core/db/TransactionTrace.java +++ b/chainbase/src/main/java/org/tron/core/db/TransactionTrace.java @@ -181,16 +181,16 @@ public void exec() runtime.execute(transactionContext); setBill(transactionContext.getProgramResult().getEnergyUsed()); - if (TrxType.TRX_PRECOMPILED_TYPE != trxType) { - if (contractResult.OUT_OF_TIME - .equals(receipt.getResult())) { - setTimeResultType(TimeResultType.OUT_OF_TIME); - } else if (System.currentTimeMillis() - txStartTimeInMs - > CommonParameter.getInstance() - .getLongRunningTime()) { - setTimeResultType(TimeResultType.LONG_RUNNING); - } - } +// if (TrxType.TRX_PRECOMPILED_TYPE != trxType) { +// if (contractResult.OUT_OF_TIME +// .equals(receipt.getResult())) { +// setTimeResultType(TimeResultType.OUT_OF_TIME); +// } else if (System.currentTimeMillis() - txStartTimeInMs +// > CommonParameter.getInstance() +// .getLongRunningTime()) { +// setTimeResultType(TimeResultType.LONG_RUNNING); +// } +// } } public void finalization() throws ContractExeException { From 1d7e963ee32c03c8a2fb95c05d3c23d8949c672d Mon Sep 17 00:00:00 2001 From: lvs007 Date: Tue, 26 Jan 2021 17:46:06 +0800 Subject: [PATCH 05/32] add the query pending transaction interface --- .../main/java/org/tron/core/db/Manager.java | 36 ++++++++++++- .../org/tron/core/services/RpcApiService.java | 46 ++++++++++++++++ .../services/http/FullNodeHttpApiService.java | 6 +++ .../GetTransactionFromPendingServlet.java | 53 +++++++++++++++++++ .../GetTransactionListFromPendingServlet.java | 45 ++++++++++++++++ .../interfaceOnPBFT/RpcApiServiceOnPBFT.java | 17 ++++++ ...etTransactionFromPendingOnPBFTServlet.java | 27 ++++++++++ ...ansactionListFromPendingOnPBFTServlet.java | 28 ++++++++++ .../http/PBFT/HttpApiOnPBFTService.java | 10 ++++ .../RpcApiServiceOnSolidity.java | 17 ++++++ ...ansactionFromPendingOnSolidityServlet.java | 27 ++++++++++ ...ctionListFromPendingOnSolidityServlet.java | 29 ++++++++++ .../solidity/HttpApiOnSolidityService.java | 10 ++++ protocol/src/main/protos/api/api.proto | 13 +++++ 14 files changed, 363 insertions(+), 1 deletion(-) create mode 100644 framework/src/main/java/org/tron/core/services/http/GetTransactionFromPendingServlet.java create mode 100644 framework/src/main/java/org/tron/core/services/http/GetTransactionListFromPendingServlet.java create mode 100644 framework/src/main/java/org/tron/core/services/interfaceOnPBFT/http/GetTransactionFromPendingOnPBFTServlet.java create mode 100644 framework/src/main/java/org/tron/core/services/interfaceOnPBFT/http/GetTransactionListFromPendingOnPBFTServlet.java create mode 100644 framework/src/main/java/org/tron/core/services/interfaceOnSolidity/http/GetTransactionFromPendingOnSolidityServlet.java create mode 100644 framework/src/main/java/org/tron/core/services/interfaceOnSolidity/http/GetTransactionListFromPendingOnSolidityServlet.java diff --git a/framework/src/main/java/org/tron/core/db/Manager.java b/framework/src/main/java/org/tron/core/db/Manager.java index 1b6486d305d..135bdeaf273 100644 --- a/framework/src/main/java/org/tron/core/db/Manager.java +++ b/framework/src/main/java/org/tron/core/db/Manager.java @@ -16,6 +16,7 @@ import com.google.protobuf.ByteString; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collection; import java.util.Collections; import java.util.HashSet; import java.util.Iterator; @@ -35,6 +36,7 @@ import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicLong; +import java.util.concurrent.atomic.AtomicReference; import java.util.stream.Collectors; import java.util.stream.LongStream; import javax.annotation.PostConstruct; @@ -1271,7 +1273,8 @@ public synchronized BlockCapsule generateBlock(Miner miner, long blockTime, long iterator.remove(); } } catch (Exception e) { - logger.error("Process trx {} failed when generating block: {}", trx.getTransactionId() ,e.getMessage()); + logger.error("Process trx {} failed when generating block: {}", trx.getTransactionId(), + e.getMessage()); } } @@ -1778,4 +1781,35 @@ public Boolean call() throws ValidateSignatureException { return true; } } + + public TransactionCapsule getTxFromPending(String txId) { + AtomicReference transactionCapsule = new AtomicReference<>(); + pendingTransactions.forEach(tx -> { + if (tx.getTransactionId().toString().equals(txId)) { + transactionCapsule.set(tx); + return; + } + }); + if (transactionCapsule.get() != null) { + return transactionCapsule.get(); + } + rePushTransactions.forEach(tx -> { + if (tx.getTransactionId().toString().equals(txId)) { + transactionCapsule.set(tx); + return; + } + }); + return transactionCapsule.get(); + } + + public Collection getTxListFromPending() { + Set result = new HashSet<>(); + pendingTransactions.forEach(tx -> { + result.add(tx.getInstance()); + }); + rePushTransactions.forEach(tx -> { + result.add(tx.getInstance()); + }); + return result; + } } diff --git a/framework/src/main/java/org/tron/core/services/RpcApiService.java b/framework/src/main/java/org/tron/core/services/RpcApiService.java index 2d0183f57f6..c404622cc56 100755 --- a/framework/src/main/java/org/tron/core/services/RpcApiService.java +++ b/framework/src/main/java/org/tron/core/services/RpcApiService.java @@ -901,6 +901,17 @@ public void getTransactionInfoByBlockNum(NumberMessage request, responseObserver.onCompleted(); } + @Override + public void getTransactionFromPending(BytesMessage request, + StreamObserver responseObserver) { + getTransactionFromPendingCommon(request, responseObserver); + } + + @Override + public void getTransactionListFromPending(EmptyMessage request, + StreamObserver responseObserver) { + getTransactionListFromPendingCommon(request, responseObserver); + } } /** @@ -2628,6 +2639,18 @@ public void getMarketPairList(EmptyMessage request, } responseObserver.onCompleted(); } + + @Override + public void getTransactionFromPending(BytesMessage request, + StreamObserver responseObserver) { + getTransactionFromPendingCommon(request, responseObserver); + } + + @Override + public void getTransactionListFromPending(EmptyMessage request, + StreamObserver responseObserver) { + getTransactionListFromPendingCommon(request, responseObserver); + } } public class MonitorApi extends MonitorGrpc.MonitorImplBase { @@ -2710,4 +2733,27 @@ public void getTransactionCountByBlockNumCommon(NumberMessage request, responseObserver.onCompleted(); } + public void getTransactionFromPendingCommon(BytesMessage request, + StreamObserver responseObserver) { + try { + String txId = ByteArray.toHexString(request.getValue().toByteArray()); + TransactionCapsule transactionCapsule = dbManager.getTxFromPending(txId); + responseObserver.onNext(transactionCapsule == null ? null : transactionCapsule.getInstance()); + } catch (Exception e) { + responseObserver.onError(e); + } + responseObserver.onCompleted(); + } + + public void getTransactionListFromPendingCommon(EmptyMessage request, + StreamObserver responseObserver) { + try { + TransactionList.Builder builder = TransactionList.newBuilder(); + builder.addAllTransaction(dbManager.getTxListFromPending()); + responseObserver.onNext(builder.build()); + } catch (Exception e) { + responseObserver.onError(e); + } + responseObserver.onCompleted(); + } } diff --git a/framework/src/main/java/org/tron/core/services/http/FullNodeHttpApiService.java b/framework/src/main/java/org/tron/core/services/http/FullNodeHttpApiService.java index 944379c8f42..7c0f372127d 100644 --- a/framework/src/main/java/org/tron/core/services/http/FullNodeHttpApiService.java +++ b/framework/src/main/java/org/tron/core/services/http/FullNodeHttpApiService.java @@ -278,6 +278,10 @@ public class FullNodeHttpApiService implements Service { @Autowired private LiteFnQueryHttpFilter liteFnQueryHttpFilter; + @Autowired + private GetTransactionFromPendingServlet getTransactionFromPendingServlet; + @Autowired + private GetTransactionListFromPendingServlet getTransactionListFromPendingServlet; private static String getParamsFile(String fileName) { InputStream in = Thread.currentThread().getContextClassLoader() @@ -518,6 +522,8 @@ public void start() { context.addServlet(new ServletHolder(getBlockBalanceServlet), "/wallet/getblockbalance"); context.addServlet(new ServletHolder(getBurnTrxServlet), "/wallet/getburntrx"); + context.addServlet(new ServletHolder(getTransactionFromPendingServlet), "/wallet/gettransactionfrompending"); + context.addServlet(new ServletHolder(getTransactionListFromPendingServlet), "/wallet/gettransactionlistfrompending"); int maxHttpConnectNumber = Args.getInstance().getMaxHttpConnectNumber(); if (maxHttpConnectNumber > 0) { diff --git a/framework/src/main/java/org/tron/core/services/http/GetTransactionFromPendingServlet.java b/framework/src/main/java/org/tron/core/services/http/GetTransactionFromPendingServlet.java new file mode 100644 index 00000000000..276eff62af8 --- /dev/null +++ b/framework/src/main/java/org/tron/core/services/http/GetTransactionFromPendingServlet.java @@ -0,0 +1,53 @@ +package org.tron.core.services.http; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.tron.api.GrpcAPI.BytesMessage; +import org.tron.common.utils.ByteArray; +import org.tron.core.capsule.TransactionCapsule; +import org.tron.core.db.Manager; + + +@Component +@Slf4j(topic = "API") +public class GetTransactionFromPendingServlet extends RateLimiterServlet { + + @Autowired + private Manager manager; + + protected void doGet(HttpServletRequest request, HttpServletResponse response) { + try { + boolean visible = Util.getVisible(request); + String input = request.getParameter("value"); + TransactionCapsule reply = manager.getTxFromPending(input); + if (reply != null) { + response.getWriter().println(Util.printTransaction(reply.getInstance(), visible)); + } else { + response.getWriter().println("{}"); + } + } catch (Exception e) { + Util.processError(e, response); + } + } + + protected void doPost(HttpServletRequest request, HttpServletResponse response) { + try { + PostParams params = PostParams.getPostParams(request); + BytesMessage.Builder build = BytesMessage.newBuilder(); + JsonFormat.merge(params.getParams(), build, params.isVisible()); + TransactionCapsule reply = manager + .getTxFromPending(ByteArray.toHexString(build.getValue().toByteArray())); + if (reply != null) { + response.getWriter() + .println(Util.printTransaction(reply.getInstance(), params.isVisible())); + } else { + response.getWriter().println("{}"); + } + } catch (Exception e) { + Util.processError(e, response); + } + } +} diff --git a/framework/src/main/java/org/tron/core/services/http/GetTransactionListFromPendingServlet.java b/framework/src/main/java/org/tron/core/services/http/GetTransactionListFromPendingServlet.java new file mode 100644 index 00000000000..0ed2498eb5c --- /dev/null +++ b/framework/src/main/java/org/tron/core/services/http/GetTransactionListFromPendingServlet.java @@ -0,0 +1,45 @@ +package org.tron.core.services.http; + +import java.util.Collection; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.tron.api.GrpcAPI.TransactionList; +import org.tron.core.db.Manager; +import org.tron.protos.Protocol.Transaction; + + +@Component +@Slf4j(topic = "API") +public class GetTransactionListFromPendingServlet extends RateLimiterServlet { + + @Autowired + private Manager manager; + + protected void doGet(HttpServletRequest request, HttpServletResponse response) { + try { + boolean visible = Util.getVisible(request); + Collection result = manager.getTxListFromPending(); + TransactionList.Builder builder = TransactionList.newBuilder(); + builder.addAllTransaction(result); + response.getWriter().println(Util.printTransactionList(builder.build(), visible)); + } catch (Exception e) { + Util.processError(e, response); + } + } + + protected void doPost(HttpServletRequest request, HttpServletResponse response) { + try { + PostParams params = PostParams.getPostParams(request); + Collection result = manager.getTxListFromPending(); + TransactionList.Builder builder = TransactionList.newBuilder(); + builder.addAllTransaction(result); + response.getWriter() + .println(Util.printTransactionList(builder.build(), params.isVisible())); + } catch (Exception e) { + Util.processError(e, response); + } + } +} diff --git a/framework/src/main/java/org/tron/core/services/interfaceOnPBFT/RpcApiServiceOnPBFT.java b/framework/src/main/java/org/tron/core/services/interfaceOnPBFT/RpcApiServiceOnPBFT.java index 8519d0bd6de..c719e6c3887 100755 --- a/framework/src/main/java/org/tron/core/services/interfaceOnPBFT/RpcApiServiceOnPBFT.java +++ b/framework/src/main/java/org/tron/core/services/interfaceOnPBFT/RpcApiServiceOnPBFT.java @@ -30,6 +30,7 @@ import org.tron.api.GrpcAPI.PaginatedMessage; import org.tron.api.GrpcAPI.SpendResult; import org.tron.api.GrpcAPI.TransactionExtention; +import org.tron.api.GrpcAPI.TransactionList; import org.tron.api.GrpcAPI.WitnessList; import org.tron.api.WalletSolidityGrpc.WalletSolidityImplBase; import org.tron.common.application.Service; @@ -495,5 +496,21 @@ public void getBurnTrx(EmptyMessage request, StreamObserver respo () -> rpcApiService.getWalletSolidityApi().getBurnTrx(request, responseObserver) ); } + + @Override + public void getTransactionFromPending(BytesMessage request, + StreamObserver responseObserver) { + walletOnPBFT.futureGet(() -> rpcApiService.getWalletSolidityApi() + .getTransactionFromPending(request, responseObserver) + ); + } + + @Override + public void getTransactionListFromPending(EmptyMessage request, + StreamObserver responseObserver) { + walletOnPBFT.futureGet(() -> rpcApiService.getWalletSolidityApi() + .getTransactionListFromPending(request, responseObserver) + ); + } } } diff --git a/framework/src/main/java/org/tron/core/services/interfaceOnPBFT/http/GetTransactionFromPendingOnPBFTServlet.java b/framework/src/main/java/org/tron/core/services/interfaceOnPBFT/http/GetTransactionFromPendingOnPBFTServlet.java new file mode 100644 index 00000000000..f82a2458a10 --- /dev/null +++ b/framework/src/main/java/org/tron/core/services/interfaceOnPBFT/http/GetTransactionFromPendingOnPBFTServlet.java @@ -0,0 +1,27 @@ +package org.tron.core.services.interfaceOnPBFT.http; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.tron.core.services.http.GetBurnTrxServlet; +import org.tron.core.services.http.GetTransactionFromPendingServlet; +import org.tron.core.services.interfaceOnPBFT.WalletOnPBFT; + + +@Component +@Slf4j(topic = "API") +public class GetTransactionFromPendingOnPBFTServlet extends GetTransactionFromPendingServlet { + + @Autowired + private WalletOnPBFT walletOnPBFT; + + protected void doGet(HttpServletRequest request, HttpServletResponse response) { + walletOnPBFT.futureGet(() -> super.doGet(request, response)); + } + + protected void doPost(HttpServletRequest request, HttpServletResponse response) { + walletOnPBFT.futureGet(() -> super.doPost(request, response)); + } +} diff --git a/framework/src/main/java/org/tron/core/services/interfaceOnPBFT/http/GetTransactionListFromPendingOnPBFTServlet.java b/framework/src/main/java/org/tron/core/services/interfaceOnPBFT/http/GetTransactionListFromPendingOnPBFTServlet.java new file mode 100644 index 00000000000..a032b650c9d --- /dev/null +++ b/framework/src/main/java/org/tron/core/services/interfaceOnPBFT/http/GetTransactionListFromPendingOnPBFTServlet.java @@ -0,0 +1,28 @@ +package org.tron.core.services.interfaceOnPBFT.http; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.tron.core.services.http.GetBurnTrxServlet; +import org.tron.core.services.http.GetTransactionListFromPendingServlet; +import org.tron.core.services.interfaceOnPBFT.WalletOnPBFT; + + +@Component +@Slf4j(topic = "API") +public class GetTransactionListFromPendingOnPBFTServlet extends + GetTransactionListFromPendingServlet { + + @Autowired + private WalletOnPBFT walletOnPBFT; + + protected void doGet(HttpServletRequest request, HttpServletResponse response) { + walletOnPBFT.futureGet(() -> super.doGet(request, response)); + } + + protected void doPost(HttpServletRequest request, HttpServletResponse response) { + walletOnPBFT.futureGet(() -> super.doPost(request, response)); + } +} diff --git a/framework/src/main/java/org/tron/core/services/interfaceOnPBFT/http/PBFT/HttpApiOnPBFTService.java b/framework/src/main/java/org/tron/core/services/interfaceOnPBFT/http/PBFT/HttpApiOnPBFTService.java index 751d7d76c4f..9c300e1b914 100644 --- a/framework/src/main/java/org/tron/core/services/interfaceOnPBFT/http/PBFT/HttpApiOnPBFTService.java +++ b/framework/src/main/java/org/tron/core/services/interfaceOnPBFT/http/PBFT/HttpApiOnPBFTService.java @@ -39,6 +39,8 @@ import org.tron.core.services.interfaceOnPBFT.http.GetPaginatedAssetIssueListOnPBFTServlet; import org.tron.core.services.interfaceOnPBFT.http.GetRewardOnPBFTServlet; import org.tron.core.services.interfaceOnPBFT.http.GetTransactionCountByBlockNumOnPBFTServlet; +import org.tron.core.services.interfaceOnPBFT.http.GetTransactionFromPendingOnPBFTServlet; +import org.tron.core.services.interfaceOnPBFT.http.GetTransactionListFromPendingOnPBFTServlet; import org.tron.core.services.interfaceOnPBFT.http.IsShieldedTRC20ContractNoteSpentOnPBFTServlet; import org.tron.core.services.interfaceOnPBFT.http.IsSpendOnPBFTServlet; import org.tron.core.services.interfaceOnPBFT.http.ListExchangesOnPBFTServlet; @@ -144,6 +146,10 @@ public class HttpApiOnPBFTService implements Service { isShieldedTRC20ContractNoteSpentOnPBFTServlet; @Autowired private GetBurnTrxOnPBFTServlet getBurnTrxOnPBFTServlet; + @Autowired + private GetTransactionFromPendingOnPBFTServlet getTransactionFromPendingOnPBFTServlet; + @Autowired + private GetTransactionListFromPendingOnPBFTServlet getTransactionListFromPendingOnPBFTServlet; @Override public void init() { @@ -229,6 +235,10 @@ public void start() { "/isshieldedtrc20contractnotespent"); context.addServlet(new ServletHolder(getBurnTrxOnPBFTServlet), "/getburntrx"); + context.addServlet(new ServletHolder(getTransactionFromPendingOnPBFTServlet), + "/gettransactionfrompending"); + context.addServlet(new ServletHolder(getTransactionListFromPendingOnPBFTServlet), + "/gettransactionlistfrompending"); int maxHttpConnectNumber = Args.getInstance().getMaxHttpConnectNumber(); if (maxHttpConnectNumber > 0) { diff --git a/framework/src/main/java/org/tron/core/services/interfaceOnSolidity/RpcApiServiceOnSolidity.java b/framework/src/main/java/org/tron/core/services/interfaceOnSolidity/RpcApiServiceOnSolidity.java index 4099d101f4b..9dbbd25d156 100755 --- a/framework/src/main/java/org/tron/core/services/interfaceOnSolidity/RpcApiServiceOnSolidity.java +++ b/framework/src/main/java/org/tron/core/services/interfaceOnSolidity/RpcApiServiceOnSolidity.java @@ -29,6 +29,7 @@ import org.tron.api.GrpcAPI.SpendResult; import org.tron.api.GrpcAPI.TransactionExtention; import org.tron.api.GrpcAPI.TransactionInfoList; +import org.tron.api.GrpcAPI.TransactionList; import org.tron.api.GrpcAPI.WitnessList; import org.tron.api.WalletSolidityGrpc.WalletSolidityImplBase; import org.tron.common.application.Service; @@ -491,5 +492,21 @@ public void getBurnTrx(EmptyMessage request, StreamObserver respo () -> rpcApiService.getWalletSolidityApi().getBurnTrx(request, responseObserver) ); } + + @Override + public void getTransactionFromPending(BytesMessage request, + StreamObserver responseObserver) { + walletOnSolidity.futureGet(() -> rpcApiService.getWalletSolidityApi() + .getTransactionFromPending(request, responseObserver) + ); + } + + @Override + public void getTransactionListFromPending(EmptyMessage request, + StreamObserver responseObserver) { + walletOnSolidity.futureGet(() -> rpcApiService.getWalletSolidityApi() + .getTransactionListFromPending(request, responseObserver) + ); + } } } diff --git a/framework/src/main/java/org/tron/core/services/interfaceOnSolidity/http/GetTransactionFromPendingOnSolidityServlet.java b/framework/src/main/java/org/tron/core/services/interfaceOnSolidity/http/GetTransactionFromPendingOnSolidityServlet.java new file mode 100644 index 00000000000..170a9f5fd6f --- /dev/null +++ b/framework/src/main/java/org/tron/core/services/interfaceOnSolidity/http/GetTransactionFromPendingOnSolidityServlet.java @@ -0,0 +1,27 @@ +package org.tron.core.services.interfaceOnSolidity.http; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.tron.core.services.http.GetBurnTrxServlet; +import org.tron.core.services.http.GetTransactionFromPendingServlet; +import org.tron.core.services.interfaceOnSolidity.WalletOnSolidity; + + +@Component +@Slf4j(topic = "API") +public class GetTransactionFromPendingOnSolidityServlet extends GetTransactionFromPendingServlet { + + @Autowired + private WalletOnSolidity walletOnSolidity; + + protected void doGet(HttpServletRequest request, HttpServletResponse response) { + walletOnSolidity.futureGet(() -> super.doGet(request, response)); + } + + protected void doPost(HttpServletRequest request, HttpServletResponse response) { + walletOnSolidity.futureGet(() -> super.doPost(request, response)); + } +} diff --git a/framework/src/main/java/org/tron/core/services/interfaceOnSolidity/http/GetTransactionListFromPendingOnSolidityServlet.java b/framework/src/main/java/org/tron/core/services/interfaceOnSolidity/http/GetTransactionListFromPendingOnSolidityServlet.java new file mode 100644 index 00000000000..50be012341c --- /dev/null +++ b/framework/src/main/java/org/tron/core/services/interfaceOnSolidity/http/GetTransactionListFromPendingOnSolidityServlet.java @@ -0,0 +1,29 @@ +package org.tron.core.services.interfaceOnSolidity.http; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.tron.core.services.http.GetBurnTrxServlet; +import org.tron.core.services.http.GetTransactionFromPendingServlet; +import org.tron.core.services.http.GetTransactionListFromPendingServlet; +import org.tron.core.services.interfaceOnSolidity.WalletOnSolidity; + + +@Component +@Slf4j(topic = "API") +public class GetTransactionListFromPendingOnSolidityServlet extends + GetTransactionListFromPendingServlet { + + @Autowired + private WalletOnSolidity walletOnSolidity; + + protected void doGet(HttpServletRequest request, HttpServletResponse response) { + walletOnSolidity.futureGet(() -> super.doGet(request, response)); + } + + protected void doPost(HttpServletRequest request, HttpServletResponse response) { + walletOnSolidity.futureGet(() -> super.doPost(request, response)); + } +} diff --git a/framework/src/main/java/org/tron/core/services/interfaceOnSolidity/http/solidity/HttpApiOnSolidityService.java b/framework/src/main/java/org/tron/core/services/interfaceOnSolidity/http/solidity/HttpApiOnSolidityService.java index 8165abbb275..a5e3de66f38 100644 --- a/framework/src/main/java/org/tron/core/services/interfaceOnSolidity/http/solidity/HttpApiOnSolidityService.java +++ b/framework/src/main/java/org/tron/core/services/interfaceOnSolidity/http/solidity/HttpApiOnSolidityService.java @@ -39,7 +39,9 @@ import org.tron.core.services.interfaceOnSolidity.http.GetPaginatedAssetIssueListOnSolidityServlet; import org.tron.core.services.interfaceOnSolidity.http.GetRewardOnSolidityServlet; import org.tron.core.services.interfaceOnSolidity.http.GetTransactionCountByBlockNumOnSolidityServlet; +import org.tron.core.services.interfaceOnSolidity.http.GetTransactionFromPendingOnSolidityServlet; import org.tron.core.services.interfaceOnSolidity.http.GetTransactionInfoByBlockNumOnSolidityServlet; +import org.tron.core.services.interfaceOnSolidity.http.GetTransactionListFromPendingOnSolidityServlet; import org.tron.core.services.interfaceOnSolidity.http.IsShieldedTRC20ContractNoteSpentOnSolidityServlet; import org.tron.core.services.interfaceOnSolidity.http.IsSpendOnSolidityServlet; import org.tron.core.services.interfaceOnSolidity.http.ListExchangesOnSolidityServlet; @@ -146,6 +148,10 @@ public class HttpApiOnSolidityService implements Service { @Autowired private LiteFnQueryHttpFilter liteFnQueryHttpFilter; + @Autowired + private GetTransactionFromPendingOnSolidityServlet getTransactionFromPendingOnSolidityServlet; + @Autowired + private GetTransactionListFromPendingOnSolidityServlet getTransactionListFromPendingOnSolidityServlet; @Override public void init() { @@ -244,6 +250,10 @@ public void start() { context.addServlet(new ServletHolder(getRewardServlet), "/walletsolidity/getReward"); context .addServlet(new ServletHolder(getBurnTrxOnSolidityServlet), "/walletsolidity/getburntrx"); + context.addServlet(new ServletHolder(getTransactionFromPendingOnSolidityServlet), + "/walletsolidity/gettransactionfrompending"); + context.addServlet(new ServletHolder(getTransactionListFromPendingOnSolidityServlet), + "/walletsolidity/gettransactionlistfrompending"); // filters the specified APIs // when node is lite fullnode and openHistoryQueryWhenLiteFN is false diff --git a/protocol/src/main/protos/api/api.proto b/protocol/src/main/protos/api/api.proto index c56ced503b0..c6e087cbee5 100644 --- a/protocol/src/main/protos/api/api.proto +++ b/protocol/src/main/protos/api/api.proto @@ -780,6 +780,13 @@ service Wallet { rpc GetBurnTrx (EmptyMessage) returns (NumberMessage) { } + + rpc GetTransactionFromPending (BytesMessage) returns (Transaction) { + } + + rpc GetTransactionListFromPending (EmptyMessage) returns (TransactionList) { + } + }; service WalletSolidity { @@ -965,6 +972,12 @@ service WalletSolidity { rpc GetBurnTrx (EmptyMessage) returns (NumberMessage) { } + + rpc GetTransactionFromPending (BytesMessage) returns (Transaction) { + } + + rpc GetTransactionListFromPending (EmptyMessage) returns (TransactionList) { + } }; service WalletExtension { From 2d353128bc8ac6049524deac9f0e591d89134300 Mon Sep 17 00:00:00 2001 From: lvs007 Date: Thu, 28 Jan 2021 17:32:37 +0800 Subject: [PATCH 06/32] add the get pending size interface --- .../main/java/org/tron/core/db/Manager.java | 6 ++++ .../java/org/tron/core/db/PendingManager.java | 6 +++- .../org/tron/core/services/RpcApiService.java | 24 +++++++++++++ .../services/http/FullNodeHttpApiService.java | 3 ++ .../services/http/GetPendingSizeServlet.java | 36 +++++++++++++++++++ .../interfaceOnPBFT/RpcApiServiceOnPBFT.java | 8 +++++ .../http/GetPendingSizeOnPBFTServlet.java | 27 ++++++++++++++ .../http/PBFT/HttpApiOnPBFTService.java | 6 +++- .../RpcApiServiceOnSolidity.java | 8 +++++ .../http/GetPendingSizeOnSolidityServlet.java | 27 ++++++++++++++ .../solidity/HttpApiOnSolidityService.java | 5 +++ protocol/src/main/protos/api/api.proto | 5 +++ 12 files changed, 159 insertions(+), 2 deletions(-) create mode 100644 framework/src/main/java/org/tron/core/services/http/GetPendingSizeServlet.java create mode 100644 framework/src/main/java/org/tron/core/services/interfaceOnPBFT/http/GetPendingSizeOnPBFTServlet.java create mode 100644 framework/src/main/java/org/tron/core/services/interfaceOnSolidity/http/GetPendingSizeOnSolidityServlet.java diff --git a/framework/src/main/java/org/tron/core/db/Manager.java b/framework/src/main/java/org/tron/core/db/Manager.java index 135bdeaf273..0d511192f9c 100644 --- a/framework/src/main/java/org/tron/core/db/Manager.java +++ b/framework/src/main/java/org/tron/core/db/Manager.java @@ -1812,4 +1812,10 @@ public Collection getTxListFromPending() { }); return result; } + + public long getPendingSize(){ + long value =getPendingTransactions().size() + getRePushTransactions().size() + + getPoppedTransactions().size(); + return value; + } } diff --git a/framework/src/main/java/org/tron/core/db/PendingManager.java b/framework/src/main/java/org/tron/core/db/PendingManager.java index d20783233a3..919d6baf370 100644 --- a/framework/src/main/java/org/tron/core/db/PendingManager.java +++ b/framework/src/main/java/org/tron/core/db/PendingManager.java @@ -24,7 +24,8 @@ public PendingManager(Manager db) { if (System.currentTimeMillis() - transactionCapsule.getTime() < timeout) { tmpTransactions.add(transactionCapsule); } else if (Args.getInstance().isOpenPrintLog()) { - logger.warn("[timeout] remove tx from pending, txId:{}", transactionCapsule.getTransactionId()); + logger.warn("[timeout] remove tx from pending, txId:{}", + transactionCapsule.getTransactionId()); } }); @@ -50,6 +51,9 @@ public void close() { txIteration(tx); } dbManager.getPoppedTransactions().clear(); + if (Args.getInstance().isOpenPrintLog()) { + logger.warn("pending tx size:{}", dbManager.getRePushTransactions().size()); + } } private void txIteration(TransactionCapsule tx) { diff --git a/framework/src/main/java/org/tron/core/services/RpcApiService.java b/framework/src/main/java/org/tron/core/services/RpcApiService.java index c404622cc56..856b27ca4af 100755 --- a/framework/src/main/java/org/tron/core/services/RpcApiService.java +++ b/framework/src/main/java/org/tron/core/services/RpcApiService.java @@ -912,6 +912,12 @@ public void getTransactionListFromPending(EmptyMessage request, StreamObserver responseObserver) { getTransactionListFromPendingCommon(request, responseObserver); } + + @Override + public void getPendingSize(EmptyMessage request, + StreamObserver responseObserver) { + getPendingSizeCommon(request, responseObserver); + } } /** @@ -2651,6 +2657,12 @@ public void getTransactionListFromPending(EmptyMessage request, StreamObserver responseObserver) { getTransactionListFromPendingCommon(request, responseObserver); } + + @Override + public void getPendingSize(EmptyMessage request, + StreamObserver responseObserver) { + getPendingSizeCommon(request, responseObserver); + } } public class MonitorApi extends MonitorGrpc.MonitorImplBase { @@ -2756,4 +2768,16 @@ public void getTransactionListFromPendingCommon(EmptyMessage request, } responseObserver.onCompleted(); } + + public void getPendingSizeCommon(EmptyMessage request, + StreamObserver responseObserver) { + try { + NumberMessage.Builder builder = NumberMessage.newBuilder(); + builder.setNum(dbManager.getPendingSize()); + responseObserver.onNext(builder.build()); + } catch (Exception e) { + responseObserver.onError(e); + } + responseObserver.onCompleted(); + } } diff --git a/framework/src/main/java/org/tron/core/services/http/FullNodeHttpApiService.java b/framework/src/main/java/org/tron/core/services/http/FullNodeHttpApiService.java index 7c0f372127d..19ed428e75b 100644 --- a/framework/src/main/java/org/tron/core/services/http/FullNodeHttpApiService.java +++ b/framework/src/main/java/org/tron/core/services/http/FullNodeHttpApiService.java @@ -282,6 +282,8 @@ public class FullNodeHttpApiService implements Service { private GetTransactionFromPendingServlet getTransactionFromPendingServlet; @Autowired private GetTransactionListFromPendingServlet getTransactionListFromPendingServlet; + @Autowired + private GetPendingSizeServlet getPendingSizeServlet; private static String getParamsFile(String fileName) { InputStream in = Thread.currentThread().getContextClassLoader() @@ -524,6 +526,7 @@ public void start() { context.addServlet(new ServletHolder(getBurnTrxServlet), "/wallet/getburntrx"); context.addServlet(new ServletHolder(getTransactionFromPendingServlet), "/wallet/gettransactionfrompending"); context.addServlet(new ServletHolder(getTransactionListFromPendingServlet), "/wallet/gettransactionlistfrompending"); + context.addServlet(new ServletHolder(getPendingSizeServlet), "/wallet/getpendingsize"); int maxHttpConnectNumber = Args.getInstance().getMaxHttpConnectNumber(); if (maxHttpConnectNumber > 0) { diff --git a/framework/src/main/java/org/tron/core/services/http/GetPendingSizeServlet.java b/framework/src/main/java/org/tron/core/services/http/GetPendingSizeServlet.java new file mode 100644 index 00000000000..7e1a5f71841 --- /dev/null +++ b/framework/src/main/java/org/tron/core/services/http/GetPendingSizeServlet.java @@ -0,0 +1,36 @@ +package org.tron.core.services.http; + +import java.io.IOException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.tron.core.db.Manager; + + +@Component +@Slf4j(topic = "API") +public class GetPendingSizeServlet extends RateLimiterServlet { + + @Autowired + private Manager manager; + + protected void doGet(HttpServletRequest request, HttpServletResponse response) { + try { + long value = manager.getPendingSize(); + response.getWriter().println("{\"pendingSize\": " + value + "}"); + } catch (Exception e) { + logger.error("", e); + try { + response.getWriter().println(Util.printErrorMsg(e)); + } catch (IOException ioe) { + logger.debug("IOException: {}", ioe.getMessage()); + } + } + } + + protected void doPost(HttpServletRequest request, HttpServletResponse response) { + doGet(request, response); + } +} diff --git a/framework/src/main/java/org/tron/core/services/interfaceOnPBFT/RpcApiServiceOnPBFT.java b/framework/src/main/java/org/tron/core/services/interfaceOnPBFT/RpcApiServiceOnPBFT.java index c719e6c3887..f085995b3b9 100755 --- a/framework/src/main/java/org/tron/core/services/interfaceOnPBFT/RpcApiServiceOnPBFT.java +++ b/framework/src/main/java/org/tron/core/services/interfaceOnPBFT/RpcApiServiceOnPBFT.java @@ -512,5 +512,13 @@ public void getTransactionListFromPending(EmptyMessage request, .getTransactionListFromPending(request, responseObserver) ); } + + @Override + public void getPendingSize(EmptyMessage request, + StreamObserver responseObserver) { + walletOnPBFT.futureGet(() -> rpcApiService.getWalletSolidityApi() + .getPendingSize(request, responseObserver) + ); + } } } diff --git a/framework/src/main/java/org/tron/core/services/interfaceOnPBFT/http/GetPendingSizeOnPBFTServlet.java b/framework/src/main/java/org/tron/core/services/interfaceOnPBFT/http/GetPendingSizeOnPBFTServlet.java new file mode 100644 index 00000000000..4c8f1076d33 --- /dev/null +++ b/framework/src/main/java/org/tron/core/services/interfaceOnPBFT/http/GetPendingSizeOnPBFTServlet.java @@ -0,0 +1,27 @@ +package org.tron.core.services.interfaceOnPBFT.http; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.tron.core.services.http.GetBurnTrxServlet; +import org.tron.core.services.http.GetPendingSizeServlet; +import org.tron.core.services.interfaceOnPBFT.WalletOnPBFT; + + +@Component +@Slf4j(topic = "API") +public class GetPendingSizeOnPBFTServlet extends GetPendingSizeServlet { + + @Autowired + private WalletOnPBFT walletOnPBFT; + + protected void doGet(HttpServletRequest request, HttpServletResponse response) { + walletOnPBFT.futureGet(() -> super.doGet(request, response)); + } + + protected void doPost(HttpServletRequest request, HttpServletResponse response) { + walletOnPBFT.futureGet(() -> super.doPost(request, response)); + } +} diff --git a/framework/src/main/java/org/tron/core/services/interfaceOnPBFT/http/PBFT/HttpApiOnPBFTService.java b/framework/src/main/java/org/tron/core/services/interfaceOnPBFT/http/PBFT/HttpApiOnPBFTService.java index 9c300e1b914..6dc81863b02 100644 --- a/framework/src/main/java/org/tron/core/services/interfaceOnPBFT/http/PBFT/HttpApiOnPBFTService.java +++ b/framework/src/main/java/org/tron/core/services/interfaceOnPBFT/http/PBFT/HttpApiOnPBFTService.java @@ -37,6 +37,7 @@ import org.tron.core.services.interfaceOnPBFT.http.GetNodeInfoOnPBFTServlet; import org.tron.core.services.interfaceOnPBFT.http.GetNowBlockOnPBFTServlet; import org.tron.core.services.interfaceOnPBFT.http.GetPaginatedAssetIssueListOnPBFTServlet; +import org.tron.core.services.interfaceOnPBFT.http.GetPendingSizeOnPBFTServlet; import org.tron.core.services.interfaceOnPBFT.http.GetRewardOnPBFTServlet; import org.tron.core.services.interfaceOnPBFT.http.GetTransactionCountByBlockNumOnPBFTServlet; import org.tron.core.services.interfaceOnPBFT.http.GetTransactionFromPendingOnPBFTServlet; @@ -150,6 +151,8 @@ public class HttpApiOnPBFTService implements Service { private GetTransactionFromPendingOnPBFTServlet getTransactionFromPendingOnPBFTServlet; @Autowired private GetTransactionListFromPendingOnPBFTServlet getTransactionListFromPendingOnPBFTServlet; + @Autowired + private GetPendingSizeOnPBFTServlet getPendingSizeOnPBFTServlet; @Override public void init() { @@ -239,6 +242,7 @@ public void start() { "/gettransactionfrompending"); context.addServlet(new ServletHolder(getTransactionListFromPendingOnPBFTServlet), "/gettransactionlistfrompending"); + context.addServlet(new ServletHolder(getPendingSizeOnPBFTServlet), "/getpendingsize"); int maxHttpConnectNumber = Args.getInstance().getMaxHttpConnectNumber(); if (maxHttpConnectNumber > 0) { @@ -248,7 +252,7 @@ public void start() { // filters the specified APIs // when node is lite fullnode and openHistoryQueryWhenLiteFN is false context.addFilter(new FilterHolder(liteFnQueryHttpFilter), "/*", - EnumSet.allOf(DispatcherType.class)); + EnumSet.allOf(DispatcherType.class)); server.start(); } catch (Exception e) { diff --git a/framework/src/main/java/org/tron/core/services/interfaceOnSolidity/RpcApiServiceOnSolidity.java b/framework/src/main/java/org/tron/core/services/interfaceOnSolidity/RpcApiServiceOnSolidity.java index 9dbbd25d156..e6cf5eeecba 100755 --- a/framework/src/main/java/org/tron/core/services/interfaceOnSolidity/RpcApiServiceOnSolidity.java +++ b/framework/src/main/java/org/tron/core/services/interfaceOnSolidity/RpcApiServiceOnSolidity.java @@ -508,5 +508,13 @@ public void getTransactionListFromPending(EmptyMessage request, .getTransactionListFromPending(request, responseObserver) ); } + + @Override + public void getPendingSize(EmptyMessage request, + StreamObserver responseObserver) { + walletOnSolidity.futureGet(() -> rpcApiService.getWalletSolidityApi() + .getPendingSize(request, responseObserver) + ); + } } } diff --git a/framework/src/main/java/org/tron/core/services/interfaceOnSolidity/http/GetPendingSizeOnSolidityServlet.java b/framework/src/main/java/org/tron/core/services/interfaceOnSolidity/http/GetPendingSizeOnSolidityServlet.java new file mode 100644 index 00000000000..cb6230abea9 --- /dev/null +++ b/framework/src/main/java/org/tron/core/services/interfaceOnSolidity/http/GetPendingSizeOnSolidityServlet.java @@ -0,0 +1,27 @@ +package org.tron.core.services.interfaceOnSolidity.http; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.tron.core.services.http.GetBurnTrxServlet; +import org.tron.core.services.http.GetPendingSizeServlet; +import org.tron.core.services.interfaceOnSolidity.WalletOnSolidity; + + +@Component +@Slf4j(topic = "API") +public class GetPendingSizeOnSolidityServlet extends GetPendingSizeServlet { + + @Autowired + private WalletOnSolidity walletOnSolidity; + + protected void doGet(HttpServletRequest request, HttpServletResponse response) { + walletOnSolidity.futureGet(() -> super.doGet(request, response)); + } + + protected void doPost(HttpServletRequest request, HttpServletResponse response) { + walletOnSolidity.futureGet(() -> super.doPost(request, response)); + } +} diff --git a/framework/src/main/java/org/tron/core/services/interfaceOnSolidity/http/solidity/HttpApiOnSolidityService.java b/framework/src/main/java/org/tron/core/services/interfaceOnSolidity/http/solidity/HttpApiOnSolidityService.java index a5e3de66f38..79dcbef1ff9 100644 --- a/framework/src/main/java/org/tron/core/services/interfaceOnSolidity/http/solidity/HttpApiOnSolidityService.java +++ b/framework/src/main/java/org/tron/core/services/interfaceOnSolidity/http/solidity/HttpApiOnSolidityService.java @@ -37,6 +37,7 @@ import org.tron.core.services.interfaceOnSolidity.http.GetNodeInfoOnSolidityServlet; import org.tron.core.services.interfaceOnSolidity.http.GetNowBlockOnSolidityServlet; import org.tron.core.services.interfaceOnSolidity.http.GetPaginatedAssetIssueListOnSolidityServlet; +import org.tron.core.services.interfaceOnSolidity.http.GetPendingSizeOnSolidityServlet; import org.tron.core.services.interfaceOnSolidity.http.GetRewardOnSolidityServlet; import org.tron.core.services.interfaceOnSolidity.http.GetTransactionCountByBlockNumOnSolidityServlet; import org.tron.core.services.interfaceOnSolidity.http.GetTransactionFromPendingOnSolidityServlet; @@ -152,6 +153,8 @@ public class HttpApiOnSolidityService implements Service { private GetTransactionFromPendingOnSolidityServlet getTransactionFromPendingOnSolidityServlet; @Autowired private GetTransactionListFromPendingOnSolidityServlet getTransactionListFromPendingOnSolidityServlet; + @Autowired + private GetPendingSizeOnSolidityServlet getPendingSizeOnSolidityServlet; @Override public void init() { @@ -254,6 +257,8 @@ public void start() { "/walletsolidity/gettransactionfrompending"); context.addServlet(new ServletHolder(getTransactionListFromPendingOnSolidityServlet), "/walletsolidity/gettransactionlistfrompending"); + context.addServlet(new ServletHolder(getPendingSizeOnSolidityServlet), + "/walletsolidity/getpendingsize"); // filters the specified APIs // when node is lite fullnode and openHistoryQueryWhenLiteFN is false diff --git a/protocol/src/main/protos/api/api.proto b/protocol/src/main/protos/api/api.proto index c6e087cbee5..8b026e74623 100644 --- a/protocol/src/main/protos/api/api.proto +++ b/protocol/src/main/protos/api/api.proto @@ -787,6 +787,8 @@ service Wallet { rpc GetTransactionListFromPending (EmptyMessage) returns (TransactionList) { } + rpc GetPendingSize (EmptyMessage) returns (NumberMessage) { + } }; service WalletSolidity { @@ -978,6 +980,9 @@ service WalletSolidity { rpc GetTransactionListFromPending (EmptyMessage) returns (TransactionList) { } + + rpc GetPendingSize (EmptyMessage) returns (NumberMessage) { + } }; service WalletExtension { From 03b280482847ed2e633e35d013fb38a8196a078d Mon Sep 17 00:00:00 2001 From: lvs007 Date: Mon, 1 Feb 2021 15:35:50 +0800 Subject: [PATCH 07/32] sort the transaction --- .../tron/core/capsule/TransactionCapsule.java | 3 ++ .../main/java/org/tron/core/db/Manager.java | 36 ++++++++++++++----- 2 files changed, 30 insertions(+), 9 deletions(-) diff --git a/chainbase/src/main/java/org/tron/core/capsule/TransactionCapsule.java b/chainbase/src/main/java/org/tron/core/capsule/TransactionCapsule.java index a389af23044..a1047c4176a 100755 --- a/chainbase/src/main/java/org/tron/core/capsule/TransactionCapsule.java +++ b/chainbase/src/main/java/org/tron/core/capsule/TransactionCapsule.java @@ -102,6 +102,9 @@ public class TransactionCapsule implements ProtoCapsule { @Getter @Setter private long time; + @Getter + @Setter + private long order; /** * constructor TransactionCapsule. diff --git a/framework/src/main/java/org/tron/core/db/Manager.java b/framework/src/main/java/org/tron/core/db/Manager.java index 0d511192f9c..8fda35577bc 100644 --- a/framework/src/main/java/org/tron/core/db/Manager.java +++ b/framework/src/main/java/org/tron/core/db/Manager.java @@ -18,6 +18,7 @@ import java.util.Arrays; import java.util.Collection; import java.util.Collections; +import java.util.Comparator; import java.util.HashSet; import java.util.Iterator; import java.util.LinkedList; @@ -33,6 +34,7 @@ import java.util.concurrent.Executors; import java.util.concurrent.Future; import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.PriorityBlockingQueue; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicLong; @@ -207,14 +209,14 @@ public class Manager { @Getter private ChainBaseManager chainBaseManager; // transactions cache - private List pendingTransactions; + private PriorityBlockingQueue pendingTransactions; @Getter private AtomicInteger shieldedTransInPendingCounts = new AtomicInteger(0); // transactions popped private List poppedTransactions = Collections.synchronizedList(Lists.newArrayList()); // the capacity is equal to Integer.MAX_VALUE default - private BlockingQueue rePushTransactions; + private PriorityBlockingQueue rePushTransactions; private BlockingQueue triggerCapsuleQueue; /** @@ -321,7 +323,7 @@ public BlockIndexStore getBlockIndexStore() { return chainBaseManager.getBlockIndexStore(); } - public List getPendingTransactions() { + public PriorityBlockingQueue getPendingTransactions() { return this.pendingTransactions; } @@ -341,6 +343,16 @@ public void stopRePushTriggerThread() { isRunTriggerCapsuleProcessThread = false; } + Comparator downComparator = (Comparator) (o1, o2) -> { + if (o1.getOrder() > o2.getOrder()) { + return -1; + } else if (o1.getOrder() < o2.getOrder()) { + return 1; + } else { + return 0; + } + }; + @PostConstruct public void init() { Message.setDynamicPropertiesStore(this.getDynamicPropertiesStore()); @@ -355,8 +367,8 @@ public void init() { this.setMerkleContainer( merkleContainer.createInstance(chainBaseManager.getMerkleTreeStore(), chainBaseManager.getMerkleTreeIndexStore())); - this.pendingTransactions = Collections.synchronizedList(Lists.newArrayList()); - this.rePushTransactions = new LinkedBlockingQueue<>(); + this.pendingTransactions = new PriorityBlockingQueue(2000, downComparator); + this.rePushTransactions = new PriorityBlockingQueue<>(2000, downComparator); this.triggerCapsuleQueue = new LinkedBlockingQueue<>(); chainBaseManager.setMerkleContainer(getMerkleContainer()); chainBaseManager.setMortgageService(mortgageService); @@ -1184,7 +1196,8 @@ public TransactionInfo processTransaction(final TransactionCapsule trxCap, Block trace.getRuntimeResult().getResultCode().name()); chainBaseManager.getBalanceTraceStore().resetCurrentTransactionTrace(); } - + //set the sort order + trxCap.setOrder(transactionInfo.getFee()); return transactionInfo.getInstance(); } @@ -1223,8 +1236,13 @@ public synchronized BlockCapsule generateBlock(Miner miner, long blockTime, long boolean fromPending = false; TransactionCapsule trx; if (iterator.hasNext()) { - fromPending = true; trx = iterator.next(); + TransactionCapsule trxRepush = rePushTransactions.peek(); + if (trxRepush != null || trx.getOrder() >= trxRepush.getOrder()) { + fromPending = true; + } else { + trx = rePushTransactions.poll(); + } } else { trx = rePushTransactions.poll(); } @@ -1813,8 +1831,8 @@ public Collection getTxListFromPending() { return result; } - public long getPendingSize(){ - long value =getPendingTransactions().size() + getRePushTransactions().size() + public long getPendingSize() { + long value = getPendingTransactions().size() + getRePushTransactions().size() + getPoppedTransactions().size(); return value; } From f5eb45335131d53d670cd2b44012b6090e8427ce Mon Sep 17 00:00:00 2001 From: lvs007 Date: Mon, 1 Feb 2021 17:45:46 +0800 Subject: [PATCH 08/32] sort the transaction --- .../src/main/java/org/tron/core/db/Manager.java | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/framework/src/main/java/org/tron/core/db/Manager.java b/framework/src/main/java/org/tron/core/db/Manager.java index 8fda35577bc..0768836550f 100644 --- a/framework/src/main/java/org/tron/core/db/Manager.java +++ b/framework/src/main/java/org/tron/core/db/Manager.java @@ -20,7 +20,6 @@ import java.util.Collections; import java.util.Comparator; import java.util.HashSet; -import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.Objects; @@ -1231,14 +1230,13 @@ public synchronized BlockCapsule generateBlock(Miner miner, long blockTime, long Set accountSet = new HashSet<>(); AtomicInteger shieldedTransCounts = new AtomicInteger(0); - Iterator iterator = pendingTransactions.iterator(); - while (iterator.hasNext() || rePushTransactions.size() > 0) { + while (pendingTransactions.size() > 0 || rePushTransactions.size() > 0) { boolean fromPending = false; TransactionCapsule trx; - if (iterator.hasNext()) { - trx = iterator.next(); + if (pendingTransactions.size() > 0) { + trx = pendingTransactions.peek(); TransactionCapsule trxRepush = rePushTransactions.peek(); - if (trxRepush != null || trx.getOrder() >= trxRepush.getOrder()) { + if (trxRepush == null || trx.getOrder() >= trxRepush.getOrder()) { fromPending = true; } else { trx = rePushTransactions.poll(); @@ -1288,7 +1286,7 @@ public synchronized BlockCapsule generateBlock(Miner miner, long blockTime, long transactionRetCapsule.addTransactionInfo(result); } if (fromPending) { - iterator.remove(); + pendingTransactions.poll(); } } catch (Exception e) { logger.error("Process trx {} failed when generating block: {}", trx.getTransactionId(), From 61732ca1eff2179b67c142e0504216836a7143ea Mon Sep 17 00:00:00 2001 From: lvs007 Date: Mon, 1 Feb 2021 18:17:17 +0800 Subject: [PATCH 09/32] remove the pbft and solidity interface --- .../interfaceOnPBFT/RpcApiServiceOnPBFT.java | 24 --------------- .../http/GetPendingSizeOnPBFTServlet.java | 27 ----------------- ...etTransactionFromPendingOnPBFTServlet.java | 27 ----------------- ...ansactionListFromPendingOnPBFTServlet.java | 28 ------------------ .../http/PBFT/HttpApiOnPBFTService.java | 14 --------- .../RpcApiServiceOnSolidity.java | 24 --------------- .../http/GetPendingSizeOnSolidityServlet.java | 27 ----------------- ...ansactionFromPendingOnSolidityServlet.java | 27 ----------------- ...ctionListFromPendingOnSolidityServlet.java | 29 ------------------- .../solidity/HttpApiOnSolidityService.java | 15 ---------- 10 files changed, 242 deletions(-) delete mode 100644 framework/src/main/java/org/tron/core/services/interfaceOnPBFT/http/GetPendingSizeOnPBFTServlet.java delete mode 100644 framework/src/main/java/org/tron/core/services/interfaceOnPBFT/http/GetTransactionFromPendingOnPBFTServlet.java delete mode 100644 framework/src/main/java/org/tron/core/services/interfaceOnPBFT/http/GetTransactionListFromPendingOnPBFTServlet.java delete mode 100644 framework/src/main/java/org/tron/core/services/interfaceOnSolidity/http/GetPendingSizeOnSolidityServlet.java delete mode 100644 framework/src/main/java/org/tron/core/services/interfaceOnSolidity/http/GetTransactionFromPendingOnSolidityServlet.java delete mode 100644 framework/src/main/java/org/tron/core/services/interfaceOnSolidity/http/GetTransactionListFromPendingOnSolidityServlet.java diff --git a/framework/src/main/java/org/tron/core/services/interfaceOnPBFT/RpcApiServiceOnPBFT.java b/framework/src/main/java/org/tron/core/services/interfaceOnPBFT/RpcApiServiceOnPBFT.java index f085995b3b9..669414fca35 100755 --- a/framework/src/main/java/org/tron/core/services/interfaceOnPBFT/RpcApiServiceOnPBFT.java +++ b/framework/src/main/java/org/tron/core/services/interfaceOnPBFT/RpcApiServiceOnPBFT.java @@ -30,7 +30,6 @@ import org.tron.api.GrpcAPI.PaginatedMessage; import org.tron.api.GrpcAPI.SpendResult; import org.tron.api.GrpcAPI.TransactionExtention; -import org.tron.api.GrpcAPI.TransactionList; import org.tron.api.GrpcAPI.WitnessList; import org.tron.api.WalletSolidityGrpc.WalletSolidityImplBase; import org.tron.common.application.Service; @@ -497,28 +496,5 @@ public void getBurnTrx(EmptyMessage request, StreamObserver respo ); } - @Override - public void getTransactionFromPending(BytesMessage request, - StreamObserver responseObserver) { - walletOnPBFT.futureGet(() -> rpcApiService.getWalletSolidityApi() - .getTransactionFromPending(request, responseObserver) - ); - } - - @Override - public void getTransactionListFromPending(EmptyMessage request, - StreamObserver responseObserver) { - walletOnPBFT.futureGet(() -> rpcApiService.getWalletSolidityApi() - .getTransactionListFromPending(request, responseObserver) - ); - } - - @Override - public void getPendingSize(EmptyMessage request, - StreamObserver responseObserver) { - walletOnPBFT.futureGet(() -> rpcApiService.getWalletSolidityApi() - .getPendingSize(request, responseObserver) - ); - } } } diff --git a/framework/src/main/java/org/tron/core/services/interfaceOnPBFT/http/GetPendingSizeOnPBFTServlet.java b/framework/src/main/java/org/tron/core/services/interfaceOnPBFT/http/GetPendingSizeOnPBFTServlet.java deleted file mode 100644 index 4c8f1076d33..00000000000 --- a/framework/src/main/java/org/tron/core/services/interfaceOnPBFT/http/GetPendingSizeOnPBFTServlet.java +++ /dev/null @@ -1,27 +0,0 @@ -package org.tron.core.services.interfaceOnPBFT.http; - -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; -import org.tron.core.services.http.GetBurnTrxServlet; -import org.tron.core.services.http.GetPendingSizeServlet; -import org.tron.core.services.interfaceOnPBFT.WalletOnPBFT; - - -@Component -@Slf4j(topic = "API") -public class GetPendingSizeOnPBFTServlet extends GetPendingSizeServlet { - - @Autowired - private WalletOnPBFT walletOnPBFT; - - protected void doGet(HttpServletRequest request, HttpServletResponse response) { - walletOnPBFT.futureGet(() -> super.doGet(request, response)); - } - - protected void doPost(HttpServletRequest request, HttpServletResponse response) { - walletOnPBFT.futureGet(() -> super.doPost(request, response)); - } -} diff --git a/framework/src/main/java/org/tron/core/services/interfaceOnPBFT/http/GetTransactionFromPendingOnPBFTServlet.java b/framework/src/main/java/org/tron/core/services/interfaceOnPBFT/http/GetTransactionFromPendingOnPBFTServlet.java deleted file mode 100644 index f82a2458a10..00000000000 --- a/framework/src/main/java/org/tron/core/services/interfaceOnPBFT/http/GetTransactionFromPendingOnPBFTServlet.java +++ /dev/null @@ -1,27 +0,0 @@ -package org.tron.core.services.interfaceOnPBFT.http; - -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; -import org.tron.core.services.http.GetBurnTrxServlet; -import org.tron.core.services.http.GetTransactionFromPendingServlet; -import org.tron.core.services.interfaceOnPBFT.WalletOnPBFT; - - -@Component -@Slf4j(topic = "API") -public class GetTransactionFromPendingOnPBFTServlet extends GetTransactionFromPendingServlet { - - @Autowired - private WalletOnPBFT walletOnPBFT; - - protected void doGet(HttpServletRequest request, HttpServletResponse response) { - walletOnPBFT.futureGet(() -> super.doGet(request, response)); - } - - protected void doPost(HttpServletRequest request, HttpServletResponse response) { - walletOnPBFT.futureGet(() -> super.doPost(request, response)); - } -} diff --git a/framework/src/main/java/org/tron/core/services/interfaceOnPBFT/http/GetTransactionListFromPendingOnPBFTServlet.java b/framework/src/main/java/org/tron/core/services/interfaceOnPBFT/http/GetTransactionListFromPendingOnPBFTServlet.java deleted file mode 100644 index a032b650c9d..00000000000 --- a/framework/src/main/java/org/tron/core/services/interfaceOnPBFT/http/GetTransactionListFromPendingOnPBFTServlet.java +++ /dev/null @@ -1,28 +0,0 @@ -package org.tron.core.services.interfaceOnPBFT.http; - -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; -import org.tron.core.services.http.GetBurnTrxServlet; -import org.tron.core.services.http.GetTransactionListFromPendingServlet; -import org.tron.core.services.interfaceOnPBFT.WalletOnPBFT; - - -@Component -@Slf4j(topic = "API") -public class GetTransactionListFromPendingOnPBFTServlet extends - GetTransactionListFromPendingServlet { - - @Autowired - private WalletOnPBFT walletOnPBFT; - - protected void doGet(HttpServletRequest request, HttpServletResponse response) { - walletOnPBFT.futureGet(() -> super.doGet(request, response)); - } - - protected void doPost(HttpServletRequest request, HttpServletResponse response) { - walletOnPBFT.futureGet(() -> super.doPost(request, response)); - } -} diff --git a/framework/src/main/java/org/tron/core/services/interfaceOnPBFT/http/PBFT/HttpApiOnPBFTService.java b/framework/src/main/java/org/tron/core/services/interfaceOnPBFT/http/PBFT/HttpApiOnPBFTService.java index 6dc81863b02..ad6d498e38e 100644 --- a/framework/src/main/java/org/tron/core/services/interfaceOnPBFT/http/PBFT/HttpApiOnPBFTService.java +++ b/framework/src/main/java/org/tron/core/services/interfaceOnPBFT/http/PBFT/HttpApiOnPBFTService.java @@ -37,11 +37,8 @@ import org.tron.core.services.interfaceOnPBFT.http.GetNodeInfoOnPBFTServlet; import org.tron.core.services.interfaceOnPBFT.http.GetNowBlockOnPBFTServlet; import org.tron.core.services.interfaceOnPBFT.http.GetPaginatedAssetIssueListOnPBFTServlet; -import org.tron.core.services.interfaceOnPBFT.http.GetPendingSizeOnPBFTServlet; import org.tron.core.services.interfaceOnPBFT.http.GetRewardOnPBFTServlet; import org.tron.core.services.interfaceOnPBFT.http.GetTransactionCountByBlockNumOnPBFTServlet; -import org.tron.core.services.interfaceOnPBFT.http.GetTransactionFromPendingOnPBFTServlet; -import org.tron.core.services.interfaceOnPBFT.http.GetTransactionListFromPendingOnPBFTServlet; import org.tron.core.services.interfaceOnPBFT.http.IsShieldedTRC20ContractNoteSpentOnPBFTServlet; import org.tron.core.services.interfaceOnPBFT.http.IsSpendOnPBFTServlet; import org.tron.core.services.interfaceOnPBFT.http.ListExchangesOnPBFTServlet; @@ -147,12 +144,6 @@ public class HttpApiOnPBFTService implements Service { isShieldedTRC20ContractNoteSpentOnPBFTServlet; @Autowired private GetBurnTrxOnPBFTServlet getBurnTrxOnPBFTServlet; - @Autowired - private GetTransactionFromPendingOnPBFTServlet getTransactionFromPendingOnPBFTServlet; - @Autowired - private GetTransactionListFromPendingOnPBFTServlet getTransactionListFromPendingOnPBFTServlet; - @Autowired - private GetPendingSizeOnPBFTServlet getPendingSizeOnPBFTServlet; @Override public void init() { @@ -238,11 +229,6 @@ public void start() { "/isshieldedtrc20contractnotespent"); context.addServlet(new ServletHolder(getBurnTrxOnPBFTServlet), "/getburntrx"); - context.addServlet(new ServletHolder(getTransactionFromPendingOnPBFTServlet), - "/gettransactionfrompending"); - context.addServlet(new ServletHolder(getTransactionListFromPendingOnPBFTServlet), - "/gettransactionlistfrompending"); - context.addServlet(new ServletHolder(getPendingSizeOnPBFTServlet), "/getpendingsize"); int maxHttpConnectNumber = Args.getInstance().getMaxHttpConnectNumber(); if (maxHttpConnectNumber > 0) { diff --git a/framework/src/main/java/org/tron/core/services/interfaceOnSolidity/RpcApiServiceOnSolidity.java b/framework/src/main/java/org/tron/core/services/interfaceOnSolidity/RpcApiServiceOnSolidity.java index e6cf5eeecba..05f5bc2bbed 100755 --- a/framework/src/main/java/org/tron/core/services/interfaceOnSolidity/RpcApiServiceOnSolidity.java +++ b/framework/src/main/java/org/tron/core/services/interfaceOnSolidity/RpcApiServiceOnSolidity.java @@ -29,7 +29,6 @@ import org.tron.api.GrpcAPI.SpendResult; import org.tron.api.GrpcAPI.TransactionExtention; import org.tron.api.GrpcAPI.TransactionInfoList; -import org.tron.api.GrpcAPI.TransactionList; import org.tron.api.GrpcAPI.WitnessList; import org.tron.api.WalletSolidityGrpc.WalletSolidityImplBase; import org.tron.common.application.Service; @@ -493,28 +492,5 @@ public void getBurnTrx(EmptyMessage request, StreamObserver respo ); } - @Override - public void getTransactionFromPending(BytesMessage request, - StreamObserver responseObserver) { - walletOnSolidity.futureGet(() -> rpcApiService.getWalletSolidityApi() - .getTransactionFromPending(request, responseObserver) - ); - } - - @Override - public void getTransactionListFromPending(EmptyMessage request, - StreamObserver responseObserver) { - walletOnSolidity.futureGet(() -> rpcApiService.getWalletSolidityApi() - .getTransactionListFromPending(request, responseObserver) - ); - } - - @Override - public void getPendingSize(EmptyMessage request, - StreamObserver responseObserver) { - walletOnSolidity.futureGet(() -> rpcApiService.getWalletSolidityApi() - .getPendingSize(request, responseObserver) - ); - } } } diff --git a/framework/src/main/java/org/tron/core/services/interfaceOnSolidity/http/GetPendingSizeOnSolidityServlet.java b/framework/src/main/java/org/tron/core/services/interfaceOnSolidity/http/GetPendingSizeOnSolidityServlet.java deleted file mode 100644 index cb6230abea9..00000000000 --- a/framework/src/main/java/org/tron/core/services/interfaceOnSolidity/http/GetPendingSizeOnSolidityServlet.java +++ /dev/null @@ -1,27 +0,0 @@ -package org.tron.core.services.interfaceOnSolidity.http; - -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; -import org.tron.core.services.http.GetBurnTrxServlet; -import org.tron.core.services.http.GetPendingSizeServlet; -import org.tron.core.services.interfaceOnSolidity.WalletOnSolidity; - - -@Component -@Slf4j(topic = "API") -public class GetPendingSizeOnSolidityServlet extends GetPendingSizeServlet { - - @Autowired - private WalletOnSolidity walletOnSolidity; - - protected void doGet(HttpServletRequest request, HttpServletResponse response) { - walletOnSolidity.futureGet(() -> super.doGet(request, response)); - } - - protected void doPost(HttpServletRequest request, HttpServletResponse response) { - walletOnSolidity.futureGet(() -> super.doPost(request, response)); - } -} diff --git a/framework/src/main/java/org/tron/core/services/interfaceOnSolidity/http/GetTransactionFromPendingOnSolidityServlet.java b/framework/src/main/java/org/tron/core/services/interfaceOnSolidity/http/GetTransactionFromPendingOnSolidityServlet.java deleted file mode 100644 index 170a9f5fd6f..00000000000 --- a/framework/src/main/java/org/tron/core/services/interfaceOnSolidity/http/GetTransactionFromPendingOnSolidityServlet.java +++ /dev/null @@ -1,27 +0,0 @@ -package org.tron.core.services.interfaceOnSolidity.http; - -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; -import org.tron.core.services.http.GetBurnTrxServlet; -import org.tron.core.services.http.GetTransactionFromPendingServlet; -import org.tron.core.services.interfaceOnSolidity.WalletOnSolidity; - - -@Component -@Slf4j(topic = "API") -public class GetTransactionFromPendingOnSolidityServlet extends GetTransactionFromPendingServlet { - - @Autowired - private WalletOnSolidity walletOnSolidity; - - protected void doGet(HttpServletRequest request, HttpServletResponse response) { - walletOnSolidity.futureGet(() -> super.doGet(request, response)); - } - - protected void doPost(HttpServletRequest request, HttpServletResponse response) { - walletOnSolidity.futureGet(() -> super.doPost(request, response)); - } -} diff --git a/framework/src/main/java/org/tron/core/services/interfaceOnSolidity/http/GetTransactionListFromPendingOnSolidityServlet.java b/framework/src/main/java/org/tron/core/services/interfaceOnSolidity/http/GetTransactionListFromPendingOnSolidityServlet.java deleted file mode 100644 index 50be012341c..00000000000 --- a/framework/src/main/java/org/tron/core/services/interfaceOnSolidity/http/GetTransactionListFromPendingOnSolidityServlet.java +++ /dev/null @@ -1,29 +0,0 @@ -package org.tron.core.services.interfaceOnSolidity.http; - -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; -import org.tron.core.services.http.GetBurnTrxServlet; -import org.tron.core.services.http.GetTransactionFromPendingServlet; -import org.tron.core.services.http.GetTransactionListFromPendingServlet; -import org.tron.core.services.interfaceOnSolidity.WalletOnSolidity; - - -@Component -@Slf4j(topic = "API") -public class GetTransactionListFromPendingOnSolidityServlet extends - GetTransactionListFromPendingServlet { - - @Autowired - private WalletOnSolidity walletOnSolidity; - - protected void doGet(HttpServletRequest request, HttpServletResponse response) { - walletOnSolidity.futureGet(() -> super.doGet(request, response)); - } - - protected void doPost(HttpServletRequest request, HttpServletResponse response) { - walletOnSolidity.futureGet(() -> super.doPost(request, response)); - } -} diff --git a/framework/src/main/java/org/tron/core/services/interfaceOnSolidity/http/solidity/HttpApiOnSolidityService.java b/framework/src/main/java/org/tron/core/services/interfaceOnSolidity/http/solidity/HttpApiOnSolidityService.java index 79dcbef1ff9..8165abbb275 100644 --- a/framework/src/main/java/org/tron/core/services/interfaceOnSolidity/http/solidity/HttpApiOnSolidityService.java +++ b/framework/src/main/java/org/tron/core/services/interfaceOnSolidity/http/solidity/HttpApiOnSolidityService.java @@ -37,12 +37,9 @@ import org.tron.core.services.interfaceOnSolidity.http.GetNodeInfoOnSolidityServlet; import org.tron.core.services.interfaceOnSolidity.http.GetNowBlockOnSolidityServlet; import org.tron.core.services.interfaceOnSolidity.http.GetPaginatedAssetIssueListOnSolidityServlet; -import org.tron.core.services.interfaceOnSolidity.http.GetPendingSizeOnSolidityServlet; import org.tron.core.services.interfaceOnSolidity.http.GetRewardOnSolidityServlet; import org.tron.core.services.interfaceOnSolidity.http.GetTransactionCountByBlockNumOnSolidityServlet; -import org.tron.core.services.interfaceOnSolidity.http.GetTransactionFromPendingOnSolidityServlet; import org.tron.core.services.interfaceOnSolidity.http.GetTransactionInfoByBlockNumOnSolidityServlet; -import org.tron.core.services.interfaceOnSolidity.http.GetTransactionListFromPendingOnSolidityServlet; import org.tron.core.services.interfaceOnSolidity.http.IsShieldedTRC20ContractNoteSpentOnSolidityServlet; import org.tron.core.services.interfaceOnSolidity.http.IsSpendOnSolidityServlet; import org.tron.core.services.interfaceOnSolidity.http.ListExchangesOnSolidityServlet; @@ -149,12 +146,6 @@ public class HttpApiOnSolidityService implements Service { @Autowired private LiteFnQueryHttpFilter liteFnQueryHttpFilter; - @Autowired - private GetTransactionFromPendingOnSolidityServlet getTransactionFromPendingOnSolidityServlet; - @Autowired - private GetTransactionListFromPendingOnSolidityServlet getTransactionListFromPendingOnSolidityServlet; - @Autowired - private GetPendingSizeOnSolidityServlet getPendingSizeOnSolidityServlet; @Override public void init() { @@ -253,12 +244,6 @@ public void start() { context.addServlet(new ServletHolder(getRewardServlet), "/walletsolidity/getReward"); context .addServlet(new ServletHolder(getBurnTrxOnSolidityServlet), "/walletsolidity/getburntrx"); - context.addServlet(new ServletHolder(getTransactionFromPendingOnSolidityServlet), - "/walletsolidity/gettransactionfrompending"); - context.addServlet(new ServletHolder(getTransactionListFromPendingOnSolidityServlet), - "/walletsolidity/gettransactionlistfrompending"); - context.addServlet(new ServletHolder(getPendingSizeOnSolidityServlet), - "/walletsolidity/getpendingsize"); // filters the specified APIs // when node is lite fullnode and openHistoryQueryWhenLiteFN is false From d0e0ffe20985d56b0449b63bfa99d3b55a4cf2dc Mon Sep 17 00:00:00 2001 From: lvs007 Date: Tue, 2 Feb 2021 16:47:24 +0800 Subject: [PATCH 10/32] Optimized code --- framework/src/main/java/org/tron/core/db/Manager.java | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/framework/src/main/java/org/tron/core/db/Manager.java b/framework/src/main/java/org/tron/core/db/Manager.java index 0768836550f..a41bdfd5132 100644 --- a/framework/src/main/java/org/tron/core/db/Manager.java +++ b/framework/src/main/java/org/tron/core/db/Manager.java @@ -342,15 +342,7 @@ public void stopRePushTriggerThread() { isRunTriggerCapsuleProcessThread = false; } - Comparator downComparator = (Comparator) (o1, o2) -> { - if (o1.getOrder() > o2.getOrder()) { - return -1; - } else if (o1.getOrder() < o2.getOrder()) { - return 1; - } else { - return 0; - } - }; + Comparator downComparator = (Comparator) (o1, o2) -> Long.compare(o2.getOrder(), o1.getOrder()); @PostConstruct public void init() { From 3d4b5aae911100fc0a2ebb4bee98941038b32c1a Mon Sep 17 00:00:00 2001 From: lvs007 Date: Tue, 2 Feb 2021 17:23:20 +0800 Subject: [PATCH 11/32] Optimized code --- .../java/org/tron/core/db/PendingManager.java | 34 +++---------------- 1 file changed, 5 insertions(+), 29 deletions(-) diff --git a/framework/src/main/java/org/tron/core/db/PendingManager.java b/framework/src/main/java/org/tron/core/db/PendingManager.java index 919d6baf370..39da39ddd30 100644 --- a/framework/src/main/java/org/tron/core/db/PendingManager.java +++ b/framework/src/main/java/org/tron/core/db/PendingManager.java @@ -1,40 +1,17 @@ package org.tron.core.db; -import java.util.ArrayList; -import java.util.List; -import lombok.Getter; import lombok.extern.slf4j.Slf4j; import org.tron.core.capsule.TransactionCapsule; import org.tron.core.config.args.Args; -import org.tron.core.db.TransactionTrace.TimeResultType; -import org.tron.core.metrics.MetricsKey; -import org.tron.core.metrics.MetricsUtil; @Slf4j(topic = "DB") public class PendingManager implements AutoCloseable { - @Getter - private List tmpTransactions = new ArrayList<>(); private Manager dbManager; private long timeout = Args.getInstance().getPendingTransactionTimeout(); public PendingManager(Manager db) { this.dbManager = db; - db.getPendingTransactions().forEach(transactionCapsule -> { - if (System.currentTimeMillis() - transactionCapsule.getTime() < timeout) { - tmpTransactions.add(transactionCapsule); - } else if (Args.getInstance().isOpenPrintLog()) { - logger.warn("[timeout] remove tx from pending, txId:{}", - transactionCapsule.getTransactionId()); - } - }); - - if (db.getPendingTransactions().size() > tmpTransactions.size()) { - MetricsUtil.meterMark(MetricsKey.BLOCKCHAIN_MISSED_TRANSACTION, - db.getPendingTransactions().size() - tmpTransactions.size()); - } - - db.getPendingTransactions().clear(); db.getSession().reset(); db.getShieldedTransInPendingCounts().set(0); } @@ -42,12 +19,12 @@ public PendingManager(Manager db) { @Override public void close() { - for (TransactionCapsule tx : tmpTransactions) { + for (TransactionCapsule tx : dbManager.getPendingTransactions()) { txIteration(tx); } - tmpTransactions.clear(); - + dbManager.getPendingTransactions().clear(); for (TransactionCapsule tx : dbManager.getPoppedTransactions()) { + tx.setTime(0L); txIteration(tx); } dbManager.getPoppedTransactions().clear(); @@ -58,11 +35,10 @@ public void close() { private void txIteration(TransactionCapsule tx) { try { - if (tx.getTrxTrace() != null - && tx.getTrxTrace().getTimeResultType().equals(TimeResultType.NORMAL)) { + if (System.currentTimeMillis() - tx.getTime() < timeout) { dbManager.getRePushTransactions().put(tx); } else if (Args.getInstance().isOpenPrintLog()) { - logger.warn("remove tx from pending, txId:{}", tx.getTransactionId()); + logger.warn("[timeout] remove tx from pending, txId:{}", tx.getTransactionId()); } } catch (InterruptedException e) { logger.error(e.getMessage()); From 8e3c8f34750fed001320d665e54560a3d8270d55 Mon Sep 17 00:00:00 2001 From: lvs007 Date: Tue, 2 Feb 2021 17:25:24 +0800 Subject: [PATCH 12/32] Optimized code --- framework/src/main/java/org/tron/core/db/PendingManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/src/main/java/org/tron/core/db/PendingManager.java b/framework/src/main/java/org/tron/core/db/PendingManager.java index 39da39ddd30..e7ef3ec077e 100644 --- a/framework/src/main/java/org/tron/core/db/PendingManager.java +++ b/framework/src/main/java/org/tron/core/db/PendingManager.java @@ -24,7 +24,7 @@ public void close() { } dbManager.getPendingTransactions().clear(); for (TransactionCapsule tx : dbManager.getPoppedTransactions()) { - tx.setTime(0L); + tx.setTime(System.currentTimeMillis()); txIteration(tx); } dbManager.getPoppedTransactions().clear(); From 2ad4c6865f315035f3fdb485acebd9168e185d4e Mon Sep 17 00:00:00 2001 From: lvs007 Date: Tue, 2 Feb 2021 18:02:05 +0800 Subject: [PATCH 13/32] Optimized code --- framework/src/main/java/org/tron/core/db/Manager.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/framework/src/main/java/org/tron/core/db/Manager.java b/framework/src/main/java/org/tron/core/db/Manager.java index a41bdfd5132..65d41302c28 100644 --- a/framework/src/main/java/org/tron/core/db/Manager.java +++ b/framework/src/main/java/org/tron/core/db/Manager.java @@ -342,7 +342,8 @@ public void stopRePushTriggerThread() { isRunTriggerCapsuleProcessThread = false; } - Comparator downComparator = (Comparator) (o1, o2) -> Long.compare(o2.getOrder(), o1.getOrder()); + Comparator downComparator = (Comparator) (o1, o2) -> Long + .compare(o2.getOrder(), o1.getOrder()); @PostConstruct public void init() { @@ -1792,8 +1793,9 @@ public Boolean call() throws ValidateSignatureException { public TransactionCapsule getTxFromPending(String txId) { AtomicReference transactionCapsule = new AtomicReference<>(); + Sha256Hash txHash = Sha256Hash.wrap(ByteArray.fromHexString(txId)); pendingTransactions.forEach(tx -> { - if (tx.getTransactionId().toString().equals(txId)) { + if (tx.getTransactionId().equals(txHash)) { transactionCapsule.set(tx); return; } @@ -1802,7 +1804,7 @@ public TransactionCapsule getTxFromPending(String txId) { return transactionCapsule.get(); } rePushTransactions.forEach(tx -> { - if (tx.getTransactionId().toString().equals(txId)) { + if (tx.getTransactionId().equals(txHash)) { transactionCapsule.set(tx); return; } From cf8820fa0245f340a5689cd8d0d752930006fb27 Mon Sep 17 00:00:00 2001 From: pangpangfeng <7577288@qq.com> Date: Wed, 3 Feb 2021 16:51:54 +0800 Subject: [PATCH 14/32] Daily build case adapt sort pending --- .../stest/tron/wallet/dailybuild/manual/RequireException.java | 4 ++-- .../dailybuild/tvmnewcommand/create2/Create2Test001.java | 1 + .../tvmnewcommand/shiftcommand/ShiftCommand006.java | 1 + .../tvmnewcommand/transferfailed/TransferFailed001.java | 1 + .../tvmnewcommand/transferfailed/TransferFailed002.java | 1 + .../tvmnewcommand/transferfailed/TransferFailed004.java | 1 + .../dailybuild/tvmnewcommand/tryCatch/tryCatchTest001.java | 1 + .../dailybuild/tvmnewcommand/tryCatch/tryCatchTest002.java | 1 + 8 files changed, 9 insertions(+), 2 deletions(-) diff --git a/framework/src/test/java/stest/tron/wallet/dailybuild/manual/RequireException.java b/framework/src/test/java/stest/tron/wallet/dailybuild/manual/RequireException.java index 4880ffc6e53..74940a837ae 100644 --- a/framework/src/test/java/stest/tron/wallet/dailybuild/manual/RequireException.java +++ b/framework/src/test/java/stest/tron/wallet/dailybuild/manual/RequireException.java @@ -85,11 +85,11 @@ public void test1TestRequireContract() { testKeyForAssetIssue016 = ByteArray.toHexString(ecKey1.getPrivKeyBytes()); logger.info(Long.toString(PublicMethed.queryAccount(testNetAccountKey, blockingStubFull) .getBalance())); - PublicMethed.waitProduceNextBlock(blockingStubFull); + Assert.assertTrue(PublicMethed .sendcoin(asset016Address, 1000000000L, testNetAccountAddress, testNetAccountKey, blockingStubFull)); - + PublicMethed.waitProduceNextBlock(blockingStubFull); String filePath = "src/test/resources/soliditycode/requireExceptiontest1TestRequireContract.sol"; String contractName = "TestThrowsContract"; diff --git a/framework/src/test/java/stest/tron/wallet/dailybuild/tvmnewcommand/create2/Create2Test001.java b/framework/src/test/java/stest/tron/wallet/dailybuild/tvmnewcommand/create2/Create2Test001.java index f635f22a5b0..42522dac823 100644 --- a/framework/src/test/java/stest/tron/wallet/dailybuild/tvmnewcommand/create2/Create2Test001.java +++ b/framework/src/test/java/stest/tron/wallet/dailybuild/tvmnewcommand/create2/Create2Test001.java @@ -80,6 +80,7 @@ public void test01DeployFactoryContract() { testKey002, blockingStubFull)); Assert.assertTrue(PublicMethed.sendcoin(user001Address, 10000_000_000L, fromAddress, testKey002, blockingStubFull)); + PublicMethed.waitProduceNextBlock(blockingStubFull); String filePath = "./src/test/resources/soliditycode/create2contract.sol"; String contractName = "Factory"; HashMap retMap = PublicMethed.getBycodeAbi(filePath, contractName); diff --git a/framework/src/test/java/stest/tron/wallet/dailybuild/tvmnewcommand/shiftcommand/ShiftCommand006.java b/framework/src/test/java/stest/tron/wallet/dailybuild/tvmnewcommand/shiftcommand/ShiftCommand006.java index b43eac1d4fb..371fbd52250 100644 --- a/framework/src/test/java/stest/tron/wallet/dailybuild/tvmnewcommand/shiftcommand/ShiftCommand006.java +++ b/framework/src/test/java/stest/tron/wallet/dailybuild/tvmnewcommand/shiftcommand/ShiftCommand006.java @@ -86,6 +86,7 @@ public void test1ShiftRightSigned() { Assert.assertTrue(PublicMethed .sendcoin(contractExcAddress, 100000000000L, testNetAccountAddress, testNetAccountKey, blockingStubFull)); + PublicMethed.waitProduceNextBlock(blockingStubFull); String filePath = "src/test/resources/soliditycode/ShiftCommand001.sol"; String contractName = "TestBitwiseShift"; HashMap retMap = PublicMethed.getBycodeAbi(filePath, contractName); diff --git a/framework/src/test/java/stest/tron/wallet/dailybuild/tvmnewcommand/transferfailed/TransferFailed001.java b/framework/src/test/java/stest/tron/wallet/dailybuild/tvmnewcommand/transferfailed/TransferFailed001.java index 70715cf0463..df48d857af4 100644 --- a/framework/src/test/java/stest/tron/wallet/dailybuild/tvmnewcommand/transferfailed/TransferFailed001.java +++ b/framework/src/test/java/stest/tron/wallet/dailybuild/tvmnewcommand/transferfailed/TransferFailed001.java @@ -89,6 +89,7 @@ public void test001TransferTrxInsufficientBalance() { Assert.assertTrue(PublicMethed .sendcoin(contractExcAddress, 10000000000L, testNetAccountAddress, testNetAccountKey, blockingStubFull)); + PublicMethed.waitProduceNextBlock(blockingStubFull); String filePath = "src/test/resources/soliditycode/TransferFailed001.sol"; String contractName = "EnergyOfTransferFailedTest"; HashMap retMap = PublicMethed.getBycodeAbi(filePath, contractName); diff --git a/framework/src/test/java/stest/tron/wallet/dailybuild/tvmnewcommand/transferfailed/TransferFailed002.java b/framework/src/test/java/stest/tron/wallet/dailybuild/tvmnewcommand/transferfailed/TransferFailed002.java index 200d6379fd5..4583b44b078 100644 --- a/framework/src/test/java/stest/tron/wallet/dailybuild/tvmnewcommand/transferfailed/TransferFailed002.java +++ b/framework/src/test/java/stest/tron/wallet/dailybuild/tvmnewcommand/transferfailed/TransferFailed002.java @@ -79,6 +79,7 @@ public void test1SendNotEnough() { Assert.assertTrue(PublicMethed .sendcoin(contractExcAddress, 100000000L, testNetAccountAddress, testNetAccountKey, blockingStubFull)); + PublicMethed.waitProduceNextBlock(blockingStubFull); String filePath = "src/test/resources/soliditycode/TransferFailed001.sol"; String contractName = "EnergyOfTransferFailedTest"; HashMap retMap = PublicMethed.getBycodeAbi(filePath, contractName); diff --git a/framework/src/test/java/stest/tron/wallet/dailybuild/tvmnewcommand/transferfailed/TransferFailed004.java b/framework/src/test/java/stest/tron/wallet/dailybuild/tvmnewcommand/transferfailed/TransferFailed004.java index a5250920575..04e11c7e35f 100644 --- a/framework/src/test/java/stest/tron/wallet/dailybuild/tvmnewcommand/transferfailed/TransferFailed004.java +++ b/framework/src/test/java/stest/tron/wallet/dailybuild/tvmnewcommand/transferfailed/TransferFailed004.java @@ -90,6 +90,7 @@ public void test1SuicideNonexistentTarget() { Assert.assertTrue(PublicMethed .sendcoin(contractExcAddress, 10000000000L, testNetAccountAddress, testNetAccountKey, blockingStubFull)); + PublicMethed.waitProduceNextBlock(blockingStubFull); String filePath = "src/test/resources/soliditycode/TransferFailed001.sol"; String contractName = "EnergyOfTransferFailedTest"; HashMap retMap = PublicMethed.getBycodeAbi(filePath, contractName); diff --git a/framework/src/test/java/stest/tron/wallet/dailybuild/tvmnewcommand/tryCatch/tryCatchTest001.java b/framework/src/test/java/stest/tron/wallet/dailybuild/tvmnewcommand/tryCatch/tryCatchTest001.java index 25872dbd324..afcc6cb068a 100644 --- a/framework/src/test/java/stest/tron/wallet/dailybuild/tvmnewcommand/tryCatch/tryCatchTest001.java +++ b/framework/src/test/java/stest/tron/wallet/dailybuild/tvmnewcommand/tryCatch/tryCatchTest001.java @@ -60,6 +60,7 @@ public void beforeClass() { PublicMethed .sendcoin(testAddress001, 10000_000_000L, testFoundationAddress, testFoundationKey, blockingStubFull); + PublicMethed.waitProduceNextBlock(blockingStubFull); String filePath = "src/test/resources/soliditycode/tryCatch001.sol"; String contractName = "tryTest"; diff --git a/framework/src/test/java/stest/tron/wallet/dailybuild/tvmnewcommand/tryCatch/tryCatchTest002.java b/framework/src/test/java/stest/tron/wallet/dailybuild/tvmnewcommand/tryCatch/tryCatchTest002.java index b4427147611..5e7de366658 100644 --- a/framework/src/test/java/stest/tron/wallet/dailybuild/tvmnewcommand/tryCatch/tryCatchTest002.java +++ b/framework/src/test/java/stest/tron/wallet/dailybuild/tvmnewcommand/tryCatch/tryCatchTest002.java @@ -59,6 +59,7 @@ public void beforeClass() { .sendcoin(testAddress001, 10000_000_000L, testFoundationAddress, testFoundationKey, blockingStubFull); + PublicMethed.waitProduceNextBlock(blockingStubFull); String filePath = "src/test/resources/soliditycode/tryCatch001.sol"; String contractName = "tryTest"; HashMap retMap = PublicMethed.getBycodeAbi(filePath, contractName); From 98d2f6408b757625444c76a9976e790fc58f608a Mon Sep 17 00:00:00 2001 From: lvs007 Date: Wed, 3 Feb 2021 16:58:53 +0800 Subject: [PATCH 15/32] add the transaction sort switch --- .../tron/common/parameter/CommonParameter.java | 3 +++ common/src/main/java/org/tron/core/Constant.java | 1 + .../main/java/org/tron/core/config/args/Args.java | 3 +++ .../src/main/java/org/tron/core/db/Manager.java | 15 ++++++++++----- 4 files changed, 17 insertions(+), 5 deletions(-) diff --git a/common/src/main/java/org/tron/common/parameter/CommonParameter.java b/common/src/main/java/org/tron/common/parameter/CommonParameter.java index 142fc348b81..532894b678a 100644 --- a/common/src/main/java/org/tron/common/parameter/CommonParameter.java +++ b/common/src/main/java/org/tron/common/parameter/CommonParameter.java @@ -464,6 +464,9 @@ public class CommonParameter { @Getter @Setter public boolean openPrintLog = true; + @Getter + @Setter + public boolean openTransactionSort = false; private static double calcMaxTimeRatio() { //return max(2.0, min(5.0, 5 * 4.0 / max(Runtime.getRuntime().availableProcessors(), 1))); diff --git a/common/src/main/java/org/tron/core/Constant.java b/common/src/main/java/org/tron/core/Constant.java index 6bd5ceb6ca7..b42d5c0774e 100644 --- a/common/src/main/java/org/tron/core/Constant.java +++ b/common/src/main/java/org/tron/core/Constant.java @@ -274,6 +274,7 @@ public class Constant { public static final String HISTORY_BALANCE_LOOKUP = "storage.balance.history.lookup"; public static final String OPEN_PRINT_LOG = "node.openPrintLog"; + public static final String OPEN_TRANSACTION_SORT = "node.openTransactionSort"; public static final String LOCAL_HOST = "127.0.0.1"; } diff --git a/framework/src/main/java/org/tron/core/config/args/Args.java b/framework/src/main/java/org/tron/core/config/args/Args.java index 857ac0cd30a..61bd844dd15 100644 --- a/framework/src/main/java/org/tron/core/config/args/Args.java +++ b/framework/src/main/java/org/tron/core/config/args/Args.java @@ -186,6 +186,7 @@ public static void clearParam() { PARAMETER.allowTvmAssetIssue = 0; PARAMETER.historyBalanceLookup = false; PARAMETER.openPrintLog = true; + PARAMETER.openTransactionSort = false; } /** @@ -747,6 +748,8 @@ public static void setParam(final String[] args, final String confFileName) { PARAMETER.openPrintLog = config.hasPath(Constant.OPEN_PRINT_LOG) ? config .getBoolean(Constant.OPEN_PRINT_LOG) : true; + PARAMETER.openTransactionSort = config.hasPath(Constant.OPEN_TRANSACTION_SORT) ? config + .getBoolean(Constant.OPEN_TRANSACTION_SORT) : false; logConfig(); } diff --git a/framework/src/main/java/org/tron/core/db/Manager.java b/framework/src/main/java/org/tron/core/db/Manager.java index 65d41302c28..76994561d43 100644 --- a/framework/src/main/java/org/tron/core/db/Manager.java +++ b/framework/src/main/java/org/tron/core/db/Manager.java @@ -208,14 +208,14 @@ public class Manager { @Getter private ChainBaseManager chainBaseManager; // transactions cache - private PriorityBlockingQueue pendingTransactions; + private BlockingQueue pendingTransactions; @Getter private AtomicInteger shieldedTransInPendingCounts = new AtomicInteger(0); // transactions popped private List poppedTransactions = Collections.synchronizedList(Lists.newArrayList()); // the capacity is equal to Integer.MAX_VALUE default - private PriorityBlockingQueue rePushTransactions; + private BlockingQueue rePushTransactions; private BlockingQueue triggerCapsuleQueue; /** @@ -322,7 +322,7 @@ public BlockIndexStore getBlockIndexStore() { return chainBaseManager.getBlockIndexStore(); } - public PriorityBlockingQueue getPendingTransactions() { + public BlockingQueue getPendingTransactions() { return this.pendingTransactions; } @@ -359,8 +359,13 @@ public void init() { this.setMerkleContainer( merkleContainer.createInstance(chainBaseManager.getMerkleTreeStore(), chainBaseManager.getMerkleTreeIndexStore())); - this.pendingTransactions = new PriorityBlockingQueue(2000, downComparator); - this.rePushTransactions = new PriorityBlockingQueue<>(2000, downComparator); + if (Args.getInstance().isOpenTransactionSort()) { + this.pendingTransactions = new PriorityBlockingQueue(2000, downComparator); + this.rePushTransactions = new PriorityBlockingQueue<>(2000, downComparator); + } else { + this.pendingTransactions = new LinkedBlockingQueue<>(); + this.rePushTransactions =new LinkedBlockingQueue<>(); + } this.triggerCapsuleQueue = new LinkedBlockingQueue<>(); chainBaseManager.setMerkleContainer(getMerkleContainer()); chainBaseManager.setMortgageService(mortgageService); From 2b6273989f3b5198fe3081f774a70e6334873edb Mon Sep 17 00:00:00 2001 From: lvs007 Date: Thu, 4 Feb 2021 14:29:29 +0800 Subject: [PATCH 16/32] add the transaction sort switch --- .../src/main/java/org/tron/core/db/Manager.java | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/framework/src/main/java/org/tron/core/db/Manager.java b/framework/src/main/java/org/tron/core/db/Manager.java index 76994561d43..9409f5081d4 100644 --- a/framework/src/main/java/org/tron/core/db/Manager.java +++ b/framework/src/main/java/org/tron/core/db/Manager.java @@ -1233,11 +1233,15 @@ public synchronized BlockCapsule generateBlock(Miner miner, long blockTime, long TransactionCapsule trx; if (pendingTransactions.size() > 0) { trx = pendingTransactions.peek(); - TransactionCapsule trxRepush = rePushTransactions.peek(); - if (trxRepush == null || trx.getOrder() >= trxRepush.getOrder()) { - fromPending = true; + if (Args.getInstance().isOpenTransactionSort()) { + TransactionCapsule trxRepush = rePushTransactions.peek(); + if (trxRepush == null || trx.getOrder() >= trxRepush.getOrder()) { + fromPending = true; + } else { + trx = rePushTransactions.poll(); + } } else { - trx = rePushTransactions.poll(); + fromPending = true; } } else { trx = rePushTransactions.poll(); From e1bf356fdb4b99d5a1d5b48d8c4e12719448fc9f Mon Sep 17 00:00:00 2001 From: pangpangfeng <7577288@qq.com> Date: Fri, 5 Feb 2021 12:19:50 +0800 Subject: [PATCH 17/32] Add retry for ContractInternalTransaction003.java --- .../ContractInternalTransaction003.java | 23 +++++++++++-------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/framework/src/test/java/stest/tron/wallet/dailybuild/internaltransaction/ContractInternalTransaction003.java b/framework/src/test/java/stest/tron/wallet/dailybuild/internaltransaction/ContractInternalTransaction003.java index 3be9601f593..7918d6a9817 100644 --- a/framework/src/test/java/stest/tron/wallet/dailybuild/internaltransaction/ContractInternalTransaction003.java +++ b/framework/src/test/java/stest/tron/wallet/dailybuild/internaltransaction/ContractInternalTransaction003.java @@ -486,7 +486,7 @@ public void testInternalTransaction018() { internalTxsAddress, blockingStubFull); PublicMethed.waitProduceNextBlock(blockingStubFull); PublicMethed - .sendcoin(internalTxsAddress, 1000000000L, testNetAccountAddress, testNetAccountKey, + .sendcoin(internalTxsAddress, 2000000000L, testNetAccountAddress, testNetAccountKey, blockingStubFull); PublicMethed.waitProduceNextBlock(blockingStubFull); PublicMethed.waitProduceNextBlock(blockingStubFull); @@ -503,14 +503,19 @@ public void testInternalTransaction018() { infoById = PublicMethed.getTransactionInfoById(txid, blockingStubFull); logger.info("InfoById:" + infoById); - // retry 1 times - txid = PublicMethed.triggerContract(contractAddress, - "test1(address,address)", initParmes, false, - 100000, maxFeeLimit, internalTxsAddress, testKeyForinternalTxsAddress, blockingStubFull); - PublicMethed.waitProduceNextBlock(blockingStubFull); - PublicMethed.waitProduceNextBlock(blockingStubFull); - infoById = PublicMethed.getTransactionInfoById(txid, blockingStubFull); - logger.info("InfoById-1" + ": " + infoById); + int retryTimes = 1; + while (retryTimes++ < 5 && infoById.get().getResultValue() != 0) { + // retry 5 times + txid = PublicMethed.triggerContract(contractAddress, + "test1(address,address)", initParmes, false, + 100000, maxFeeLimit, internalTxsAddress, testKeyForinternalTxsAddress, blockingStubFull); + PublicMethed.waitProduceNextBlock(blockingStubFull); + PublicMethed.waitProduceNextBlock(blockingStubFull); + infoById = PublicMethed.getTransactionInfoById(txid, blockingStubFull); + logger.info("InfoById retry " + retryTimes + " : " + infoById); + } + + Assert.assertEquals(0, infoById.get().getResultValue()); int transactionsCount = infoById.get().getInternalTransactionsCount(); From 085e146af1e02be425bc1a1a6b01278c4253ac68 Mon Sep 17 00:00:00 2001 From: pangpangfeng <7577288@qq.com> Date: Wed, 10 Feb 2021 14:20:12 +0800 Subject: [PATCH 18/32] Add transaction sort test case --- .../common/client/utils/PublicMethed.java | 32 ++- .../TransactionPendingQuery001.java | 190 ++++++++++++++++++ 2 files changed, 220 insertions(+), 2 deletions(-) create mode 100644 framework/src/test/java/stest/tron/wallet/dailybuild/transaction/TransactionPendingQuery001.java diff --git a/framework/src/test/java/stest/tron/wallet/common/client/utils/PublicMethed.java b/framework/src/test/java/stest/tron/wallet/common/client/utils/PublicMethed.java index c60b9d2a868..f2af470fb98 100644 --- a/framework/src/test/java/stest/tron/wallet/common/client/utils/PublicMethed.java +++ b/framework/src/test/java/stest/tron/wallet/common/client/utils/PublicMethed.java @@ -1824,7 +1824,7 @@ public static boolean waitSolidityNodeSynFullNodeData( Integer wait = 0; logger.info("Fullnode block num is " + currentBlock.getBlockHeader().getRawData().getNumber()); while (solidityCurrentBlock.getBlockHeader().getRawData().getNumber() - < currentBlock.getBlockHeader().getRawData().getNumber() + 1 && wait <= 10) { + < currentBlock.getBlockHeader().getRawData().getNumber() + 1 && wait <= 24) { try { Thread.sleep(3000); } catch (InterruptedException e) { @@ -1834,7 +1834,7 @@ public static boolean waitSolidityNodeSynFullNodeData( .getNumber()); solidityCurrentBlock = blockingStubSolidity .getNowBlock(GrpcAPI.EmptyMessage.newBuilder().build()); - if (wait == 10) { + if (wait == 24) { logger.info("Didn't syn,skip to next case."); return false; } @@ -7197,4 +7197,32 @@ public static BalanceContract.BlockBalanceTrace getBlockBalance(Protocol.Block b } + + /** + * 61 constructor. + */ + + public static Optional getTransactionFromPending(String txId, + WalletGrpc.WalletBlockingStub blockingStubFull) { + ByteString bsTxid = ByteString.copyFrom(ByteArray.fromHexString(txId)); + BytesMessage request = BytesMessage.newBuilder().setValue(bsTxid).build(); + Transaction transaction; + transaction = blockingStubFull.getTransactionFromPending(request); + return Optional.ofNullable(transaction); + } + + /** + * 61 constructor. + */ + + public static Optional getTransactionFromPending(String txId, + WalletSolidityGrpc.WalletSolidityBlockingStub blockingStubSolidity) { + ByteString bsTxid = ByteString.copyFrom(ByteArray.fromHexString(txId)); + BytesMessage request = BytesMessage.newBuilder().setValue(bsTxid).build(); + Transaction transaction; + transaction = blockingStubSolidity.getTransactionFromPending(request); + return Optional.ofNullable(transaction); + } + + } diff --git a/framework/src/test/java/stest/tron/wallet/dailybuild/transaction/TransactionPendingQuery001.java b/framework/src/test/java/stest/tron/wallet/dailybuild/transaction/TransactionPendingQuery001.java new file mode 100644 index 00000000000..0fff852cc17 --- /dev/null +++ b/framework/src/test/java/stest/tron/wallet/dailybuild/transaction/TransactionPendingQuery001.java @@ -0,0 +1,190 @@ +package stest.tron.wallet.dailybuild.transaction; + +import io.grpc.ManagedChannel; +import io.grpc.ManagedChannelBuilder; +import java.util.concurrent.TimeUnit; +import lombok.extern.slf4j.Slf4j; +import org.junit.Assert; +import org.testng.annotations.AfterClass; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.BeforeSuite; +import org.testng.annotations.Test; +import org.tron.api.GrpcAPI.EmptyMessage; +import org.tron.api.GrpcAPI.TransactionList; +import org.tron.api.WalletGrpc; +import org.tron.api.WalletSolidityGrpc; +import org.tron.common.crypto.ECKey; +import org.tron.common.utils.ByteArray; +import org.tron.common.utils.Utils; +import org.tron.core.Wallet; +import org.tron.protos.Protocol.Transaction; +import stest.tron.wallet.common.client.Configuration; +import stest.tron.wallet.common.client.Parameter.CommonConstant; +import stest.tron.wallet.common.client.utils.PublicMethed; +import stest.tron.wallet.common.client.utils.Sha256Hash; + + +@Slf4j + +public class TransactionPendingQuery001 { + private final String testKey002 = Configuration.getByPath("testng.conf") + .getString("foundationAccount.key1"); + private final byte[] fromAddress = PublicMethed.getFinalAddress(testKey002); + + private ManagedChannel channelFull = null; + private WalletGrpc.WalletBlockingStub blockingStubFull = null; + private WalletSolidityGrpc.WalletSolidityBlockingStub blockingStubSolidity = null; + private ManagedChannel channelSolidity = null; + public ManagedChannel channelPbft = null; + public WalletSolidityGrpc.WalletSolidityBlockingStub blockingStubPbft = null; + + ECKey ecKey1 = new ECKey(Utils.getRandom()); + byte[] receiverAddress = ecKey1.getAddress(); + final String receiverKey = ByteArray.toHexString(ecKey1.getPrivKeyBytes()); + + private String fullnode = Configuration.getByPath("testng.conf") + .getStringList("fullnode.ip.list").get(0); + private String soliditynode = Configuration.getByPath("testng.conf") + .getStringList("solidityNode.ip.list").get(0); + private String soliInPbft = Configuration.getByPath("testng.conf") + .getStringList("solidityNode.ip.list").get(2); + String txid = null; + + + @BeforeSuite + public void beforeSuite() { + Wallet wallet = new Wallet(); + Wallet.setAddressPreFixByte(CommonConstant.ADD_PRE_FIX_BYTE_MAINNET); + } + + /** + * constructor. + */ + + @BeforeClass(enabled = true) + public void beforeClass() { + channelFull = ManagedChannelBuilder.forTarget(fullnode) + .usePlaintext(true) + .build(); + blockingStubFull = WalletGrpc.newBlockingStub(channelFull); + + channelSolidity = ManagedChannelBuilder.forTarget(soliditynode) + .usePlaintext(true) + .build(); + blockingStubSolidity = WalletSolidityGrpc.newBlockingStub(channelSolidity); + + channelPbft = ManagedChannelBuilder.forTarget(soliInPbft) + .usePlaintext(true) + .build(); + blockingStubPbft = WalletSolidityGrpc.newBlockingStub(channelPbft); + + } + + @Test(enabled = true, description = "Test get pending size") + public void test01GetPendingSize() { + long pendingSizeInFullNode = 0; + int retryTimes = 100; + while (pendingSizeInFullNode == 0 && retryTimes-- > 0) { + PublicMethed.sendcoin(receiverAddress,1L,fromAddress,testKey002,blockingStubFull); + if (retryTimes % 5 == 0) { + pendingSizeInFullNode = blockingStubFull + .getPendingSize(EmptyMessage.newBuilder().build()).getNum(); + } + } + Assert.assertNotEquals(pendingSizeInFullNode,0); + } + + + @Test(enabled = true, description = "Test get pending transaction list") + public void test02GetPendingTransactionList() { + int retryTimes = 100; + TransactionList transactionList = blockingStubFull + .getTransactionListFromPending(EmptyMessage.newBuilder().build()); + while (transactionList.getTransactionCount() == 0 && retryTimes-- > 0) { + PublicMethed.sendcoin(receiverAddress,1L,fromAddress,testKey002,blockingStubFull); + if (retryTimes % 5 == 0) { + transactionList = blockingStubFull + .getTransactionListFromPending(EmptyMessage.newBuilder().build()); + } + } + Assert.assertNotEquals(transactionList.getTransactionCount(),0); + + txid = ByteArray.toHexString(Sha256Hash + .hash(true, transactionList.getTransaction(0).getRawData().toByteArray())); + + logger.info("txid:" + txid); + + } + + + @Test(enabled = true, description = "Test transaction from pending") + public void test03GetTransactionFromPending() { + Transaction transaction = PublicMethed.getTransactionFromPending(txid,blockingStubFull).get(); + Assert.assertEquals(ByteArray.toHexString(Sha256Hash + .hash(true, transaction.getRawData().toByteArray())),txid); + } + + @Test(enabled = false, description = "Test get pending size on solidity") + public void test04GetPendingSizeOnSolidity() { + + long pendingSizeInFullNode = 0; + int retryTimes = 100; + while (pendingSizeInFullNode == 0 && retryTimes-- > 0) { + PublicMethed.sendcoin(receiverAddress,1L,fromAddress,testKey002,blockingStubFull); + if (retryTimes % 10 == 0) { + pendingSizeInFullNode = blockingStubSolidity + .getPendingSize(EmptyMessage.newBuilder().build()).getNum(); + } + } + Assert.assertNotEquals(pendingSizeInFullNode,0); + } + + + + + @Test(enabled = false, description = "Test get pending transaction list on solidity") + public void test05GetPendingTransactionListOnSolidity() { + int retryTimes = 100; + TransactionList transactionList = blockingStubSolidity + .getTransactionListFromPending(EmptyMessage.newBuilder().build()); + while (transactionList.getTransactionCount() == 0 && retryTimes-- > 0) { + PublicMethed.sendcoin(receiverAddress,1L,fromAddress,testKey002,blockingStubFull); + if (retryTimes % 5 == 0) { + transactionList = blockingStubSolidity + .getTransactionListFromPending(EmptyMessage.newBuilder().build()); + } + } + Assert.assertNotEquals(transactionList.getTransactionCount(),0); + + txid = ByteArray.toHexString(Sha256Hash + .hash(true, transactionList + .getTransaction(0).getRawData().toByteArray())); + + logger.info("txid:" + txid); + + } + + + @Test(enabled = false, description = "Test transaction from pending on solidity") + public void test06GetTransactionFromPendingOnSolidity() { + Transaction transaction = PublicMethed + .getTransactionFromPending(txid,blockingStubSolidity).get(); + Assert.assertEquals(ByteArray.toHexString(Sha256Hash + .hash(true, transaction.getRawData().toByteArray())),txid); + } + + /** + * constructor. + */ + + @AfterClass + public void shutdown() throws InterruptedException { + PublicMethed.unFreezeBalance(receiverAddress, receiverKey, 1, receiverAddress, + blockingStubFull); + PublicMethed.freedResource(receiverAddress, receiverKey, fromAddress, blockingStubFull); + if (channelFull != null) { + channelFull.shutdown().awaitTermination(5, TimeUnit.SECONDS); + } + } + +} From 474783edd202803e15b3eebc1c70aea0c047e3ee Mon Sep 17 00:00:00 2001 From: pangpangfeng <7577288@qq.com> Date: Wed, 10 Feb 2021 14:43:23 +0800 Subject: [PATCH 19/32] Add pending transaction api http case --- .../common/client/utils/HttpMethed.java | 55 ++++++++++ .../http/HttpTestTransactionPending001.java | 103 ++++++++++++++++++ 2 files changed, 158 insertions(+) create mode 100644 framework/src/test/java/stest/tron/wallet/dailybuild/http/HttpTestTransactionPending001.java diff --git a/framework/src/test/java/stest/tron/wallet/common/client/utils/HttpMethed.java b/framework/src/test/java/stest/tron/wallet/common/client/utils/HttpMethed.java index 08093aff3c3..920efa039cc 100644 --- a/framework/src/test/java/stest/tron/wallet/common/client/utils/HttpMethed.java +++ b/framework/src/test/java/stest/tron/wallet/common/client/utils/HttpMethed.java @@ -5169,4 +5169,59 @@ public static HttpResponse getMarketPriceByPairFromPbft(String httpPbftNode, return response; } + /** + * constructor. + */ + public static int getTransactionPendingSize(String httpNode) { + try { + String requestUrl = "http://" + httpNode + "/wallet/getpendingsize"; + JsonObject userBaseObj2 = new JsonObject(); + response = createConnect(requestUrl, userBaseObj2); + } catch (Exception e) { + e.printStackTrace(); + httppost.releaseConnection(); + return 0; + } + responseContent = HttpMethed.parseResponseContent(response); + return responseContent.getInteger("pendingSize"); + } + + /** + * constructor. + */ + public static HttpResponse getTransactionListFromPending(String httpNode) { + try { + String requestUrl = "http://" + httpNode + "/wallet/gettransactionlistfrompending"; + JsonObject userBaseObj2 = new JsonObject(); + response = createConnect(requestUrl, userBaseObj2); + } catch (Exception e) { + e.printStackTrace(); + httppost.releaseConnection(); + return null; + } + return response; + } + + + /** + * constructor. + */ + public static HttpResponse getTransactionFromPending(String httpNode,String txid) { + try { + String requestUrl = "http://" + httpNode + "/wallet/gettransactionfrompending"; + JsonObject userBaseObj2 = new JsonObject(); + userBaseObj2.addProperty("value",txid); + response = createConnect(requestUrl, userBaseObj2); + } catch (Exception e) { + e.printStackTrace(); + httppost.releaseConnection(); + return null; + } + return response; + } + + + + + } diff --git a/framework/src/test/java/stest/tron/wallet/dailybuild/http/HttpTestTransactionPending001.java b/framework/src/test/java/stest/tron/wallet/dailybuild/http/HttpTestTransactionPending001.java new file mode 100644 index 00000000000..877ad403e2c --- /dev/null +++ b/framework/src/test/java/stest/tron/wallet/dailybuild/http/HttpTestTransactionPending001.java @@ -0,0 +1,103 @@ +package stest.tron.wallet.dailybuild.http; + +import com.alibaba.fastjson.JSONObject; +import lombok.extern.slf4j.Slf4j; +import org.apache.http.HttpResponse; +import org.junit.Assert; +import org.testng.annotations.AfterClass; +import org.testng.annotations.Test; +import org.tron.common.crypto.ECKey; +import org.tron.common.utils.ByteArray; +import org.tron.common.utils.Utils; +import stest.tron.wallet.common.client.Configuration; +import stest.tron.wallet.common.client.utils.HttpMethed; +import stest.tron.wallet.common.client.utils.PublicMethed; + +@Slf4j +public class HttpTestTransactionPending001 { + + private final String testKey002 = Configuration.getByPath("testng.conf") + .getString("foundationAccount.key1"); + private final byte[] fromAddress = PublicMethed.getFinalAddress(testKey002); + private JSONObject responseContent; + private HttpResponse response; + private String httpnode = Configuration.getByPath("testng.conf").getStringList("httpnode.ip.list") + .get(0); + private String httpSoliditynode = Configuration.getByPath("testng.conf") + .getStringList("httpnode.ip.list").get(2); + private String httpPbftNode = Configuration.getByPath("testng.conf") + .getStringList("httpnode.ip.list").get(4); + ECKey ecKey1 = new ECKey(Utils.getRandom()); + byte[] receiverAddress = ecKey1.getAddress(); + String receiverKey = ByteArray.toHexString(ecKey1.getPrivKeyBytes()); + String txid; + JSONObject transaction; + + /** + * constructor. + */ + @Test(enabled = true, description = "Get transaction pending size by http") + public void test01GetTransactionPendingSize() { + int pendingSize = 0; + int retryTimes = 50; + + while (pendingSize == 0 && retryTimes-- > 0) { + HttpMethed.sendCoin(httpnode,fromAddress,receiverAddress,1L,testKey002); + if (retryTimes % 5 == 0) { + pendingSize = HttpMethed.getTransactionPendingSize(httpnode); + } + } + + Assert.assertNotEquals(pendingSize,0); + } + + /** + * constructor. + */ + @Test(enabled = true, description = "Get pending transaction list by http") + public void test02GetPendingTransactionList() { + int transactionSize = 0; + int retryTimes = 50; + + while (transactionSize == 0 && retryTimes-- > 0) { + HttpMethed.sendCoin(httpnode,fromAddress,receiverAddress,1L,testKey002); + if (retryTimes % 5 == 0) { + response = HttpMethed.getTransactionListFromPending(httpnode); + responseContent = HttpMethed.parseResponseContent(response); + transactionSize = responseContent.getJSONArray("transaction").size(); + } + } + Assert.assertNotEquals(transactionSize,0); + + transaction = responseContent.getJSONArray("transaction").getJSONObject(0); + HttpMethed.printJsonContent(transaction); + txid = transaction.getString("txID"); + Assert.assertTrue(transaction.containsKey("raw_data")); + } + + + /** + * constructor. + */ + @Test(enabled = true, description = "Get pending transaction list by http") + public void test03GetPendingTransactionList() { + response = HttpMethed.getTransactionFromPending(httpnode,txid); + responseContent = HttpMethed.parseResponseContent(response); + HttpMethed.printJsonContent(responseContent); + + Assert.assertEquals(transaction,responseContent); + Assert.assertNotEquals(null,responseContent); + } + + + + + /** + * constructor. + */ + + @AfterClass + public void shutdown() throws InterruptedException { + HttpMethed.disConnect(); + } +} \ No newline at end of file From 6c6a6b6335c2e92314b54f43173c484de81cdd60 Mon Sep 17 00:00:00 2001 From: lvs007 Date: Sat, 20 Feb 2021 17:14:47 +0800 Subject: [PATCH 20/32] remove unuse interface --- .../org/tron/core/services/RpcApiService.java | 18 ------------------ protocol/src/main/protos/api/api.proto | 9 --------- 2 files changed, 27 deletions(-) diff --git a/framework/src/main/java/org/tron/core/services/RpcApiService.java b/framework/src/main/java/org/tron/core/services/RpcApiService.java index 856b27ca4af..796c67a484a 100755 --- a/framework/src/main/java/org/tron/core/services/RpcApiService.java +++ b/framework/src/main/java/org/tron/core/services/RpcApiService.java @@ -900,24 +900,6 @@ public void getTransactionInfoByBlockNum(NumberMessage request, responseObserver.onCompleted(); } - - @Override - public void getTransactionFromPending(BytesMessage request, - StreamObserver responseObserver) { - getTransactionFromPendingCommon(request, responseObserver); - } - - @Override - public void getTransactionListFromPending(EmptyMessage request, - StreamObserver responseObserver) { - getTransactionListFromPendingCommon(request, responseObserver); - } - - @Override - public void getPendingSize(EmptyMessage request, - StreamObserver responseObserver) { - getPendingSizeCommon(request, responseObserver); - } } /** diff --git a/protocol/src/main/protos/api/api.proto b/protocol/src/main/protos/api/api.proto index 8b026e74623..e9e66511dc5 100644 --- a/protocol/src/main/protos/api/api.proto +++ b/protocol/src/main/protos/api/api.proto @@ -974,15 +974,6 @@ service WalletSolidity { rpc GetBurnTrx (EmptyMessage) returns (NumberMessage) { } - - rpc GetTransactionFromPending (BytesMessage) returns (Transaction) { - } - - rpc GetTransactionListFromPending (EmptyMessage) returns (TransactionList) { - } - - rpc GetPendingSize (EmptyMessage) returns (NumberMessage) { - } }; service WalletExtension { From 788de3267cd128436a093446390bd6bc8a6e902c Mon Sep 17 00:00:00 2001 From: lvs007 Date: Wed, 17 Mar 2021 12:42:53 +0800 Subject: [PATCH 21/32] remove the timeout tx from repush --- framework/src/main/java/org/tron/core/db/Manager.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/framework/src/main/java/org/tron/core/db/Manager.java b/framework/src/main/java/org/tron/core/db/Manager.java index 9409f5081d4..c7d323fa1f0 100644 --- a/framework/src/main/java/org/tron/core/db/Manager.java +++ b/framework/src/main/java/org/tron/core/db/Manager.java @@ -227,7 +227,10 @@ public class Manager { TransactionCapsule tx = null; try { tx = getRePushTransactions().peek(); - if (tx != null) { + if (tx != null && System.currentTimeMillis() - tx.getTime() >= Args.getInstance() + .getPendingTransactionTimeout()) { + logger.warn("[timeout] remove tx from rePush, txId:{}", tx.getTransactionId()); + } else if (tx != null) { this.rePush(tx); } else { TimeUnit.MILLISECONDS.sleep(SLEEP_TIME_OUT); @@ -364,7 +367,7 @@ public void init() { this.rePushTransactions = new PriorityBlockingQueue<>(2000, downComparator); } else { this.pendingTransactions = new LinkedBlockingQueue<>(); - this.rePushTransactions =new LinkedBlockingQueue<>(); + this.rePushTransactions = new LinkedBlockingQueue<>(); } this.triggerCapsuleQueue = new LinkedBlockingQueue<>(); chainBaseManager.setMerkleContainer(getMerkleContainer()); From 0eb039e2c0f13c0988f1021d2d80699edf29285c Mon Sep 17 00:00:00 2001 From: liukai Date: Wed, 17 Mar 2021 13:51:07 +0800 Subject: [PATCH 22/32] change version --- .../common/client/utils/PublicMethed.java | 14 ------ .../TransactionPendingQuery001.java | 48 ------------------- 2 files changed, 62 deletions(-) diff --git a/framework/src/test/java/stest/tron/wallet/common/client/utils/PublicMethed.java b/framework/src/test/java/stest/tron/wallet/common/client/utils/PublicMethed.java index f2af470fb98..806f4c47c4b 100644 --- a/framework/src/test/java/stest/tron/wallet/common/client/utils/PublicMethed.java +++ b/framework/src/test/java/stest/tron/wallet/common/client/utils/PublicMethed.java @@ -7211,18 +7211,4 @@ public static Optional getTransactionFromPending(String txId, return Optional.ofNullable(transaction); } - /** - * 61 constructor. - */ - - public static Optional getTransactionFromPending(String txId, - WalletSolidityGrpc.WalletSolidityBlockingStub blockingStubSolidity) { - ByteString bsTxid = ByteString.copyFrom(ByteArray.fromHexString(txId)); - BytesMessage request = BytesMessage.newBuilder().setValue(bsTxid).build(); - Transaction transaction; - transaction = blockingStubSolidity.getTransactionFromPending(request); - return Optional.ofNullable(transaction); - } - - } diff --git a/framework/src/test/java/stest/tron/wallet/dailybuild/transaction/TransactionPendingQuery001.java b/framework/src/test/java/stest/tron/wallet/dailybuild/transaction/TransactionPendingQuery001.java index 0fff852cc17..7ef6e33ffab 100644 --- a/framework/src/test/java/stest/tron/wallet/dailybuild/transaction/TransactionPendingQuery001.java +++ b/framework/src/test/java/stest/tron/wallet/dailybuild/transaction/TransactionPendingQuery001.java @@ -124,54 +124,6 @@ public void test03GetTransactionFromPending() { .hash(true, transaction.getRawData().toByteArray())),txid); } - @Test(enabled = false, description = "Test get pending size on solidity") - public void test04GetPendingSizeOnSolidity() { - - long pendingSizeInFullNode = 0; - int retryTimes = 100; - while (pendingSizeInFullNode == 0 && retryTimes-- > 0) { - PublicMethed.sendcoin(receiverAddress,1L,fromAddress,testKey002,blockingStubFull); - if (retryTimes % 10 == 0) { - pendingSizeInFullNode = blockingStubSolidity - .getPendingSize(EmptyMessage.newBuilder().build()).getNum(); - } - } - Assert.assertNotEquals(pendingSizeInFullNode,0); - } - - - - - @Test(enabled = false, description = "Test get pending transaction list on solidity") - public void test05GetPendingTransactionListOnSolidity() { - int retryTimes = 100; - TransactionList transactionList = blockingStubSolidity - .getTransactionListFromPending(EmptyMessage.newBuilder().build()); - while (transactionList.getTransactionCount() == 0 && retryTimes-- > 0) { - PublicMethed.sendcoin(receiverAddress,1L,fromAddress,testKey002,blockingStubFull); - if (retryTimes % 5 == 0) { - transactionList = blockingStubSolidity - .getTransactionListFromPending(EmptyMessage.newBuilder().build()); - } - } - Assert.assertNotEquals(transactionList.getTransactionCount(),0); - - txid = ByteArray.toHexString(Sha256Hash - .hash(true, transactionList - .getTransaction(0).getRawData().toByteArray())); - - logger.info("txid:" + txid); - - } - - - @Test(enabled = false, description = "Test transaction from pending on solidity") - public void test06GetTransactionFromPendingOnSolidity() { - Transaction transaction = PublicMethed - .getTransactionFromPending(txid,blockingStubSolidity).get(); - Assert.assertEquals(ByteArray.toHexString(Sha256Hash - .hash(true, transaction.getRawData().toByteArray())),txid); - } /** * constructor. From c7823ef2e7ddade55cd7eddc575ad8cfdb4bccea Mon Sep 17 00:00:00 2001 From: liukai Date: Wed, 17 Mar 2021 15:54:20 +0800 Subject: [PATCH 23/32] resolve cpu 100% --- .../java/org/tron/core/services/WitnessProductBlockService.java | 2 +- .../org/tron/core/services/WitnessProductBlockServiceTest.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/framework/src/main/java/org/tron/core/services/WitnessProductBlockService.java b/framework/src/main/java/org/tron/core/services/WitnessProductBlockService.java index 5668c25b73e..e895923114f 100644 --- a/framework/src/main/java/org/tron/core/services/WitnessProductBlockService.java +++ b/framework/src/main/java/org/tron/core/services/WitnessProductBlockService.java @@ -36,7 +36,7 @@ public void validWitnessProductTwoBlock(BlockCapsule block) { cheatWitnessInfoMap.get(key).clear().setTime(System.currentTimeMillis()) .setLatestBlockNum(block.getNum()).add(block).add(blockCapsule).increment(); } else { - historyBlockCapsuleCache.put(block.getNum(), block); + historyBlockCapsuleCache.put(block.getNum(), new BlockCapsule(block.getInstance())); } } catch (Exception e) { logger.error("valid witness same time product two block fail! blockNum: {}, blockHash: {}", diff --git a/framework/src/test/java/org/tron/core/services/WitnessProductBlockServiceTest.java b/framework/src/test/java/org/tron/core/services/WitnessProductBlockServiceTest.java index f35e95ef64d..df84243f0c5 100644 --- a/framework/src/test/java/org/tron/core/services/WitnessProductBlockServiceTest.java +++ b/framework/src/test/java/org/tron/core/services/WitnessProductBlockServiceTest.java @@ -85,7 +85,7 @@ public void validWitnessProductTwoBlockTest() { Assert.assertEquals(blockCapsule2.getNum(), block.getLatestBlockNum()); Assert.assertEquals(block.getBlockCapsuleSet().contains(blockCapsule2), true); - Assert.assertEquals(block.getBlockCapsuleSet().contains(blockCapsule1), true); +// Assert.assertEquals(block.getBlockCapsuleSet().contains(blockCapsule1), true); } From 81142c25f9b77dfb2cec2b6f0475f8ac7407a922 Mon Sep 17 00:00:00 2001 From: liukai Date: Wed, 17 Mar 2021 16:32:12 +0800 Subject: [PATCH 24/32] resolve test cast --- .../src/main/java/org/tron/program/Version.java | 2 +- .../services/WitnessProductBlockServiceTest.java | 14 ++++++++++++-- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/framework/src/main/java/org/tron/program/Version.java b/framework/src/main/java/org/tron/program/Version.java index f0086fb34a3..800f1f47dc1 100644 --- a/framework/src/main/java/org/tron/program/Version.java +++ b/framework/src/main/java/org/tron/program/Version.java @@ -4,7 +4,7 @@ public class Version { public static final String VERSION_NAME = "GreatVoyage-v4.1.1-2046-gc465c9ee4"; public static final String VERSION_CODE = "15262"; - private static final String VERSION = "4.1.2"; + private static final String VERSION = "4.1.3"; public static String getVersion() { return VERSION; diff --git a/framework/src/test/java/org/tron/core/services/WitnessProductBlockServiceTest.java b/framework/src/test/java/org/tron/core/services/WitnessProductBlockServiceTest.java index df84243f0c5..60f24c7296a 100644 --- a/framework/src/test/java/org/tron/core/services/WitnessProductBlockServiceTest.java +++ b/framework/src/test/java/org/tron/core/services/WitnessProductBlockServiceTest.java @@ -2,6 +2,7 @@ import com.google.protobuf.ByteString; import java.util.HashSet; +import java.util.Iterator; import java.util.Set; import java.util.concurrent.atomic.AtomicInteger; import org.junit.Assert; @@ -85,8 +86,17 @@ public void validWitnessProductTwoBlockTest() { Assert.assertEquals(blockCapsule2.getNum(), block.getLatestBlockNum()); Assert.assertEquals(block.getBlockCapsuleSet().contains(blockCapsule2), true); -// Assert.assertEquals(block.getBlockCapsuleSet().contains(blockCapsule1), true); - + Iterator iterator = block.getBlockCapsuleSet() + .iterator(); + boolean isInner = false; + while (iterator.hasNext()) { + BlockCapsule blockCapsule = iterator.next(); + blockCapsule.getBlockId(); + if (blockCapsule.getBlockId().equals(blockCapsule1.getBlockId())) { + isInner = true; + } + } + Assert.assertTrue(isInner); } } From 81dec154de33cabb7ebe1759aa6f06412db7bdb1 Mon Sep 17 00:00:00 2001 From: lvs007 Date: Wed, 17 Mar 2021 18:24:33 +0800 Subject: [PATCH 25/32] modify the transaction return value to string --- .../src/main/java/org/tron/core/db/Manager.java | 8 ++++---- .../java/org/tron/core/services/RpcApiService.java | 9 +++++---- .../http/GetTransactionListFromPendingServlet.java | 14 ++++++++------ .../java/org/tron/core/services/http/Util.java | 13 +++++++++++++ .../transaction/TransactionPendingQuery001.java | 10 +++++----- protocol/src/main/protos/api/api.proto | 5 ++++- 6 files changed, 39 insertions(+), 20 deletions(-) diff --git a/framework/src/main/java/org/tron/core/db/Manager.java b/framework/src/main/java/org/tron/core/db/Manager.java index c7d323fa1f0..fdc72661d2f 100644 --- a/framework/src/main/java/org/tron/core/db/Manager.java +++ b/framework/src/main/java/org/tron/core/db/Manager.java @@ -1824,13 +1824,13 @@ public TransactionCapsule getTxFromPending(String txId) { return transactionCapsule.get(); } - public Collection getTxListFromPending() { - Set result = new HashSet<>(); + public Collection getTxListFromPending() { + Set result = new HashSet<>(); pendingTransactions.forEach(tx -> { - result.add(tx.getInstance()); + result.add(tx.getTransactionId().toString()); }); rePushTransactions.forEach(tx -> { - result.add(tx.getInstance()); + result.add(tx.getTransactionId().toString()); }); return result; } diff --git a/framework/src/main/java/org/tron/core/services/RpcApiService.java b/framework/src/main/java/org/tron/core/services/RpcApiService.java index 796c67a484a..bf9e9956f37 100755 --- a/framework/src/main/java/org/tron/core/services/RpcApiService.java +++ b/framework/src/main/java/org/tron/core/services/RpcApiService.java @@ -74,6 +74,7 @@ import org.tron.api.GrpcAPI.SpendResult; import org.tron.api.GrpcAPI.TransactionApprovedList; import org.tron.api.GrpcAPI.TransactionExtention; +import org.tron.api.GrpcAPI.TransactionIdList; import org.tron.api.GrpcAPI.TransactionInfoList; import org.tron.api.GrpcAPI.TransactionList; import org.tron.api.GrpcAPI.TransactionListExtention; @@ -2636,7 +2637,7 @@ public void getTransactionFromPending(BytesMessage request, @Override public void getTransactionListFromPending(EmptyMessage request, - StreamObserver responseObserver) { + StreamObserver responseObserver) { getTransactionListFromPendingCommon(request, responseObserver); } @@ -2740,10 +2741,10 @@ public void getTransactionFromPendingCommon(BytesMessage request, } public void getTransactionListFromPendingCommon(EmptyMessage request, - StreamObserver responseObserver) { + StreamObserver responseObserver) { try { - TransactionList.Builder builder = TransactionList.newBuilder(); - builder.addAllTransaction(dbManager.getTxListFromPending()); + TransactionIdList.Builder builder = TransactionIdList.newBuilder(); + builder.addAllTxId(dbManager.getTxListFromPending()); responseObserver.onNext(builder.build()); } catch (Exception e) { responseObserver.onError(e); diff --git a/framework/src/main/java/org/tron/core/services/http/GetTransactionListFromPendingServlet.java b/framework/src/main/java/org/tron/core/services/http/GetTransactionListFromPendingServlet.java index 0ed2498eb5c..bab6ee2a705 100644 --- a/framework/src/main/java/org/tron/core/services/http/GetTransactionListFromPendingServlet.java +++ b/framework/src/main/java/org/tron/core/services/http/GetTransactionListFromPendingServlet.java @@ -1,11 +1,13 @@ package org.tron.core.services.http; +import com.google.protobuf.ByteString; import java.util.Collection; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import org.tron.api.GrpcAPI.TransactionIdList; import org.tron.api.GrpcAPI.TransactionList; import org.tron.core.db.Manager; import org.tron.protos.Protocol.Transaction; @@ -21,9 +23,9 @@ public class GetTransactionListFromPendingServlet extends RateLimiterServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) { try { boolean visible = Util.getVisible(request); - Collection result = manager.getTxListFromPending(); - TransactionList.Builder builder = TransactionList.newBuilder(); - builder.addAllTransaction(result); + Collection result = manager.getTxListFromPending(); + TransactionIdList.Builder builder = TransactionIdList.newBuilder(); + builder.addAllTxId(result); response.getWriter().println(Util.printTransactionList(builder.build(), visible)); } catch (Exception e) { Util.processError(e, response); @@ -33,9 +35,9 @@ protected void doGet(HttpServletRequest request, HttpServletResponse response) { protected void doPost(HttpServletRequest request, HttpServletResponse response) { try { PostParams params = PostParams.getPostParams(request); - Collection result = manager.getTxListFromPending(); - TransactionList.Builder builder = TransactionList.newBuilder(); - builder.addAllTransaction(result); + Collection result = manager.getTxListFromPending(); + TransactionIdList.Builder builder = TransactionIdList.newBuilder(); + builder.addAllTxId(result); response.getWriter() .println(Util.printTransactionList(builder.build(), params.isVisible())); } catch (Exception e) { diff --git a/framework/src/main/java/org/tron/core/services/http/Util.java b/framework/src/main/java/org/tron/core/services/http/Util.java index 1cc6c47ec35..7f3506f8fcf 100644 --- a/framework/src/main/java/org/tron/core/services/http/Util.java +++ b/framework/src/main/java/org/tron/core/services/http/Util.java @@ -29,6 +29,7 @@ import org.tron.api.GrpcAPI.EasyTransferResponse; import org.tron.api.GrpcAPI.TransactionApprovedList; import org.tron.api.GrpcAPI.TransactionExtention; +import org.tron.api.GrpcAPI.TransactionIdList; import org.tron.api.GrpcAPI.TransactionList; import org.tron.api.GrpcAPI.TransactionSignWeight; import org.tron.common.crypto.Hash; @@ -57,6 +58,7 @@ public class Util { public static final String PERMISSION_ID = "Permission_id"; public static final String VISIBLE = "visible"; public static final String TRANSACTION = "transaction"; + public static final String TRANSACTION_ID = "transactionId"; public static final String VALUE = "value"; public static final String CONTRACT_TYPE = "contractType"; public static final String EXTRA_DATA = "extra_data"; @@ -112,6 +114,17 @@ public static String printTransactionList(TransactionList list, boolean selfType return jsonObject.toJSONString(); } + public static String printTransactionList(TransactionIdList list, boolean selfType) { + List transactions = list.getTxIdList(); + JSONObject jsonObject = JSONObject.parseObject(JsonFormat.printToString(list, selfType)); + JSONArray jsonArray = new JSONArray(); + transactions.stream() + .forEach(transaction -> jsonArray.add(transaction)); + jsonObject.put(TRANSACTION_ID, jsonArray); + + return jsonObject.toJSONString(); + } + public static JSONArray printTransactionListToJSON(List list, boolean selfType) { JSONArray transactions = new JSONArray(); diff --git a/framework/src/test/java/stest/tron/wallet/dailybuild/transaction/TransactionPendingQuery001.java b/framework/src/test/java/stest/tron/wallet/dailybuild/transaction/TransactionPendingQuery001.java index 7ef6e33ffab..49831ca92b0 100644 --- a/framework/src/test/java/stest/tron/wallet/dailybuild/transaction/TransactionPendingQuery001.java +++ b/framework/src/test/java/stest/tron/wallet/dailybuild/transaction/TransactionPendingQuery001.java @@ -10,6 +10,7 @@ import org.testng.annotations.BeforeSuite; import org.testng.annotations.Test; import org.tron.api.GrpcAPI.EmptyMessage; +import org.tron.api.GrpcAPI.TransactionIdList; import org.tron.api.GrpcAPI.TransactionList; import org.tron.api.WalletGrpc; import org.tron.api.WalletSolidityGrpc; @@ -98,19 +99,18 @@ public void test01GetPendingSize() { @Test(enabled = true, description = "Test get pending transaction list") public void test02GetPendingTransactionList() { int retryTimes = 100; - TransactionList transactionList = blockingStubFull + TransactionIdList transactionList = blockingStubFull .getTransactionListFromPending(EmptyMessage.newBuilder().build()); - while (transactionList.getTransactionCount() == 0 && retryTimes-- > 0) { + while (transactionList.getTxIdCount() == 0 && retryTimes-- > 0) { PublicMethed.sendcoin(receiverAddress,1L,fromAddress,testKey002,blockingStubFull); if (retryTimes % 5 == 0) { transactionList = blockingStubFull .getTransactionListFromPending(EmptyMessage.newBuilder().build()); } } - Assert.assertNotEquals(transactionList.getTransactionCount(),0); + Assert.assertNotEquals(transactionList.getTxIdCount(),0); - txid = ByteArray.toHexString(Sha256Hash - .hash(true, transactionList.getTransaction(0).getRawData().toByteArray())); + txid = transactionList.getTxId(0); logger.info("txid:" + txid); diff --git a/protocol/src/main/protos/api/api.proto b/protocol/src/main/protos/api/api.proto index e9e66511dc5..87ddf603d15 100644 --- a/protocol/src/main/protos/api/api.proto +++ b/protocol/src/main/protos/api/api.proto @@ -784,7 +784,7 @@ service Wallet { rpc GetTransactionFromPending (BytesMessage) returns (Transaction) { } - rpc GetTransactionListFromPending (EmptyMessage) returns (TransactionList) { + rpc GetTransactionListFromPending (EmptyMessage) returns (TransactionIdList) { } rpc GetPendingSize (EmptyMessage) returns (NumberMessage) { @@ -1084,6 +1084,9 @@ message BlockList { message TransactionList { repeated Transaction transaction = 1; } +message TransactionIdList { + repeated string txId = 1; +} message DelegatedResourceMessage { bytes fromAddress = 1; bytes toAddress = 2; From 25d222dccd3ef6ba6ee79a6fa01eeecbe0eb2428 Mon Sep 17 00:00:00 2001 From: lvs007 Date: Wed, 17 Mar 2021 18:52:19 +0800 Subject: [PATCH 26/32] format code --- .../org/tron/core/services/http/FullNodeHttpApiService.java | 6 ++++-- .../tron/core/services/WitnessProductBlockServiceTest.java | 4 ++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/framework/src/main/java/org/tron/core/services/http/FullNodeHttpApiService.java b/framework/src/main/java/org/tron/core/services/http/FullNodeHttpApiService.java index 19ed428e75b..1c219f35bbf 100644 --- a/framework/src/main/java/org/tron/core/services/http/FullNodeHttpApiService.java +++ b/framework/src/main/java/org/tron/core/services/http/FullNodeHttpApiService.java @@ -524,8 +524,10 @@ public void start() { context.addServlet(new ServletHolder(getBlockBalanceServlet), "/wallet/getblockbalance"); context.addServlet(new ServletHolder(getBurnTrxServlet), "/wallet/getburntrx"); - context.addServlet(new ServletHolder(getTransactionFromPendingServlet), "/wallet/gettransactionfrompending"); - context.addServlet(new ServletHolder(getTransactionListFromPendingServlet), "/wallet/gettransactionlistfrompending"); + context.addServlet(new ServletHolder(getTransactionFromPendingServlet), + "/wallet/gettransactionfrompending"); + context.addServlet(new ServletHolder(getTransactionListFromPendingServlet), + "/wallet/gettransactionlistfrompending"); context.addServlet(new ServletHolder(getPendingSizeServlet), "/wallet/getpendingsize"); int maxHttpConnectNumber = Args.getInstance().getMaxHttpConnectNumber(); diff --git a/framework/src/test/java/org/tron/core/services/WitnessProductBlockServiceTest.java b/framework/src/test/java/org/tron/core/services/WitnessProductBlockServiceTest.java index 60f24c7296a..0b915b766b9 100644 --- a/framework/src/test/java/org/tron/core/services/WitnessProductBlockServiceTest.java +++ b/framework/src/test/java/org/tron/core/services/WitnessProductBlockServiceTest.java @@ -88,13 +88,13 @@ public void validWitnessProductTwoBlockTest() { Assert.assertEquals(block.getBlockCapsuleSet().contains(blockCapsule2), true); Iterator iterator = block.getBlockCapsuleSet() - .iterator(); + .iterator(); boolean isInner = false; while (iterator.hasNext()) { BlockCapsule blockCapsule = iterator.next(); blockCapsule.getBlockId(); if (blockCapsule.getBlockId().equals(blockCapsule1.getBlockId())) { - isInner = true; + isInner = true; } } Assert.assertTrue(isInner); From cff65bcf350b853c540468389cbcac28899ad379 Mon Sep 17 00:00:00 2001 From: lvs007 Date: Wed, 17 Mar 2021 18:57:46 +0800 Subject: [PATCH 27/32] modify the method name --- .../http/GetTransactionListFromPendingServlet.java | 7 ++----- .../src/main/java/org/tron/core/services/http/Util.java | 2 +- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/framework/src/main/java/org/tron/core/services/http/GetTransactionListFromPendingServlet.java b/framework/src/main/java/org/tron/core/services/http/GetTransactionListFromPendingServlet.java index bab6ee2a705..0a70b22eebf 100644 --- a/framework/src/main/java/org/tron/core/services/http/GetTransactionListFromPendingServlet.java +++ b/framework/src/main/java/org/tron/core/services/http/GetTransactionListFromPendingServlet.java @@ -1,6 +1,5 @@ package org.tron.core.services.http; -import com.google.protobuf.ByteString; import java.util.Collection; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @@ -8,9 +7,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.tron.api.GrpcAPI.TransactionIdList; -import org.tron.api.GrpcAPI.TransactionList; import org.tron.core.db.Manager; -import org.tron.protos.Protocol.Transaction; @Component @@ -26,7 +23,7 @@ protected void doGet(HttpServletRequest request, HttpServletResponse response) { Collection result = manager.getTxListFromPending(); TransactionIdList.Builder builder = TransactionIdList.newBuilder(); builder.addAllTxId(result); - response.getWriter().println(Util.printTransactionList(builder.build(), visible)); + response.getWriter().println(Util.printTransactionIdList(builder.build(), visible)); } catch (Exception e) { Util.processError(e, response); } @@ -39,7 +36,7 @@ protected void doPost(HttpServletRequest request, HttpServletResponse response) TransactionIdList.Builder builder = TransactionIdList.newBuilder(); builder.addAllTxId(result); response.getWriter() - .println(Util.printTransactionList(builder.build(), params.isVisible())); + .println(Util.printTransactionIdList(builder.build(), params.isVisible())); } catch (Exception e) { Util.processError(e, response); } diff --git a/framework/src/main/java/org/tron/core/services/http/Util.java b/framework/src/main/java/org/tron/core/services/http/Util.java index 7f3506f8fcf..6004e11f711 100644 --- a/framework/src/main/java/org/tron/core/services/http/Util.java +++ b/framework/src/main/java/org/tron/core/services/http/Util.java @@ -114,7 +114,7 @@ public static String printTransactionList(TransactionList list, boolean selfType return jsonObject.toJSONString(); } - public static String printTransactionList(TransactionIdList list, boolean selfType) { + public static String printTransactionIdList(TransactionIdList list, boolean selfType) { List transactions = list.getTxIdList(); JSONObject jsonObject = JSONObject.parseObject(JsonFormat.printToString(list, selfType)); JSONArray jsonArray = new JSONArray(); From 824f9a7b8e1fbcb95d5c7462f739a471f7be078d Mon Sep 17 00:00:00 2001 From: lvs007 Date: Wed, 17 Mar 2021 19:59:09 +0800 Subject: [PATCH 28/32] remove return result --- .../src/main/java/org/tron/core/services/http/Util.java | 5 ----- .../dailybuild/http/HttpTestTransactionPending001.java | 7 ++----- 2 files changed, 2 insertions(+), 10 deletions(-) diff --git a/framework/src/main/java/org/tron/core/services/http/Util.java b/framework/src/main/java/org/tron/core/services/http/Util.java index 6004e11f711..b517a0ea1c1 100644 --- a/framework/src/main/java/org/tron/core/services/http/Util.java +++ b/framework/src/main/java/org/tron/core/services/http/Util.java @@ -58,7 +58,6 @@ public class Util { public static final String PERMISSION_ID = "Permission_id"; public static final String VISIBLE = "visible"; public static final String TRANSACTION = "transaction"; - public static final String TRANSACTION_ID = "transactionId"; public static final String VALUE = "value"; public static final String CONTRACT_TYPE = "contractType"; public static final String EXTRA_DATA = "extra_data"; @@ -117,10 +116,6 @@ public static String printTransactionList(TransactionList list, boolean selfType public static String printTransactionIdList(TransactionIdList list, boolean selfType) { List transactions = list.getTxIdList(); JSONObject jsonObject = JSONObject.parseObject(JsonFormat.printToString(list, selfType)); - JSONArray jsonArray = new JSONArray(); - transactions.stream() - .forEach(transaction -> jsonArray.add(transaction)); - jsonObject.put(TRANSACTION_ID, jsonArray); return jsonObject.toJSONString(); } diff --git a/framework/src/test/java/stest/tron/wallet/dailybuild/http/HttpTestTransactionPending001.java b/framework/src/test/java/stest/tron/wallet/dailybuild/http/HttpTestTransactionPending001.java index 877ad403e2c..8bab53d8a76 100644 --- a/framework/src/test/java/stest/tron/wallet/dailybuild/http/HttpTestTransactionPending001.java +++ b/framework/src/test/java/stest/tron/wallet/dailybuild/http/HttpTestTransactionPending001.java @@ -64,15 +64,12 @@ public void test02GetPendingTransactionList() { if (retryTimes % 5 == 0) { response = HttpMethed.getTransactionListFromPending(httpnode); responseContent = HttpMethed.parseResponseContent(response); - transactionSize = responseContent.getJSONArray("transaction").size(); + transactionSize = responseContent.getJSONArray("txId").size(); } } Assert.assertNotEquals(transactionSize,0); - transaction = responseContent.getJSONArray("transaction").getJSONObject(0); - HttpMethed.printJsonContent(transaction); - txid = transaction.getString("txID"); - Assert.assertTrue(transaction.containsKey("raw_data")); + txid = responseContent.getJSONArray("txId").getString(0); } From b7f71e218efcaf171e8def7003ca8b3d1b57e27f Mon Sep 17 00:00:00 2001 From: pangpangfeng <7577288@qq.com> Date: Wed, 17 Mar 2021 20:14:33 +0800 Subject: [PATCH 29/32] Stest case adapt api of gettransactionlistfrompending fix --- .../wallet/dailybuild/http/HttpTestTransactionPending001.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/src/test/java/stest/tron/wallet/dailybuild/http/HttpTestTransactionPending001.java b/framework/src/test/java/stest/tron/wallet/dailybuild/http/HttpTestTransactionPending001.java index 8bab53d8a76..e8fdf17d559 100644 --- a/framework/src/test/java/stest/tron/wallet/dailybuild/http/HttpTestTransactionPending001.java +++ b/framework/src/test/java/stest/tron/wallet/dailybuild/http/HttpTestTransactionPending001.java @@ -82,7 +82,7 @@ public void test03GetPendingTransactionList() { responseContent = HttpMethed.parseResponseContent(response); HttpMethed.printJsonContent(responseContent); - Assert.assertEquals(transaction,responseContent); + Assert.assertEquals(txid,responseContent.getString("txID")); Assert.assertNotEquals(null,responseContent); } From 32c85ad63164c189cc882186126e2ba096052843 Mon Sep 17 00:00:00 2001 From: pangpangfeng <7577288@qq.com> Date: Thu, 18 Mar 2021 11:52:34 +0800 Subject: [PATCH 30/32] opt_stest_case --- .../tron/wallet/dailybuild/account/TransactionFee001.java | 3 ++- .../internaltransaction/ContractInternalTransaction003.java | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/framework/src/test/java/stest/tron/wallet/dailybuild/account/TransactionFee001.java b/framework/src/test/java/stest/tron/wallet/dailybuild/account/TransactionFee001.java index 58f0048057f..03fe49f1376 100644 --- a/framework/src/test/java/stest/tron/wallet/dailybuild/account/TransactionFee001.java +++ b/framework/src/test/java/stest/tron/wallet/dailybuild/account/TransactionFee001.java @@ -30,6 +30,7 @@ import stest.tron.wallet.common.client.Parameter.CommonConstant; import stest.tron.wallet.common.client.utils.PublicMethed; import stest.tron.wallet.common.client.utils.PublicMethedForMutiSign; +import stest.tron.wallet.common.client.utils.Retry; import stest.tron.wallet.common.client.utils.Sha256Hash; @@ -181,7 +182,7 @@ public void test01DeployContractEnergyFeeToSr() { Assert.assertEquals(beforeBurnTrxAmount,afterBurnTrxAmount); } - @Test(enabled = true, description = "Test update account permission fee to black hole," + @Test(enabled = true, retryAnalyzer = Retry.class,description = "Test update account permission fee to black hole," + "trans with multi sign and fee to sr") public void test02UpdateAccountPermissionAndMultiSiginTrans() { ECKey ecKey1 = new ECKey(Utils.getRandom()); diff --git a/framework/src/test/java/stest/tron/wallet/dailybuild/internaltransaction/ContractInternalTransaction003.java b/framework/src/test/java/stest/tron/wallet/dailybuild/internaltransaction/ContractInternalTransaction003.java index 7918d6a9817..907a9e0282d 100644 --- a/framework/src/test/java/stest/tron/wallet/dailybuild/internaltransaction/ContractInternalTransaction003.java +++ b/framework/src/test/java/stest/tron/wallet/dailybuild/internaltransaction/ContractInternalTransaction003.java @@ -26,6 +26,7 @@ import stest.tron.wallet.common.client.Parameter.CommonConstant; import stest.tron.wallet.common.client.utils.Base58; import stest.tron.wallet.common.client.utils.PublicMethed; +import stest.tron.wallet.common.client.utils.Retry; @Slf4j @@ -445,7 +446,7 @@ public void testInternalTransaction017() { dupInternalTrsansactionHash(infoById.get().getInternalTransactionsList()); } - @Test(enabled = true, description = "Test maxfeelimit can trigger call create call max time") + @Test(enabled = true,retryAnalyzer = Retry.class,description = "Test maxfeelimit can trigger call create call max time") public void testInternalTransaction018() { Assert.assertTrue(PublicMethed .sendcoin(internalTxsAddress, 100000000000L, testNetAccountAddress, testNetAccountKey, From 7b939e4218560151052f9f30c069d8d04918e7e5 Mon Sep 17 00:00:00 2001 From: pangpangfeng <7577288@qq.com> Date: Thu, 18 Mar 2021 11:53:55 +0800 Subject: [PATCH 31/32] opt_stest_case --- .../tron/wallet/dailybuild/account/TransactionFee001.java | 3 ++- .../internaltransaction/ContractInternalTransaction003.java | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/framework/src/test/java/stest/tron/wallet/dailybuild/account/TransactionFee001.java b/framework/src/test/java/stest/tron/wallet/dailybuild/account/TransactionFee001.java index 03fe49f1376..dcd8305887e 100644 --- a/framework/src/test/java/stest/tron/wallet/dailybuild/account/TransactionFee001.java +++ b/framework/src/test/java/stest/tron/wallet/dailybuild/account/TransactionFee001.java @@ -182,7 +182,8 @@ public void test01DeployContractEnergyFeeToSr() { Assert.assertEquals(beforeBurnTrxAmount,afterBurnTrxAmount); } - @Test(enabled = true, retryAnalyzer = Retry.class,description = "Test update account permission fee to black hole," + @Test(enabled = true, retryAnalyzer = Retry.class, + description = "Test update account permission fee to black hole," + "trans with multi sign and fee to sr") public void test02UpdateAccountPermissionAndMultiSiginTrans() { ECKey ecKey1 = new ECKey(Utils.getRandom()); diff --git a/framework/src/test/java/stest/tron/wallet/dailybuild/internaltransaction/ContractInternalTransaction003.java b/framework/src/test/java/stest/tron/wallet/dailybuild/internaltransaction/ContractInternalTransaction003.java index 907a9e0282d..97983643668 100644 --- a/framework/src/test/java/stest/tron/wallet/dailybuild/internaltransaction/ContractInternalTransaction003.java +++ b/framework/src/test/java/stest/tron/wallet/dailybuild/internaltransaction/ContractInternalTransaction003.java @@ -446,7 +446,8 @@ public void testInternalTransaction017() { dupInternalTrsansactionHash(infoById.get().getInternalTransactionsList()); } - @Test(enabled = true,retryAnalyzer = Retry.class,description = "Test maxfeelimit can trigger call create call max time") + @Test(enabled = true,retryAnalyzer = Retry.class, + description = "Test maxfeelimit can trigger call create call max time") public void testInternalTransaction018() { Assert.assertTrue(PublicMethed .sendcoin(internalTxsAddress, 100000000000L, testNetAccountAddress, testNetAccountKey, From 720395a19c566535e9b63e2aa29476eb218cd3d0 Mon Sep 17 00:00:00 2001 From: lvs007 Date: Thu, 18 Mar 2021 14:52:05 +0800 Subject: [PATCH 32/32] fix sonar error --- .../src/main/java/org/tron/core/config/args/Args.java | 8 ++++---- framework/src/main/java/org/tron/core/db/Manager.java | 2 +- .../src/main/java/org/tron/core/services/http/Util.java | 1 - 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/framework/src/main/java/org/tron/core/config/args/Args.java b/framework/src/main/java/org/tron/core/config/args/Args.java index 61bd844dd15..9187c519f09 100644 --- a/framework/src/main/java/org/tron/core/config/args/Args.java +++ b/framework/src/main/java/org/tron/core/config/args/Args.java @@ -746,10 +746,10 @@ public static void setParam(final String[] args, final String confFileName) { PARAMETER.historyBalanceLookup = config.hasPath(Constant.HISTORY_BALANCE_LOOKUP) && config .getBoolean(Constant.HISTORY_BALANCE_LOOKUP); - PARAMETER.openPrintLog = config.hasPath(Constant.OPEN_PRINT_LOG) ? config - .getBoolean(Constant.OPEN_PRINT_LOG) : true; - PARAMETER.openTransactionSort = config.hasPath(Constant.OPEN_TRANSACTION_SORT) ? config - .getBoolean(Constant.OPEN_TRANSACTION_SORT) : false; + PARAMETER.openPrintLog = config.hasPath(Constant.OPEN_PRINT_LOG) && config + .getBoolean(Constant.OPEN_PRINT_LOG); + PARAMETER.openTransactionSort = config.hasPath(Constant.OPEN_TRANSACTION_SORT) && config + .getBoolean(Constant.OPEN_TRANSACTION_SORT); logConfig(); } diff --git a/framework/src/main/java/org/tron/core/db/Manager.java b/framework/src/main/java/org/tron/core/db/Manager.java index fdc72661d2f..ccb8342d722 100644 --- a/framework/src/main/java/org/tron/core/db/Manager.java +++ b/framework/src/main/java/org/tron/core/db/Manager.java @@ -345,7 +345,7 @@ public void stopRePushTriggerThread() { isRunTriggerCapsuleProcessThread = false; } - Comparator downComparator = (Comparator) (o1, o2) -> Long + private Comparator downComparator = (Comparator) (o1, o2) -> Long .compare(o2.getOrder(), o1.getOrder()); @PostConstruct diff --git a/framework/src/main/java/org/tron/core/services/http/Util.java b/framework/src/main/java/org/tron/core/services/http/Util.java index b517a0ea1c1..730daaf6223 100644 --- a/framework/src/main/java/org/tron/core/services/http/Util.java +++ b/framework/src/main/java/org/tron/core/services/http/Util.java @@ -114,7 +114,6 @@ public static String printTransactionList(TransactionList list, boolean selfType } public static String printTransactionIdList(TransactionIdList list, boolean selfType) { - List transactions = list.getTxIdList(); JSONObject jsonObject = JSONObject.parseObject(JsonFormat.printToString(list, selfType)); return jsonObject.toJSONString();