Skip to content

Commit 1d7e963

Browse files
committed
add the query pending transaction interface
1 parent 4fd9d33 commit 1d7e963

14 files changed

Lines changed: 363 additions & 1 deletion

framework/src/main/java/org/tron/core/db/Manager.java

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import com.google.protobuf.ByteString;
1717
import java.util.ArrayList;
1818
import java.util.Arrays;
19+
import java.util.Collection;
1920
import java.util.Collections;
2021
import java.util.HashSet;
2122
import java.util.Iterator;
@@ -35,6 +36,7 @@
3536
import java.util.concurrent.TimeUnit;
3637
import java.util.concurrent.atomic.AtomicInteger;
3738
import java.util.concurrent.atomic.AtomicLong;
39+
import java.util.concurrent.atomic.AtomicReference;
3840
import java.util.stream.Collectors;
3941
import java.util.stream.LongStream;
4042
import javax.annotation.PostConstruct;
@@ -1271,7 +1273,8 @@ public synchronized BlockCapsule generateBlock(Miner miner, long blockTime, long
12711273
iterator.remove();
12721274
}
12731275
} catch (Exception e) {
1274-
logger.error("Process trx {} failed when generating block: {}", trx.getTransactionId() ,e.getMessage());
1276+
logger.error("Process trx {} failed when generating block: {}", trx.getTransactionId(),
1277+
e.getMessage());
12751278
}
12761279
}
12771280

@@ -1778,4 +1781,35 @@ public Boolean call() throws ValidateSignatureException {
17781781
return true;
17791782
}
17801783
}
1784+
1785+
public TransactionCapsule getTxFromPending(String txId) {
1786+
AtomicReference<TransactionCapsule> transactionCapsule = new AtomicReference<>();
1787+
pendingTransactions.forEach(tx -> {
1788+
if (tx.getTransactionId().toString().equals(txId)) {
1789+
transactionCapsule.set(tx);
1790+
return;
1791+
}
1792+
});
1793+
if (transactionCapsule.get() != null) {
1794+
return transactionCapsule.get();
1795+
}
1796+
rePushTransactions.forEach(tx -> {
1797+
if (tx.getTransactionId().toString().equals(txId)) {
1798+
transactionCapsule.set(tx);
1799+
return;
1800+
}
1801+
});
1802+
return transactionCapsule.get();
1803+
}
1804+
1805+
public Collection<Transaction> getTxListFromPending() {
1806+
Set<Transaction> result = new HashSet<>();
1807+
pendingTransactions.forEach(tx -> {
1808+
result.add(tx.getInstance());
1809+
});
1810+
rePushTransactions.forEach(tx -> {
1811+
result.add(tx.getInstance());
1812+
});
1813+
return result;
1814+
}
17811815
}

framework/src/main/java/org/tron/core/services/RpcApiService.java

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -901,6 +901,17 @@ public void getTransactionInfoByBlockNum(NumberMessage request,
901901
responseObserver.onCompleted();
902902
}
903903

904+
@Override
905+
public void getTransactionFromPending(BytesMessage request,
906+
StreamObserver<Transaction> responseObserver) {
907+
getTransactionFromPendingCommon(request, responseObserver);
908+
}
909+
910+
@Override
911+
public void getTransactionListFromPending(EmptyMessage request,
912+
StreamObserver<TransactionList> responseObserver) {
913+
getTransactionListFromPendingCommon(request, responseObserver);
914+
}
904915
}
905916

