Skip to content

Commit 2c69005

Browse files
committed
api(block):add query header
1 parent 85f7278 commit 2c69005

File tree

13 files changed

+263
-2
lines changed

13 files changed

+263
-2
lines changed

chainbase/src/main/java/org/tron/common/utils/WalletUtil.java

+8
Original file line numberDiff line numberDiff line change
@@ -131,4 +131,12 @@ public static byte[] getSelector(byte[] data) {
131131
return ret;
132132
}
133133

134+
public static Long isLong(String s) {
135+
try {
136+
return Long.parseLong(s);
137+
} catch (NumberFormatException ignored) {
138+
return null;
139+
}
140+
}
141+
134142
}

framework/src/main/java/org/tron/core/Wallet.java

+44
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@
5353
import org.apache.commons.lang3.ArrayUtils;
5454
import org.apache.commons.lang3.StringUtils;
5555
import org.apache.commons.lang3.tuple.Pair;
56+
import org.bouncycastle.util.encoders.DecoderException;
5657
import org.bouncycastle.util.encoders.Hex;
5758
import org.springframework.beans.factory.annotation.Autowired;
5859
import org.springframework.stereotype.Component;
@@ -4018,5 +4019,48 @@ public boolean isMining() {
40184019
public Chainbase.Cursor getCursor() {
40194020
return chainBaseManager.getBlockStore().getRevokingDB().getCursor();
40204021
}
4022+
4023+
public Block getBlock(GrpcAPI.BlockMessage request) {
4024+
Block block;
4025+
long head = chainBaseManager.getHeadBlockNum();
4026+
if (!request.getIdOrNum().isEmpty()) {
4027+
Long num = WalletUtil.isLong(request.getIdOrNum());
4028+
if (num != null) {
4029+
// quickly check
4030+
if (num > head) {
4031+
return null;
4032+
}
4033+
if (num < 0) {
4034+
throw new IllegalArgumentException("num must be non-positive number.");
4035+
}
4036+
block = getBlockByNum(num);
4037+
} else {
4038+
RuntimeException e = new IllegalArgumentException("id must be legal block hash.");
4039+
try {
4040+
ByteString id = ByteString.copyFrom(ByteArray.fromHexString(request.getIdOrNum()));
4041+
if (id.size() == Sha256Hash.LENGTH) {
4042+
num = new BlockId(Sha256Hash.wrap(id)).getNum();
4043+
// quickly check
4044+
if (num > head || num < 0) {
4045+
throw e;
4046+
}
4047+
block = getBlockById(id);
4048+
} else {
4049+
throw e;
4050+
}
4051+
} catch (DecoderException ignored) {
4052+
throw e;
4053+
}
4054+
}
4055+
} else {
4056+
block = getNowBlock();
4057+
}
4058+
if (Objects.isNull(block) || block.getTransactionsList().isEmpty()
4059+
|| request.getDetail()) {
4060+
return block;
4061+
}
4062+
return block.toBuilder().clearTransactions().build();
4063+
}
4064+
40214065
}
40224066

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

+29
Original file line numberDiff line numberDiff line change
@@ -907,6 +907,12 @@ public void getTransactionInfoByBlockNum(NumberMessage request,
907907

908908
responseObserver.onCompleted();
909909
}
910+
911+
@Override
912+
public void getBlock(GrpcAPI.BlockMessage request,
913+
StreamObserver<BlockExtention> responseObserver) {
914+
getBlockCommon(request, responseObserver);
915+
}
910916
}
911917

