Skip to content

Commit 63fe9fd

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

9 files changed

Lines changed: 233 additions & 85 deletions

File tree

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

Lines changed: 19 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,6 @@
4949
import com.google.common.collect.Range;
5050
import com.google.protobuf.ByteString;
5151
import com.google.protobuf.InvalidProtocolBufferException;
52-
import com.google.protobuf.ProtocolStringList;
5352
import java.math.BigInteger;
5453
import java.security.SignatureException;
5554
import java.util.ArrayList;
@@ -163,7 +162,6 @@
163162
import org.tron.core.capsule.TransactionCapsule;
164163
import org.tron.core.capsule.TransactionInfoCapsule;
165164
import org.tron.core.capsule.TransactionResultCapsule;
166-
import org.tron.core.capsule.TransactionRetCapsule;
167165
import org.tron.core.capsule.VotesCapsule;
168166
import org.tron.core.capsule.WitnessCapsule;
169167
import org.tron.core.capsule.utils.MarketUtils;
@@ -780,7 +778,7 @@ public WitnessList getPaginatedNowWitnessList(long offset, long limit) throws
780778
if (limit > WITNESS_COUNT_LIMIT_MAX) {
781779
limit = WITNESS_COUNT_LIMIT_MAX;
782780
}
783-
781+
784782
/*
785783
In the maintenance period, the VoteStores will be cleared.
786784
To avoid the race condition of VoteStores deleted but Witness vote counts not updated,
@@ -1502,8 +1500,8 @@ public Protocol.ChainParameters getChainParameters() {
15021500
builder.addChainParameter(Protocol.ChainParameters.ChainParameter.newBuilder()
15031501
.setKey("getAllowTvmSelfdestructRestriction")
15041502
.setValue(dbManager.getDynamicPropertiesStore().getAllowTvmSelfdestructRestriction())
1505-
.build());
1506-
1503+
.build());
1504+
15071505
builder.addChainParameter(Protocol.ChainParameters.ChainParameter.newBuilder()
15081506
.setKey("getProposalExpireTime")
15091507
.setValue(dbManager.getDynamicPropertiesStore().getProposalExpireTime())
@@ -3852,8 +3850,8 @@ public ShieldedTRC20Parameters createShieldedContractParametersWithoutAsk(
38523850
return builder.build(false);
38533851
}
38543852

3855-
private int getShieldedTRC20LogType(TransactionInfo.Log log, byte[] contractAddress,
3856-
ProtocolStringList topicsList) throws ZksnarkException {
3853+
private int getShieldedTRC20LogType(TransactionInfo.Log log, byte[] contractAddress)
3854+
throws ZksnarkException {
38573855
byte[] logAddress = log.getAddress().toByteArray();
38583856
byte[] addressWithoutPrefix = new byte[20];
38593857
if (ArrayUtils.isEmpty(contractAddress) || contractAddress.length != 21) {
@@ -3866,33 +3864,14 @@ private int getShieldedTRC20LogType(TransactionInfo.Log log, byte[] contractAddr
38663864
for (ByteString bs : logTopicsList) {
38673865
topicsBytes = ByteUtil.merge(topicsBytes, bs.toByteArray());
38683866
}
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-
}
3867+
if (Arrays.equals(topicsBytes, SHIELDED_TRC20_LOG_TOPICS_MINT)) {
3868+
return 1;
3869+
} else if (Arrays.equals(topicsBytes, SHIELDED_TRC20_LOG_TOPICS_TRANSFER)) {
3870+
return 2;
3871+
} else if (Arrays.equals(topicsBytes, SHIELDED_TRC20_LOG_TOPICS_BURN_LEAF)) {
3872+
return 3;
3873+
} else if (Arrays.equals(topicsBytes, SHIELDED_TRC20_LOG_TOPICS_BURN_TOKEN)) {
3874+
return 4;
38963875
}
38973876
}
38983877
return 0;
@@ -3942,8 +3921,7 @@ private Optional<DecryptNotesTRC20.NoteTx> getNoteTxFromLogListByIvk(
39423921
}
39433922

39443923
private DecryptNotesTRC20 queryTRC20NoteByIvk(long startNum, long endNum,
3945-
byte[] shieldedTRC20ContractAddress, byte[] ivk, byte[] ak, byte[] nk,
3946-
ProtocolStringList topicsList)
3924+
byte[] shieldedTRC20ContractAddress, byte[] ivk, byte[] ak, byte[] nk)
39473925
throws BadItemException, ZksnarkException, ContractExeException {
39483926
if (!(startNum >= 0 && endNum > startNum && endNum - startNum <= 1000)) {
39493927
throw new BadItemException(
@@ -3964,7 +3942,7 @@ private DecryptNotesTRC20 queryTRC20NoteByIvk(long startNum, long endNum,
39643942
Optional<DecryptNotesTRC20.NoteTx> noteTx;
39653943
int index = 0;
39663944
for (TransactionInfo.Log log : logList) {
3967-
int logType = getShieldedTRC20LogType(log, shieldedTRC20ContractAddress, topicsList);
3945+
int logType = getShieldedTRC20LogType(log, shieldedTRC20ContractAddress);
39683946
if (logType > 0) {
39693947
noteBuilder = DecryptNotesTRC20.NoteTx.newBuilder();
39703948
noteBuilder.setTxid(ByteString.copyFrom(txId));
@@ -4048,12 +4026,11 @@ private boolean isShieldedTRC20NoteSpent(GrpcAPI.Note note, long pos, byte[] ak,
40484026

40494027
public DecryptNotesTRC20 scanShieldedTRC20NotesByIvk(
40504028
long startNum, long endNum, byte[] shieldedTRC20ContractAddress,
4051-
byte[] ivk, byte[] ak, byte[] nk, ProtocolStringList topicsList)
4029+
byte[] ivk, byte[] ak, byte[] nk)
40524030
throws BadItemException, ZksnarkException, ContractExeException {
40534031
checkAllowShieldedTransactionApi();
40544032

4055-
return queryTRC20NoteByIvk(startNum, endNum,
4056-
shieldedTRC20ContractAddress, ivk, ak, nk, topicsList);
4033+
return queryTRC20NoteByIvk(startNum, endNum, shieldedTRC20ContractAddress, ivk, ak, nk);
40574034
}
40584035

40594036
private Optional<DecryptNotesTRC20.NoteTx> getNoteTxFromLogListByOvk(
@@ -4127,7 +4104,7 @@ private Optional<DecryptNotesTRC20.NoteTx> getNoteTxFromLogListByOvk(
41274104
}
41284105

41294106
public DecryptNotesTRC20 scanShieldedTRC20NotesByOvk(long startNum, long endNum,
4130-
byte[] ovk, byte[] shieldedTRC20ContractAddress, ProtocolStringList topicsList)
4107+
byte[] ovk, byte[] shieldedTRC20ContractAddress)
41314108
throws ZksnarkException, BadItemException {
41324109
checkAllowShieldedTransactionApi();
41334110

@@ -4149,7 +4126,7 @@ public DecryptNotesTRC20 scanShieldedTRC20NotesByOvk(long startNum, long endNum,
41494126
Optional<DecryptNotesTRC20.NoteTx> noteTx;
41504127
int index = 0;
41514128
for (TransactionInfo.Log log : logList) {
4152-
int logType = getShieldedTRC20LogType(log, shieldedTRC20ContractAddress, topicsList);
4129+
int logType = getShieldedTRC20LogType(log, shieldedTRC20ContractAddress);
41534130
if (logType > 0) {
41544131
noteBuilder = DecryptNotesTRC20.NoteTx.newBuilder();
41554132
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: 30 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,49 @@ 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[] eventsParams) {
48+
if (eventsParams != null) {
49+
for (String v : eventsParams) {
50+
if (v != null && !v.isEmpty()) {
51+
throw new IllegalArgumentException(EVENTS_DEPRECATED_MSG);
52+
}
53+
}
54+
}
55+
}
56+
3857
protected void doPost(HttpServletRequest request, HttpServletResponse response) {
3958
try {
4059
PostParams params = PostParams.getPostParams(request);
4160
IvkDecryptTRC20Parameters.Builder ivkDecryptTRC20Parameters = IvkDecryptTRC20Parameters
4261
.newBuilder();
4362
JsonFormat.merge(params.getParams(), ivkDecryptTRC20Parameters, params.isVisible());
63+
rejectIfEventsPresent(ivkDecryptTRC20Parameters.getEventsList());
4464

4565
GrpcAPI.DecryptNotesTRC20 notes = wallet
4666
.scanShieldedTRC20NotesByIvk(ivkDecryptTRC20Parameters.getStartBlockIndex(),
4767
ivkDecryptTRC20Parameters.getEndBlockIndex(),
4868
ivkDecryptTRC20Parameters.getShieldedTRC20ContractAddress().toByteArray(),
4969
ivkDecryptTRC20Parameters.getIvk().toByteArray(),
5070
ivkDecryptTRC20Parameters.getAk().toByteArray(),
51-
ivkDecryptTRC20Parameters.getNk().toByteArray(),
52-
ivkDecryptTRC20Parameters.getEventsList());
71+
ivkDecryptTRC20Parameters.getNk().toByteArray());
5372
response.getWriter().println(convertOutput(notes, params.isVisible()));
73+
} catch (IllegalArgumentException e) {
74+
response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
75+
Util.processError(e, response);
5476
} catch (Exception e) {
5577
Util.processError(e, response);
5678
}
5779
}
5880

5981
protected void doGet(HttpServletRequest request, HttpServletResponse response) {
6082
try {
83+
rejectIfEventsPresent(request.getParameterValues("events"));
6184
boolean visible = Util.getVisible(request);
6285
long startNum = Long.parseLong(request.getParameter("start_block_index"));
6386
long endNum = Long.parseLong(request.getParameter("end_block_index"));
@@ -74,8 +97,11 @@ protected void doGet(HttpServletRequest request, HttpServletResponse response) {
7497
GrpcAPI.DecryptNotesTRC20 notes = wallet
7598
.scanShieldedTRC20NotesByIvk(startNum, endNum,
7699
ByteArray.fromHexString(contractAddress), ByteArray.fromHexString(ivk),
77-
ByteArray.fromHexString(ak), ByteArray.fromHexString(nk), null);
100+
ByteArray.fromHexString(ak), ByteArray.fromHexString(nk));
78101
response.getWriter().println(convertOutput(notes, visible));
102+
} catch (IllegalArgumentException e) {
103+
response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
104+
Util.processError(e, response);
79105
} catch (Exception e) {
80106
Util.processError(e, response);
81107
}

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.getParameterValues("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
}

0 commit comments

Comments
 (0)