906917
/**
@@ -2628,6 +2639,18 @@ public void getMarketPairList(EmptyMessage request,
26282639
}
26292640
responseObserver.onCompleted();
26302641
}
2642+
2643+
@Override
2644+
public void getTransactionFromPending(BytesMessage request,
2645+
StreamObserver<Transaction> responseObserver) {
2646+
getTransactionFromPendingCommon(request, responseObserver);
2647+
}
2648+
2649+
@Override
2650+
public void getTransactionListFromPending(EmptyMessage request,
2651+
StreamObserver<TransactionList> responseObserver) {
2652+
getTransactionListFromPendingCommon(request, responseObserver);
2653+
}
26312654
}
26322655

26332656
public class MonitorApi extends MonitorGrpc.MonitorImplBase {
@@ -2710,4 +2733,27 @@ public void getTransactionCountByBlockNumCommon(NumberMessage request,
27102733
responseObserver.onCompleted();
27112734
}
27122735

2736+
public void getTransactionFromPendingCommon(BytesMessage request,
2737+
StreamObserver<Transaction> responseObserver) {
2738+
try {
2739+
String txId = ByteArray.toHexString(request.getValue().toByteArray());
2740+
TransactionCapsule transactionCapsule = dbManager.getTxFromPending(txId);
2741+
responseObserver.onNext(transactionCapsule == null ? null : transactionCapsule.getInstance());
2742+
} catch (Exception e) {
2743+
responseObserver.onError(e);
2744+
}
2745+
responseObserver.onCompleted();
2746+
}
2747+
2748+
public void getTransactionListFromPendingCommon(EmptyMessage request,
2749+
StreamObserver<TransactionList> responseObserver) {
2750+
try {
2751+
TransactionList.Builder builder = TransactionList.newBuilder();
2752+
builder.addAllTransaction(dbManager.getTxListFromPending());
2753+
responseObserver.onNext(builder.build());
2754+
} catch (Exception e) {
2755+
responseObserver.onError(e);
2756+
}
2757+
responseObserver.onCompleted();
2758+
}
27132759
}

framework/src/main/java/org/tron/core/services/http/FullNodeHttpApiService.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -278,6 +278,10 @@ public class FullNodeHttpApiService implements Service {
278278

279279
@Autowired
280280
private LiteFnQueryHttpFilter liteFnQueryHttpFilter;
281+
@Autowired
282+
private GetTransactionFromPendingServlet getTransactionFromPendingServlet;
283+
@Autowired
284+
private GetTransactionListFromPendingServlet getTransactionListFromPendingServlet;
281285

282286
private static String getParamsFile(String fileName) {
283287
InputStream in = Thread.currentThread().getContextClassLoader()
@@ -518,6 +522,8 @@ public void start() {
518522
context.addServlet(new ServletHolder(getBlockBalanceServlet),
519523
"/wallet/getblockbalance");
520524
context.addServlet(new ServletHolder(getBurnTrxServlet), "/wallet/getburntrx");
525+
context.addServlet(new ServletHolder(getTransactionFromPendingServlet), "/wallet/gettransactionfrompending");
526+
context.addServlet(new ServletHolder(getTransactionListFromPendingServlet), "/wallet/gettransactionlistfrompending");
521527

522528
int maxHttpConnectNumber = Args.getInstance().getMaxHttpConnectNumber();
523529
if (maxHttpConnectNumber > 0) {
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
package org.tron.core.services.http;
2+
3+
import javax.servlet.http.HttpServletRequest;
4+
import javax.servlet.http.HttpServletResponse;
5+
import lombok.extern.slf4j.Slf4j;
6+
import org.springframework.beans.factory.annotation.Autowired;
7+
import org.springframework.stereotype.Component;
8+
import org.tron.api.GrpcAPI.BytesMessage;
9+
import org.tron.common.utils.ByteArray;
10+
import org.tron.core.capsule.TransactionCapsule;
11+
import org.tron.core.db.Manager;
12+
13+
14+
@Component
15+
@Slf4j(topic = "API")
16+
public class GetTransactionFromPendingServlet extends RateLimiterServlet {
17+
18+
@Autowired
19+
private Manager manager;
20+
21+
protected void doGet(HttpServletRequest request, HttpServletResponse response) {
22+
try {
23+
boolean visible = Util.getVisible(request);
24+
String input = request.getParameter("value");
25+
TransactionCapsule reply = manager.getTxFromPending(input);
26+
if (reply != null) {
27+
response.getWriter().println(Util.printTransaction(reply.getInstance(), visible));
28+
} else {
29+
response.getWriter().println("{}");
30+
}
31+
} catch (Exception e) {
32+
Util.processError(e, response);
33+
}
34+
}
35+
36+
protected void doPost(HttpServletRequest request, HttpServletResponse response) {
37+
try {
38+
PostParams params = PostParams.getPostParams(request);
39+
BytesMessage.Builder build = BytesMessage.newBuilder();
40+
JsonFormat.merge(params.getParams(), build, params.isVisible());
41+
TransactionCapsule reply = manager
42+
.getTxFromPending(ByteArray.toHexString(build.getValue().toByteArray()));
43+
if (reply != null) {
44+
response.getWriter()
45+
.println(Util.printTransaction(reply.getInstance(), params.isVisible()));
46+
} else {
47+
response.getWriter().println("{}");
48+
}
49+
} catch (Exception e) {
50+
Util.processError(e, response);
51+
}
52+
}
53+
}
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package org.tron.core.services.http;
2+
3+
import java.util.Collection;
4+
import javax.servlet.http.HttpServletRequest;
5+
import javax.servlet.http.HttpServletResponse;
6+
import lombok.extern.slf4j.Slf4j;
7+
import org.springframework.beans.factory.annotation.Autowired;
8+
import org.springframework.stereotype.Component;
9+
import org.tron.api.GrpcAPI.TransactionList;
10+
import org.tron.core.db.Manager;
11+
import org.tron.protos.Protocol.Transaction;
12+
13+
14+
@Component
15+
@Slf4j(topic = "API")
16+
public class GetTransactionListFromPendingServlet extends RateLimiterServlet {
17+
18+
@Autowired
19+
private Manager manager;
20+
21+
protected void doGet(HttpServletRequest request, HttpServletResponse response) {
22+
try {
23+
boolean visible = Util.getVisible(request);
24+
Collection<Transaction> result = manager.getTxListFromPending();
25+
TransactionList.Builder builder = TransactionList.newBuilder();
26+
builder.addAllTransaction(result);
27+
response.getWriter().println(Util.printTransactionList(builder.build(), visible));
28+
} catch (Exception e) {
29+
Util.processError(e, response);
30+
}
31+
}
32+
33+
protected void doPost(HttpServletRequest request, HttpServletResponse response) {
34+
try {
35+
PostParams params = PostParams.getPostParams(request);
36+
Collection<Transaction> result = manager.getTxListFromPending();
37+
TransactionList.Builder builder = TransactionList.newBuilder();
38+
builder.addAllTransaction(result);
39+
response.getWriter()
40+
.println(Util.printTransactionList(builder.build(), params.isVisible()));
41+
} catch (Exception e) {
42+
Util.processError(e, response);
43+
}
44+
}
45+
}

framework/src/main/java/org/tron/core/services/interfaceOnPBFT/RpcApiServiceOnPBFT.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
import org.tron.api.GrpcAPI.PaginatedMessage;
3131
import org.tron.api.GrpcAPI.SpendResult;
3232
import org.tron.api.GrpcAPI.TransactionExtention;
33+
import org.tron.api.GrpcAPI.TransactionList;
3334
import org.tron.api.GrpcAPI.WitnessList;
3435
import org.tron.api.WalletSolidityGrpc.WalletSolidityImplBase;
3536
import org.tron.common.application.Service;
@@ -495,5 +496,21 @@ public void getBurnTrx(EmptyMessage request, StreamObserver<NumberMessage> respo
495496
() -> rpcApiService.getWalletSolidityApi().getBurnTrx(request, responseObserver)
496497
);
497498
}
499+
500+
@Override
501+
public void getTransactionFromPending(BytesMessage request,
502+
StreamObserver<Transaction> responseObserver) {
503+
walletOnPBFT.futureGet(() -> rpcApiService.getWalletSolidityApi()
504+
.getTransactionFromPending(request, responseObserver)
505+
);
506+
}
507+
508+
@Override
509+
public void getTransactionListFromPending(EmptyMessage request,
510+
StreamObserver<TransactionList> responseObserver) {
511+
walletOnPBFT.futureGet(() -> rpcApiService.getWalletSolidityApi()
512+
.getTransactionListFromPending(request, responseObserver)
513+
);
514+
}
498515
}
499516
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package org.tron.core.services.interfaceOnPBFT.http;
2+
3+
import javax.servlet.http.HttpServletRequest;
4+
import javax.servlet.http.HttpServletResponse;
5+
import lombok.extern.slf4j.Slf4j;
6+
import org.springframework.beans.factory.annotation.Autowired;
7+
import org.springframework.stereotype.Component;
8+
import org.tron.core.services.http.GetBurnTrxServlet;
9+
import org.tron.core.services.http.GetTransactionFromPendingServlet;
10+
import org.tron.core.services.interfaceOnPBFT.WalletOnPBFT;
11+
12+
13+
@Component
14+
@Slf4j(topic = "API")
15+
public class GetTransactionFromPendingOnPBFTServlet extends GetTransactionFromPendingServlet {
16+
17+
@Autowired
18+
private WalletOnPBFT walletOnPBFT;
19+
20+
protected void doGet(HttpServletRequest request, HttpServletResponse response) {
21+
walletOnPBFT.futureGet(() -> super.doGet(request, response));
22+
}
23+
24+
protected void doPost(HttpServletRequest request, HttpServletResponse response) {
25+
walletOnPBFT.futureGet(() -> super.doPost(request, response));
26+
}
27+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package org.tron.core.services.interfaceOnPBFT.http;
2+
3+
import javax.servlet.http.HttpServletRequest;
4+
import javax.servlet.http.HttpServletResponse;
5+
import lombok.extern.slf4j.Slf4j;
6+
import org.springframework.beans.factory.annotation.Autowired;
7+
import org.springframework.stereotype.Component;
8+
import org.tron.core.services.http.GetBurnTrxServlet;
9+
import org.tron.core.services.http.GetTransactionListFromPendingServlet;
10+
import org.tron.core.services.interfaceOnPBFT.WalletOnPBFT;
11+
12+
13+
@Component
14+
@Slf4j(topic = "API")
15+
public class GetTransactionListFromPendingOnPBFTServlet extends
16+
GetTransactionListFromPendingServlet {
17+
18+
@Autowired
19+
private WalletOnPBFT walletOnPBFT;
20+
21+
protected void doGet(HttpServletRequest request, HttpServletResponse response) {
22+
walletOnPBFT.futureGet(() -> super.doGet(request, response));
23+
}
24+
25+
protected void doPost(HttpServletRequest request, HttpServletResponse response) {
26+
walletOnPBFT.futureGet(() -> super.doPost(request, response));
27+
}
28+
}

framework/src/main/java/org/tron/core/services/interfaceOnPBFT/http/PBFT/HttpApiOnPBFTService.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,8 @@
3939
import org.tron.core.services.interfaceOnPBFT.http.GetPaginatedAssetIssueListOnPBFTServlet;
4040
import org.tron.core.services.interfaceOnPBFT.http.GetRewardOnPBFTServlet;
4141
import org.tron.core.services.interfaceOnPBFT.http.GetTransactionCountByBlockNumOnPBFTServlet;
42+
import org.tron.core.services.interfaceOnPBFT.http.GetTransactionFromPendingOnPBFTServlet;
43+
import org.tron.core.services.interfaceOnPBFT.http.GetTransactionListFromPendingOnPBFTServlet;
4244
import org.tron.core.services.interfaceOnPBFT.http.IsShieldedTRC20ContractNoteSpentOnPBFTServlet;
4345
import org.tron.core.services.interfaceOnPBFT.http.IsSpendOnPBFTServlet;
4446
import org.tron.core.services.interfaceOnPBFT.http.ListExchangesOnPBFTServlet;
@@ -144,6 +146,10 @@ public class HttpApiOnPBFTService implements Service {
144146
isShieldedTRC20ContractNoteSpentOnPBFTServlet;
145147
@Autowired
146148
private GetBurnTrxOnPBFTServlet getBurnTrxOnPBFTServlet;
149+
@Autowired
150+
private GetTransactionFromPendingOnPBFTServlet getTransactionFromPendingOnPBFTServlet;
151+
@Autowired
152+
private GetTransactionListFromPendingOnPBFTServlet getTransactionListFromPendingOnPBFTServlet;
147153

148154
@Override
149155
public void init() {
@@ -229,6 +235,10 @@ public void start() {
229235
"/isshieldedtrc20contractnotespent");
230236
context.addServlet(new ServletHolder(getBurnTrxOnPBFTServlet),
231237
"/getburntrx");
238+
context.addServlet(new ServletHolder(getTransactionFromPendingOnPBFTServlet),
239+
"/gettransactionfrompending");
240+
context.addServlet(new ServletHolder(getTransactionListFromPendingOnPBFTServlet),
241+
"/gettransactionlistfrompending");
232242

233243
int maxHttpConnectNumber = Args.getInstance().getMaxHttpConnectNumber();
234244
if (maxHttpConnectNumber > 0) {

framework/src/main/java/org/tron/core/services/interfaceOnSolidity/RpcApiServiceOnSolidity.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import org.tron.api.GrpcAPI.SpendResult;
3030
import org.tron.api.GrpcAPI.TransactionExtention;
3131
import org.tron.api.GrpcAPI.TransactionInfoList;
32+
import org.tron.api.GrpcAPI.TransactionList;
3233
import org.tron.api.GrpcAPI.WitnessList;
3334
import org.tron.api.WalletSolidityGrpc.WalletSolidityImplBase;
3435
import org.tron.common.application.Service;
@@ -491,5 +492,21 @@ public void getBurnTrx(EmptyMessage request, StreamObserver<NumberMessage> respo
491492
() -> rpcApiService.getWalletSolidityApi().getBurnTrx(request, responseObserver)
492493
);
493494
}
495+
496+
@Override
497+
public void getTransactionFromPending(BytesMessage request,
498+
StreamObserver<Transaction> responseObserver) {
499+
walletOnSolidity.futureGet(() -> rpcApiService.getWalletSolidityApi()
500+
.getTransactionFromPending(request, responseObserver)
501+
);
502+
}
503+
504+
@Override
505+
public void getTransactionListFromPending(EmptyMessage request,
506+
StreamObserver<TransactionList> responseObserver) {
507+
walletOnSolidity.futureGet(() -> rpcApiService.getWalletSolidityApi()
508+
.getTransactionListFromPending(request, responseObserver)
509+
);
510+
}
494511
}
495512
}

0 commit comments

Comments
 (0)