912918
/**
@@ -2657,6 +2663,13 @@ public void getPendingSize(EmptyMessage request,
26572663
StreamObserver<NumberMessage> responseObserver) {
26582664
getPendingSizeCommon(request, responseObserver);
26592665
}
2666+
2667+
2668+
@Override
2669+
public void getBlock(GrpcAPI.BlockMessage request,
2670+
StreamObserver<BlockExtention> responseObserver) {
2671+
getBlockCommon(request, responseObserver);
2672+
}
26602673
}
26612674

26622675
public class MonitorApi extends MonitorGrpc.MonitorImplBase {
@@ -2774,4 +2787,20 @@ public void getPendingSizeCommon(EmptyMessage request,
27742787
}
27752788
responseObserver.onCompleted();
27762789
}
2790+
2791+
public void getBlockCommon(GrpcAPI.BlockMessage request,
2792+
StreamObserver<BlockExtention> responseObserver) {
2793+
try {
2794+
responseObserver.onNext(block2Extention(wallet.getBlock(request)));
2795+
} catch (Exception e) {
2796+
if (e instanceof IllegalArgumentException) {
2797+
responseObserver.onError(Status.INVALID_ARGUMENT.withDescription(e.getMessage())
2798+
.withCause(e).asRuntimeException());
2799+
} else {
2800+
responseObserver.onError(getRunTimeException(e));
2801+
}
2802+
}
2803+
responseObserver.onCompleted();
2804+
}
2805+
27772806
}

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

+4-1
Original file line numberDiff line numberDiff line change
@@ -290,6 +290,9 @@ public class FullNodeHttpApiService implements Service {
290290
@Autowired
291291
private GetEnergyPricesServlet getEnergyPricesServlet;
292292

293+
@Autowired
294+
private GetBlockServlet getBlockServlet;
295+
293296
private static String getParamsFile(String fileName) {
294297
InputStream in = Thread.currentThread().getContextClassLoader()
295298
.getResourceAsStream("params" + File.separator + fileName);
@@ -535,7 +538,7 @@ public void start() {
535538
"/wallet/gettransactionlistfrompending");
536539
context.addServlet(new ServletHolder(getPendingSizeServlet), "/wallet/getpendingsize");
537540
context.addServlet(new ServletHolder(getEnergyPricesServlet), "/wallet/getenergyprices");
538-
541+
context.addServlet(new ServletHolder(getBlockServlet), "/wallet/getblock");
539542
int maxHttpConnectNumber = Args.getInstance().getMaxHttpConnectNumber();
540543
if (maxHttpConnectNumber > 0) {
541544
server.addBean(new ConnectionLimit(maxHttpConnectNumber, server));
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
package org.tron.core.services.http;
2+
3+
import com.alibaba.fastjson.JSON;
4+
import com.alibaba.fastjson.JSONObject;
5+
import com.google.common.base.Strings;
6+
import java.io.IOException;
7+
import javax.servlet.http.HttpServletRequest;
8+
import javax.servlet.http.HttpServletResponse;
9+
import lombok.extern.slf4j.Slf4j;
10+
import org.eclipse.jetty.http.HttpMethod;
11+
import org.springframework.beans.factory.annotation.Autowired;
12+
import org.springframework.stereotype.Component;
13+
import org.tron.api.GrpcAPI.BlockMessage;
14+
import org.tron.core.Wallet;
15+
import org.tron.protos.Protocol.Block;
16+
17+
18+
@Component
19+
@Slf4j(topic = "API")
20+
public class GetBlockServlet extends RateLimiterServlet {
21+
22+
@Autowired
23+
private Wallet wallet;
24+
25+
protected void doGet(HttpServletRequest request, HttpServletResponse response) {
26+
handle(request, response);
27+
}
28+
29+
protected void doPost(HttpServletRequest request, HttpServletResponse response) {
30+
handle(request, response);
31+
}
32+
33+
private void handle(HttpServletRequest request, HttpServletResponse response) {
34+
try {
35+
PostParams params = parseParams(request);
36+
BlockMessage message = buildRequest(params.getParams(), params.isVisible());
37+
fillResponse(params.isVisible(), message, response);
38+
} catch (Exception e) {
39+
Util.processError(e, response);
40+
}
41+
}
42+
43+
private PostParams parseParams(HttpServletRequest request) throws Exception {
44+
HttpMethod m = HttpMethod.fromString(request.getMethod());
45+
if (HttpMethod.GET.equals(m)) {
46+
String idOrNum = request.getParameter("idOrNum");
47+
JSONObject params = new JSONObject();
48+
if (!Strings.isNullOrEmpty(idOrNum)) {
49+
params.put("idOrNum", idOrNum);
50+
}
51+
params.put("detail", Boolean.parseBoolean(request.getParameter("detail")));
52+
return new PostParams(JSON.toJSONString(params),
53+
Boolean.parseBoolean(request.getParameter(Util.VISIBLE)));
54+
}
55+
if (HttpMethod.POST.equals(m)) {
56+
return PostParams.getPostParams(request);
57+
}
58+
throw new UnsupportedOperationException();
59+
}
60+
61+
private BlockMessage buildRequest(String params, boolean visible)
62+
throws JsonFormat.ParseException {
63+
BlockMessage.Builder build = BlockMessage.newBuilder();
64+
if (!Strings.isNullOrEmpty(params)) {
65+
JsonFormat.merge(params, build, visible);
66+
}
67+
return build.build();
68+
}
69+
70+
private void fillResponse(boolean visible, BlockMessage request, HttpServletResponse response)
71+
throws IOException {
72+
try {
73+
Block reply = wallet.getBlock(request);
74+
if (reply != null) {
75+
response.getWriter().println(Util.printBlock(reply, visible));
76+
} else {
77+
response.getWriter().println("{}");
78+
}
79+
} catch (IllegalArgumentException e) {
80+
JSONObject jsonObject = new JSONObject();
81+
jsonObject.put("Error", e.getMessage());
82+
response.getWriter().println(jsonObject.toJSONString());
83+
}
84+
}
85+
86+
}

framework/src/main/java/org/tron/core/services/http/solidity/SolidityNodeHttpApiService.java

+5-1
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import org.tron.core.services.http.GetBlockByLatestNumServlet;
2828
import org.tron.core.services.http.GetBlockByLimitNextServlet;
2929
import org.tron.core.services.http.GetBlockByNumServlet;
30+
import org.tron.core.services.http.GetBlockServlet;
3031
import org.tron.core.services.http.GetBrokerageServlet;
3132
import org.tron.core.services.http.GetBurnTrxServlet;
3233
import org.tron.core.services.http.GetDelegatedResourceAccountIndexServlet;
@@ -149,6 +150,9 @@ public class SolidityNodeHttpApiService implements Service {
149150
@Autowired
150151
private HttpApiAccessFilter httpApiAccessFilter;
151152

153+
@Autowired
154+
private GetBlockServlet getBlockServlet;
155+
152156
@Override
153157
public void init() {
154158
}
@@ -250,7 +254,7 @@ public void start() {
250254
context.addServlet(new ServletHolder(getBrokerageServlet), "/walletsolidity/getBrokerage");
251255
context.addServlet(new ServletHolder(getRewardServlet), "/walletsolidity/getReward");
252256
context.addServlet(new ServletHolder(getBurnTrxServlet), "/walletsolidity/getburntrx");
253-
257+
context.addServlet(new ServletHolder(getBlockServlet), "/walletsolidity/getblock");
254258
// http access filter
255259
context.addFilter(new FilterHolder(httpApiAccessFilter), "/walletsolidity/*",
256260
EnumSet.allOf(DispatcherType.class));

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

+7
Original file line numberDiff line numberDiff line change
@@ -503,5 +503,12 @@ public void getBurnTrx(EmptyMessage request, StreamObserver<NumberMessage> respo
503503
);
504504
}
505505

506+
@Override
507+
public void getBlock(GrpcAPI.BlockMessage request,
508+
StreamObserver<BlockExtention> responseObserver) {
509+
walletOnPBFT.futureGet(
510+
() -> rpcApiService.getWalletSolidityApi().getBlock(request, responseObserver));
511+
}
512+
506513
}
507514
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package org.tron.core.services.interfaceOnPBFT.http.PBFT;
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.GetBlockServlet;
9+
import org.tron.core.services.interfaceOnPBFT.WalletOnPBFT;
10+
11+
12+
@Component
13+
@Slf4j(topic = "API")
14+
public class GetBlockOnPBFTServlet extends GetBlockServlet {
15+
16+
@Autowired
17+
private WalletOnPBFT walletOnPBFT;
18+
19+
protected void doGet(HttpServletRequest request, HttpServletResponse response) {
20+
walletOnPBFT.futureGet(() -> super.doGet(request, response));
21+
}
22+
23+
protected void doPost(HttpServletRequest request, HttpServletResponse response) {
24+
walletOnPBFT.futureGet(() -> super.doPost(request, response));
25+
}
26+
}

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

+5
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,9 @@ public class HttpApiOnPBFTService implements Service {
151151
@Autowired
152152
private GetEnergyPricesOnPBFTServlet getEnergyPricesOnPBFTServlet;
153153

154+
@Autowired
155+
private GetBlockOnPBFTServlet getBlockOnPBFTServlet;
156+
154157
@Override
155158
public void init() {
156159

@@ -237,6 +240,8 @@ public void start() {
237240
"/getburntrx");
238241
context.addServlet(new ServletHolder(getEnergyPricesOnPBFTServlet),
239242
"/getenergyprices");
243+
context.addServlet(new ServletHolder(getBlockOnPBFTServlet),
244+
"/getblock");
240245

241246
int maxHttpConnectNumber = Args.getInstance().getMaxHttpConnectNumber();
242247
if (maxHttpConnectNumber > 0) {

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

+7
Original file line numberDiff line numberDiff line change
@@ -499,5 +499,12 @@ public void getBurnTrx(EmptyMessage request, StreamObserver<NumberMessage> respo
499499
);
500500
}
501501

502+
@Override
503+
public void getBlock(GrpcAPI.BlockMessage request,
504+
StreamObserver<BlockExtention> responseObserver) {
505+
walletOnSolidity.futureGet(
506+
() -> rpcApiService.getWalletSolidityApi().getBlock(request, responseObserver));
507+
}
508+
502509
}
503510
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package org.tron.core.services.interfaceOnSolidity.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.GetBlockServlet;
9+
import org.tron.core.services.interfaceOnSolidity.WalletOnSolidity;
10+
11+
12+
@Component
13+
@Slf4j(topic = "API")
14+
public class GetBlockOnSolidityServlet extends GetBlockServlet {
15+
16+
@Autowired
17+
private WalletOnSolidity walletOnSolidity;
18+
19+
protected void doGet(HttpServletRequest request, HttpServletResponse response) {
20+
walletOnSolidity.futureGet(() -> super.doGet(request, response));
21+
}
22+
23+
protected void doPost(HttpServletRequest request, HttpServletResponse response) {
24+
walletOnSolidity.futureGet(() -> super.doPost(request, response));
25+
}
26+
}

framework/src/main/java/org/tron/core/services/interfaceOnSolidity/http/solidity/HttpApiOnSolidityService.java

+7
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import org.tron.core.services.interfaceOnSolidity.http.GetBlockByLatestNumOnSolidityServlet;
2727
import org.tron.core.services.interfaceOnSolidity.http.GetBlockByLimitNextOnSolidityServlet;
2828
import org.tron.core.services.interfaceOnSolidity.http.GetBlockByNumOnSolidityServlet;
29+
import org.tron.core.services.interfaceOnSolidity.http.GetBlockOnSolidityServlet;
2930
import org.tron.core.services.interfaceOnSolidity.http.GetBrokerageOnSolidityServlet;
3031
import org.tron.core.services.interfaceOnSolidity.http.GetBurnTrxOnSolidityServlet;
3132
import org.tron.core.services.interfaceOnSolidity.http.GetDelegatedResourceAccountIndexOnSolidityServlet;
@@ -156,6 +157,9 @@ public class HttpApiOnSolidityService implements Service {
156157
@Autowired
157158
private HttpApiAccessFilter httpApiAccessFilter;
158159

160+
@Autowired
161+
private GetBlockOnSolidityServlet getBlockOnSolidityServlet;
162+
159163
@Override
160164
public void init() {
161165

@@ -258,6 +262,9 @@ public void start() {
258262
context.addServlet(new ServletHolder(getEnergyPricesOnSolidityServlet),
259263
"/walletsolidity/getenergyprices");
260264

265+
context.addServlet(new ServletHolder(getBlockOnSolidityServlet),
266+
"/walletsolidity/getblock");
267+
261268
// filters the specified APIs
262269
// when node is lite fullnode and openHistoryQueryWhenLiteFN is false
263270
context.addFilter(new FilterHolder(liteFnQueryHttpFilter), "/*",

0 commit comments

Comments
 (0)