Skip to content

Commit 53beedf

Browse files
committed
fix(api): deprecate events field in shielded TRC20 scan APIs
1 parent 208807d commit 53beedf

8 files changed

Lines changed: 145 additions & 83 deletions

File tree

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

Lines changed: 19 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -780,7 +780,7 @@ public WitnessList getPaginatedNowWitnessList(long offset, long limit) throws
780780
if (limit > WITNESS_COUNT_LIMIT_MAX) {
781781
limit = WITNESS_COUNT_LIMIT_MAX;
782782
}
783-
783+
784784
/*
785785
In the maintenance period, the VoteStores will be cleared.
786786
To avoid the race condition of VoteStores deleted but Witness vote counts not updated,
@@ -1502,8 +1502,8 @@ public Protocol.ChainParameters getChainParameters() {
15021502
builder.addChainParameter(Protocol.ChainParameters.ChainParameter.newBuilder()
15031503
.setKey("getAllowTvmSelfdestructRestriction")
15041504
.setValue(dbManager.getDynamicPropertiesStore().getAllowTvmSelfdestructRestriction())
1505-
.build());
1506-
1505+
.build());
1506+
15071507
builder.addChainParameter(Protocol.ChainParameters.ChainParameter.newBuilder()
15081508
.setKey("getProposalExpireTime")
15091509
.setValue(dbManager.getDynamicPropertiesStore().getProposalExpireTime())
@@ -3852,8 +3852,8 @@ public ShieldedTRC20Parameters createShieldedContractParametersWithoutAsk(
38523852
return builder.build(false);
38533853
}
38543854

3855-
private int getShieldedTRC20LogType(TransactionInfo.Log log, byte[] contractAddress,
3856-
ProtocolStringList topicsList) throws ZksnarkException {
3855+
private int getShieldedTRC20LogType(TransactionInfo.Log log, byte[] contractAddress)
3856+
throws ZksnarkException {
38573857
byte[] logAddress = log.getAddress().toByteArray();
38583858
byte[] addressWithoutPrefix = new byte[20];
38593859
if (ArrayUtils.isEmpty(contractAddress) || contractAddress.length != 21) {
@@ -3866,33 +3866,14 @@ private int getShieldedTRC20LogType(TransactionInfo.Log log, byte[] contractAddr
38663866
for (ByteString bs : logTopicsList) {
38673867
topicsBytes = ByteUtil.merge(topicsBytes, bs.toByteArray());
38683868
}
3869-
if (Objects.isNull(topicsList) || topicsList.isEmpty()) {
3870-
if (Arrays.equals(topicsBytes, SHIELDED_TRC20_LOG_TOPICS_MINT)) {
3871-
return 1;
3872-
} else if (Arrays.equals(topicsBytes, SHIELDED_TRC20_LOG_TOPICS_TRANSFER)) {
3873-
return 2;
3874-
} else if (Arrays.equals(topicsBytes, SHIELDED_TRC20_LOG_TOPICS_BURN_LEAF)) {
3875-
return 3;
3876-
} else if (Arrays.equals(topicsBytes, SHIELDED_TRC20_LOG_TOPICS_BURN_TOKEN)) {
3877-
return 4;
3878-
}
3879-
} else {
3880-
for (String topic : topicsList) {
3881-
byte[] topicHash = Hash.sha3(ByteArray.fromString(topic));
3882-
if (Arrays.equals(topicsBytes, topicHash)) {
3883-
if (topic.toLowerCase().contains("mint")) {
3884-
return 1;
3885-
} else if (topic.toLowerCase().contains("transfer")) {
3886-
return 2;
3887-
} else if (topic.toLowerCase().contains("burn")) {
3888-
if (topic.toLowerCase().contains("leaf")) {
3889-
return 3;
3890-
} else if (topic.toLowerCase().contains("token")) {
3891-
return 4;
3892-
}
3893-
}
3894-
}
3895-
}
3869+
if (Arrays.equals(topicsBytes, SHIELDED_TRC20_LOG_TOPICS_MINT)) {
3870+
return 1;
3871+
} else if (Arrays.equals(topicsBytes, SHIELDED_TRC20_LOG_TOPICS_TRANSFER)) {
3872+
return 2;
3873+
} else if (Arrays.equals(topicsBytes, SHIELDED_TRC20_LOG_TOPICS_BURN_LEAF)) {
3874+
return 3;
3875+
} else if (Arrays.equals(topicsBytes, SHIELDED_TRC20_LOG_TOPICS_BURN_TOKEN)) {
3876+
return 4;
38963877
}
38973878
}
38983879
return 0;
@@ -3942,8 +3923,7 @@ private Optional<DecryptNotesTRC20.NoteTx> getNoteTxFromLogListByIvk(
39423923
}
39433924

39443925
private DecryptNotesTRC20 queryTRC20NoteByIvk(long startNum, long endNum,
3945-
byte[] shieldedTRC20ContractAddress, byte[] ivk, byte[] ak, byte[] nk,
3946-
ProtocolStringList topicsList)
3926+
byte[] shieldedTRC20ContractAddress, byte[] ivk, byte[] ak, byte[] nk)
39473927
throws BadItemException, ZksnarkException, ContractExeException {
39483928
if (!(startNum >= 0 && endNum > startNum && endNum - startNum <= 1000)) {
39493929
throw new BadItemException(
@@ -3964,7 +3944,7 @@ private DecryptNotesTRC20 queryTRC20NoteByIvk(long startNum, long endNum,
39643944
Optional<DecryptNotesTRC20.NoteTx> noteTx;
39653945
int index = 0;
39663946
for (TransactionInfo.Log log : logList) {
3967-
int logType = getShieldedTRC20LogType(log, shieldedTRC20ContractAddress, topicsList);
3947+
int logType = getShieldedTRC20LogType(log, shieldedTRC20ContractAddress);
39683948
if (logType > 0) {
39693949
noteBuilder = DecryptNotesTRC20.NoteTx.newBuilder();
39703950
noteBuilder.setTxid(ByteString.copyFrom(txId));
@@ -4048,12 +4028,11 @@ private boolean isShieldedTRC20NoteSpent(GrpcAPI.Note note, long pos, byte[] ak,
40484028

40494029
public DecryptNotesTRC20 scanShieldedTRC20NotesByIvk(
40504030
long startNum, long endNum, byte[] shieldedTRC20ContractAddress,
4051-
byte[] ivk, byte[] ak, byte[] nk, ProtocolStringList topicsList)
4031+
byte[] ivk, byte[] ak, byte[] nk)
40524032
throws BadItemException, ZksnarkException, ContractExeException {
40534033
checkAllowShieldedTransactionApi();
40544034

4055-
return queryTRC20NoteByIvk(startNum, endNum,
4056-
shieldedTRC20ContractAddress, ivk, ak, nk, topicsList);
4035+
return queryTRC20NoteByIvk(startNum, endNum, shieldedTRC20ContractAddress, ivk, ak, nk);
40574036
}
40584037

40594038
private Optional<DecryptNotesTRC20.NoteTx> getNoteTxFromLogListByOvk(
@@ -4127,7 +4106,7 @@ private Optional<DecryptNotesTRC20.NoteTx> getNoteTxFromLogListByOvk(
41274106
}
41284107

41294108
public DecryptNotesTRC20 scanShieldedTRC20NotesByOvk(long startNum, long endNum,
4130-
byte[] ovk, byte[] shieldedTRC20ContractAddress, ProtocolStringList topicsList)
4109+
byte[] ovk, byte[] shieldedTRC20ContractAddress)
41314110
throws ZksnarkException, BadItemException {
41324111
checkAllowShieldedTransactionApi();
41334112

@@ -4149,7 +4128,7 @@ public DecryptNotesTRC20 scanShieldedTRC20NotesByOvk(long startNum, long endNum,
41494128
Optional<DecryptNotesTRC20.NoteTx> noteTx;
41504129
int index = 0;
41514130
for (TransactionInfo.Log log : logList) {
4152-
int logType = getShieldedTRC20LogType(log, shieldedTRC20ContractAddress, topicsList);
4131+
int logType = getShieldedTRC20LogType(log, shieldedTRC20ContractAddress);
41534132
if (logType > 0) {
41544133
noteBuilder = DecryptNotesTRC20.NoteTx.newBuilder();
41554134
noteBuilder.setTxid(ByteString.copyFrom(txid));

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

Lines changed: 27 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -292,6 +292,17 @@ private StatusRuntimeException getRunTimeException(Exception e) {
292292
}
293293
}
294294

295+
private static boolean rejectIfEventsPresent(
296+
StreamObserver<?> responseObserver, ProtocolStringList events) {
297+
if (!events.isEmpty()) {
298+
responseObserver.onError(Status.INVALID_ARGUMENT
299+
.withDescription("'events' field is deprecated and no longer supported")
300+
.asRuntimeException());
301+
return true;
302+
}
303+
return false;
304+
}
305+
295306
/**
296307
* DatabaseApi.
297308
*/
@@ -722,18 +733,19 @@ public void isSpend(NoteParameters request, StreamObserver<SpendResult> response
722733
@Override
723734
public void scanShieldedTRC20NotesByIvk(IvkDecryptTRC20Parameters request,
724735
StreamObserver<DecryptNotesTRC20> responseObserver) {
736+
if (rejectIfEventsPresent(responseObserver, request.getEventsList())) {
737+
return;
738+
}
725739
long startNum = request.getStartBlockIndex();
726740
long endNum = request.getEndBlockIndex();
727741
byte[] contractAddress = request.getShieldedTRC20ContractAddress().toByteArray();
728742
byte[] ivk = request.getIvk().toByteArray();
729743
byte[] ak = request.getAk().toByteArray();
730744
byte[] nk = request.getNk().toByteArray();
731-
ProtocolStringList topicsList = request.getEventsList();
732745

733746
try {
734747
responseObserver.onNext(
735-
wallet.scanShieldedTRC20NotesByIvk(startNum, endNum, contractAddress, ivk, ak, nk,
736-
topicsList));
748+
wallet.scanShieldedTRC20NotesByIvk(startNum, endNum, contractAddress, ivk, ak, nk));
737749

738750
} catch (Exception e) {
739751
responseObserver.onError(getRunTimeException(e));
@@ -744,15 +756,16 @@ public void scanShieldedTRC20NotesByIvk(IvkDecryptTRC20Parameters request,
744756
@Override
745757
public void scanShieldedTRC20NotesByOvk(OvkDecryptTRC20Parameters request,
746758
StreamObserver<DecryptNotesTRC20> responseObserver) {
759+
if (rejectIfEventsPresent(responseObserver, request.getEventsList())) {
760+
return;
761+
}
747762
long startNum = request.getStartBlockIndex();
748763
long endNum = request.getEndBlockIndex();
749764
byte[] contractAddress = request.getShieldedTRC20ContractAddress().toByteArray();
750765
byte[] ovk = request.getOvk().toByteArray();
751-
ProtocolStringList topicList = request.getEventsList();
752766
try {
753767
responseObserver
754-
.onNext(wallet
755-
.scanShieldedTRC20NotesByOvk(startNum, endNum, ovk, contractAddress, topicList));
768+
.onNext(wallet.scanShieldedTRC20NotesByOvk(startNum, endNum, ovk, contractAddress));
756769
} catch (Exception e) {
757770
responseObserver.onError(getRunTimeException(e));
758771
}
@@ -2412,15 +2425,17 @@ public void createShieldedContractParametersWithoutAsk(
24122425
public void scanShieldedTRC20NotesByIvk(
24132426
IvkDecryptTRC20Parameters request,
24142427
StreamObserver<org.tron.api.GrpcAPI.DecryptNotesTRC20> responseObserver) {
2428+
if (rejectIfEventsPresent(responseObserver, request.getEventsList())) {
2429+
return;
2430+
}
24152431
long startNum = request.getStartBlockIndex();
24162432
long endNum = request.getEndBlockIndex();
24172433
try {
24182434
DecryptNotesTRC20 decryptNotes = wallet.scanShieldedTRC20NotesByIvk(startNum, endNum,
24192435
request.getShieldedTRC20ContractAddress().toByteArray(),
24202436
request.getIvk().toByteArray(),
24212437
request.getAk().toByteArray(),
2422-
request.getNk().toByteArray(),
2423-
request.getEventsList());
2438+
request.getNk().toByteArray());
24242439
responseObserver.onNext(decryptNotes);
24252440
} catch (BadItemException | ZksnarkException e) {
24262441
responseObserver.onError(getRunTimeException(e));
@@ -2438,13 +2453,15 @@ public void scanShieldedTRC20NotesByIvk(
24382453
public void scanShieldedTRC20NotesByOvk(
24392454
OvkDecryptTRC20Parameters request,
24402455
StreamObserver<org.tron.api.GrpcAPI.DecryptNotesTRC20> responseObserver) {
2456+
if (rejectIfEventsPresent(responseObserver, request.getEventsList())) {
2457+
return;
2458+
}
24412459
long startNum = request.getStartBlockIndex();
24422460
long endNum = request.getEndBlockIndex();
24432461
try {
24442462
DecryptNotesTRC20 decryptNotes = wallet.scanShieldedTRC20NotesByOvk(startNum, endNum,
24452463
request.getOvk().toByteArray(),
2446-
request.getShieldedTRC20ContractAddress().toByteArray(),
2447-
request.getEventsList());
2464+
request.getShieldedTRC20ContractAddress().toByteArray());
24482465
responseObserver.onNext(decryptNotes);
24492466
} catch (Exception e) {
24502467
responseObserver.onError(getRunTimeException(e));

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

Lines changed: 26 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
import com.alibaba.fastjson.JSONArray;
44
import com.alibaba.fastjson.JSONObject;
5-
import java.util.stream.Collectors;
5+
import com.google.protobuf.ProtocolStringList;
66
import javax.servlet.http.HttpServletRequest;
77
import javax.servlet.http.HttpServletResponse;
88
import lombok.extern.slf4j.Slf4j;
@@ -17,6 +17,9 @@
1717
@Slf4j(topic = "API")
1818
public class ScanShieldedTRC20NotesByIvkServlet extends RateLimiterServlet {
1919

20+
private static final String EVENTS_DEPRECATED_MSG =
21+
"'events' field is deprecated and no longer supported";
22+
2023
@Autowired
2124
private Wallet wallet;
2225

@@ -35,29 +38,45 @@ public static String convertOutput(GrpcAPI.DecryptNotesTRC20 notes, boolean visi
3538
}
3639
}
3740

41+
static void rejectIfEventsPresent(ProtocolStringList events) {
42+
if (!events.isEmpty()) {
43+
throw new IllegalArgumentException(EVENTS_DEPRECATED_MSG);
44+
}
45+
}
46+
47+
static void rejectIfEventsPresent(String eventsParam) {
48+
if (eventsParam != null && !eventsParam.isEmpty()) {
49+
throw new IllegalArgumentException(EVENTS_DEPRECATED_MSG);
50+
}
51+
}
52+
3853
protected void doPost(HttpServletRequest request, HttpServletResponse response) {
3954
try {
4055
PostParams params = PostParams.getPostParams(request);
4156
IvkDecryptTRC20Parameters.Builder ivkDecryptTRC20Parameters = IvkDecryptTRC20Parameters
4257
.newBuilder();
4358
JsonFormat.merge(params.getParams(), ivkDecryptTRC20Parameters, params.isVisible());
59+
rejectIfEventsPresent(ivkDecryptTRC20Parameters.getEventsList());
4460

4561
GrpcAPI.DecryptNotesTRC20 notes = wallet
4662
.scanShieldedTRC20NotesByIvk(ivkDecryptTRC20Parameters.getStartBlockIndex(),
4763
ivkDecryptTRC20Parameters.getEndBlockIndex(),
4864
ivkDecryptTRC20Parameters.getShieldedTRC20ContractAddress().toByteArray(),
4965
ivkDecryptTRC20Parameters.getIvk().toByteArray(),
5066
ivkDecryptTRC20Parameters.getAk().toByteArray(),
51-
ivkDecryptTRC20Parameters.getNk().toByteArray(),
52-
ivkDecryptTRC20Parameters.getEventsList());
67+
ivkDecryptTRC20Parameters.getNk().toByteArray());
5368
response.getWriter().println(convertOutput(notes, params.isVisible()));
69+
} catch (IllegalArgumentException e) {
70+
response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
71+
Util.processError(e, response);
5472
} catch (Exception e) {
5573
Util.processError(e, response);
5674
}
5775
}
5876

5977
protected void doGet(HttpServletRequest request, HttpServletResponse response) {
6078
try {
79+
rejectIfEventsPresent(request.getParameter("events"));
6180
boolean visible = Util.getVisible(request);
6281
long startNum = Long.parseLong(request.getParameter("start_block_index"));
6382
long endNum = Long.parseLong(request.getParameter("end_block_index"));
@@ -74,8 +93,11 @@ protected void doGet(HttpServletRequest request, HttpServletResponse response) {
7493
GrpcAPI.DecryptNotesTRC20 notes = wallet
7594
.scanShieldedTRC20NotesByIvk(startNum, endNum,
7695
ByteArray.fromHexString(contractAddress), ByteArray.fromHexString(ivk),
77-
ByteArray.fromHexString(ak), ByteArray.fromHexString(nk), null);
96+
ByteArray.fromHexString(ak), ByteArray.fromHexString(nk));
7897
response.getWriter().println(convertOutput(notes, visible));
98+
} catch (IllegalArgumentException e) {
99+
response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
100+
Util.processError(e, response);
79101
} catch (Exception e) {
80102
Util.processError(e, response);
81103
}

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

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package org.tron.core.services.http;
22

3-
import java.util.stream.Collectors;
43
import javax.servlet.http.HttpServletRequest;
54
import javax.servlet.http.HttpServletResponse;
65
import lombok.extern.slf4j.Slf4j;
@@ -24,23 +23,28 @@ protected void doPost(HttpServletRequest request, HttpServletResponse response)
2423
OvkDecryptTRC20Parameters.Builder ovkDecryptTRC20Parameters = OvkDecryptTRC20Parameters
2524
.newBuilder();
2625
JsonFormat.merge(params.getParams(), ovkDecryptTRC20Parameters, params.isVisible());
26+
ScanShieldedTRC20NotesByIvkServlet
27+
.rejectIfEventsPresent(ovkDecryptTRC20Parameters.getEventsList());
2728

2829
GrpcAPI.DecryptNotesTRC20 notes = wallet
2930
.scanShieldedTRC20NotesByOvk(ovkDecryptTRC20Parameters.getStartBlockIndex(),
3031
ovkDecryptTRC20Parameters.getEndBlockIndex(),
3132
ovkDecryptTRC20Parameters.getOvk().toByteArray(),
32-
ovkDecryptTRC20Parameters.getShieldedTRC20ContractAddress().toByteArray(),
33-
ovkDecryptTRC20Parameters.getEventsList()
34-
);
33+
ovkDecryptTRC20Parameters.getShieldedTRC20ContractAddress().toByteArray());
3534
response.getWriter()
3635
.println(ScanShieldedTRC20NotesByIvkServlet.convertOutput(notes, params.isVisible()));
36+
} catch (IllegalArgumentException e) {
37+
response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
38+
Util.processError(e, response);
3739
} catch (Exception e) {
3840
Util.processError(e, response);
3941
}
4042
}
4143

4244
protected void doGet(HttpServletRequest request, HttpServletResponse response) {
4345
try {
46+
ScanShieldedTRC20NotesByIvkServlet
47+
.rejectIfEventsPresent(request.getParameter("events"));
4448
boolean visible = Util.getVisible(request);
4549
long startBlockIndex = Long.parseLong(request.getParameter("start_block_index"));
4650
long endBlockIndex = Long.parseLong(request.getParameter("end_block_index"));
@@ -51,10 +55,13 @@ protected void doGet(HttpServletRequest request, HttpServletResponse response) {
5155
}
5256
GrpcAPI.DecryptNotesTRC20 notes = wallet
5357
.scanShieldedTRC20NotesByOvk(startBlockIndex, endBlockIndex,
54-
ByteArray.fromHexString(ovk), ByteArray.fromHexString(contractAddress), null);
58+
ByteArray.fromHexString(ovk), ByteArray.fromHexString(contractAddress));
5559

5660
response.getWriter()
5761
.println(ScanShieldedTRC20NotesByIvkServlet.convertOutput(notes, visible));
62+
} catch (IllegalArgumentException e) {
63+
response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
64+
Util.processError(e, response);
5865
} catch (Exception e) {
5966
Util.processError(e, response);
6067
}

framework/src/test/java/org/tron/core/ShieldedTRC20BuilderTest.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2243,7 +2243,7 @@ public void testScanShieldedTRC20NotesByIvk() throws Exception {
22432243
byte[] ivk = fvk.inViewingKey().value;
22442244

22452245
GrpcAPI.DecryptNotesTRC20 scannedNotes = wallet.scanShieldedTRC20NotesByIvk(
2246-
statNum, endNum, SHIELDED_CONTRACT_ADDRESS, ivk, fvk.getAk(), fvk.getNk(), null);
2246+
statNum, endNum, SHIELDED_CONTRACT_ADDRESS, ivk, fvk.getAk(), fvk.getNk());
22472247

22482248
for (GrpcAPI.DecryptNotesTRC20.NoteTx noteTx : scannedNotes.getNoteTxsList()) {
22492249
logger.info(noteTx.toString());
@@ -2258,7 +2258,7 @@ public void testscanShieldedTRC20NotesByOvk() throws Exception {
22582258
FullViewingKey fvk = sk.fullViewingKey();
22592259

22602260
GrpcAPI.DecryptNotesTRC20 scannedNotes = wallet.scanShieldedTRC20NotesByOvk(
2261-
statNum, endNum, fvk.getOvk(), SHIELDED_CONTRACT_ADDRESS, null);
2261+
statNum, endNum, fvk.getOvk(), SHIELDED_CONTRACT_ADDRESS);
22622262

22632263
for (GrpcAPI.DecryptNotesTRC20.NoteTx noteTx : scannedNotes.getNoteTxsList()) {
22642264
logger.info(noteTx.toString());
@@ -2274,7 +2274,7 @@ public void isShieldedTRC20ContractNoteSpent() throws Exception {
22742274
byte[] ivk = fvk.inViewingKey().value;
22752275

22762276
GrpcAPI.DecryptNotesTRC20 scannedNotes = wallet.scanShieldedTRC20NotesByIvk(
2277-
statNum, endNum, SHIELDED_CONTRACT_ADDRESS, ivk, fvk.getAk(), fvk.getNk(), null);
2277+
statNum, endNum, SHIELDED_CONTRACT_ADDRESS, ivk, fvk.getAk(), fvk.getNk());
22782278

22792279
for (GrpcAPI.DecryptNotesTRC20.NoteTx noteTx : scannedNotes.getNoteTxsList()) {
22802280
logger.info(noteTx.toString());

0 commit comments

Comments
 (0)