Skip to content

Commit b74804c

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

10 files changed

Lines changed: 309 additions & 87 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: 29 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,7 @@
9595
import org.tron.core.exception.VMIllegalException;
9696
import org.tron.core.exception.ZksnarkException;
9797
import org.tron.core.metrics.MetricsApiService;
98+
import org.tron.core.services.http.Util;
9899
import org.tron.core.utils.TransactionUtil;
99100
import org.tron.core.zen.address.DiversifierT;
100101
import org.tron.core.zen.address.IncomingViewingKey;
@@ -292,6 +293,18 @@ private StatusRuntimeException getRunTimeException(Exception e) {
292293
}
293294
}
294295

296+
private static boolean rejectIfEventsPresent(
297+
StreamObserver<?> responseObserver, ProtocolStringList events) {
298+
if (events.stream().anyMatch(s -> !s.isEmpty())) {
299+
logger.info(Util.EVENTS_DEPRECATED_MSG);
300+
responseObserver.onError(Status.INVALID_ARGUMENT
301+
.withDescription(Util.EVENTS_DEPRECATED_MSG)
302+
.asRuntimeException());
303+
return true;
304+
}
305+
return false;
306+
}
307+
295308
/**
296309
* DatabaseApi.
297310
*/
@@ -722,18 +735,19 @@ public void isSpend(NoteParameters request, StreamObserver<SpendResult> response
722735
@Override
723736
public void scanShieldedTRC20NotesByIvk(IvkDecryptTRC20Parameters request,
724737
StreamObserver<DecryptNotesTRC20> responseObserver) {
738+
if (rejectIfEventsPresent(responseObserver, request.getEventsList())) {
739+
return;
740+
}
725741
long startNum = request.getStartBlockIndex();
726742
long endNum = request.getEndBlockIndex();
727743
byte[] contractAddress = request.getShieldedTRC20ContractAddress().toByteArray();
728744
byte[] ivk = request.getIvk().toByteArray();
729745
byte[] ak = request.getAk().toByteArray();
730746
byte[] nk = request.getNk().toByteArray();
731-
ProtocolStringList topicsList = request.getEventsList();
732747

733748
try {
734749
responseObserver.onNext(
735-
wallet.scanShieldedTRC20NotesByIvk(startNum, endNum, contractAddress, ivk, ak, nk,
736-
topicsList));
750+
wallet.scanShieldedTRC20NotesByIvk(startNum, endNum, contractAddress, ivk, ak, nk));
737751

738752
} catch (Exception e) {
739753
responseObserver.onError(getRunTimeException(e));
@@ -744,15 +758,16 @@ public void scanShieldedTRC20NotesByIvk(IvkDecryptTRC20Parameters request,
744758
@Override
745759
public void scanShieldedTRC20NotesByOvk(OvkDecryptTRC20Parameters request,
746760
StreamObserver<DecryptNotesTRC20> responseObserver) {
761+
if (rejectIfEventsPresent(responseObserver, request.getEventsList())) {
762+
return;
763+
}
747764
long startNum = request.getStartBlockIndex();
748765
long endNum = request.getEndBlockIndex();
749766
byte[] contractAddress = request.getShieldedTRC20ContractAddress().toByteArray();
750767
byte[] ovk = request.getOvk().toByteArray();
751-
ProtocolStringList topicList = request.getEventsList();
752768
try {
753769
responseObserver
754-
.onNext(wallet
755-
.scanShieldedTRC20NotesByOvk(startNum, endNum, ovk, contractAddress, topicList));
770+
.onNext(wallet.scanShieldedTRC20NotesByOvk(startNum, endNum, ovk, contractAddress));
756771
} catch (Exception e) {
757772
responseObserver.onError(getRunTimeException(e));
758773
}
@@ -2412,15 +2427,17 @@ public void createShieldedContractParametersWithoutAsk(
24122427
public void scanShieldedTRC20NotesByIvk(
24132428
IvkDecryptTRC20Parameters request,
24142429
StreamObserver<org.tron.api.GrpcAPI.DecryptNotesTRC20> responseObserver) {
2430+
if (rejectIfEventsPresent(responseObserver, request.getEventsList())) {
2431+
return;
2432+
}
24152433
long startNum = request.getStartBlockIndex();
24162434
long endNum = request.getEndBlockIndex();
24172435
try {
24182436
DecryptNotesTRC20 decryptNotes = wallet.scanShieldedTRC20NotesByIvk(startNum, endNum,
24192437
request.getShieldedTRC20ContractAddress().toByteArray(),
24202438
request.getIvk().toByteArray(),
24212439
request.getAk().toByteArray(),
2422-
request.getNk().toByteArray(),
2423-
request.getEventsList());
2440+
request.getNk().toByteArray());
24242441
responseObserver.onNext(decryptNotes);
24252442
} catch (BadItemException | ZksnarkException e) {
24262443
responseObserver.onError(getRunTimeException(e));
@@ -2438,13 +2455,15 @@ public void scanShieldedTRC20NotesByIvk(
24382455
public void scanShieldedTRC20NotesByOvk(
24392456
OvkDecryptTRC20Parameters request,
24402457
StreamObserver<org.tron.api.GrpcAPI.DecryptNotesTRC20> responseObserver) {
2458+
if (rejectIfEventsPresent(responseObserver, request.getEventsList())) {
2459+
return;
2460+
}
24412461
long startNum = request.getStartBlockIndex();
24422462
long endNum = request.getEndBlockIndex();
24432463
try {
24442464
DecryptNotesTRC20 decryptNotes = wallet.scanShieldedTRC20NotesByOvk(startNum, endNum,
24452465
request.getOvk().toByteArray(),
2446-
request.getShieldedTRC20ContractAddress().toByteArray(),
2447-
request.getEventsList());
2466+
request.getShieldedTRC20ContractAddress().toByteArray());
24482467
responseObserver.onNext(decryptNotes);
24492468
} catch (Exception e) {
24502469
responseObserver.onError(getRunTimeException(e));

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

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
import com.alibaba.fastjson.JSONArray;
44
import com.alibaba.fastjson.JSONObject;
5-
import java.util.stream.Collectors;
65
import javax.servlet.http.HttpServletRequest;
76
import javax.servlet.http.HttpServletResponse;
87
import lombok.extern.slf4j.Slf4j;
@@ -41,22 +40,34 @@ protected void doPost(HttpServletRequest request, HttpServletResponse response)
4140
IvkDecryptTRC20Parameters.Builder ivkDecryptTRC20Parameters = IvkDecryptTRC20Parameters
4241
.newBuilder();
4342
JsonFormat.merge(params.getParams(), ivkDecryptTRC20Parameters, params.isVisible());
44-
43+
try {
44+
Util.rejectIfEventsPresent(ivkDecryptTRC20Parameters.getEventsList());
45+
} catch (IllegalArgumentException e) {
46+
response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
47+
Util.processError(e, response);
48+
return;
49+
}
4550
GrpcAPI.DecryptNotesTRC20 notes = wallet
4651
.scanShieldedTRC20NotesByIvk(ivkDecryptTRC20Parameters.getStartBlockIndex(),
4752
ivkDecryptTRC20Parameters.getEndBlockIndex(),
4853
ivkDecryptTRC20Parameters.getShieldedTRC20ContractAddress().toByteArray(),
4954
ivkDecryptTRC20Parameters.getIvk().toByteArray(),
5055
ivkDecryptTRC20Parameters.getAk().toByteArray(),
51-
ivkDecryptTRC20Parameters.getNk().toByteArray(),
52-
ivkDecryptTRC20Parameters.getEventsList());
56+
ivkDecryptTRC20Parameters.getNk().toByteArray());
5357
response.getWriter().println(convertOutput(notes, params.isVisible()));
5458
} catch (Exception e) {
5559
Util.processError(e, response);
5660
}
5761
}
5862

5963
protected void doGet(HttpServletRequest request, HttpServletResponse response) {
64+
try {
65+
Util.rejectIfEventsPresent(request.getParameterValues("events"));
66+
} catch (IllegalArgumentException e) {
67+
response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
68+
Util.processError(e, response);
69+
return;
70+
}
6071
try {
6172
boolean visible = Util.getVisible(request);
6273
long startNum = Long.parseLong(request.getParameter("start_block_index"));
@@ -74,7 +85,7 @@ protected void doGet(HttpServletRequest request, HttpServletResponse response) {
7485
GrpcAPI.DecryptNotesTRC20 notes = wallet
7586
.scanShieldedTRC20NotesByIvk(startNum, endNum,
7687
ByteArray.fromHexString(contractAddress), ByteArray.fromHexString(ivk),
77-
ByteArray.fromHexString(ak), ByteArray.fromHexString(nk), null);
88+
ByteArray.fromHexString(ak), ByteArray.fromHexString(nk));
7889
response.getWriter().println(convertOutput(notes, visible));
7990
} catch (Exception e) {
8091
Util.processError(e, response);

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

Lines changed: 16 additions & 6 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,14 +23,18 @@ protected void doPost(HttpServletRequest request, HttpServletResponse response)
2423
OvkDecryptTRC20Parameters.Builder ovkDecryptTRC20Parameters = OvkDecryptTRC20Parameters
2524
.newBuilder();
2625
JsonFormat.merge(params.getParams(), ovkDecryptTRC20Parameters, params.isVisible());
27-
26+
try {
27+
Util.rejectIfEventsPresent(ovkDecryptTRC20Parameters.getEventsList());
28+
} catch (IllegalArgumentException e) {
29+
response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
30+
Util.processError(e, response);
31+
return;
32+
}
2833
GrpcAPI.DecryptNotesTRC20 notes = wallet
2934
.scanShieldedTRC20NotesByOvk(ovkDecryptTRC20Parameters.getStartBlockIndex(),
3035
ovkDecryptTRC20Parameters.getEndBlockIndex(),
3136
ovkDecryptTRC20Parameters.getOvk().toByteArray(),
32-
ovkDecryptTRC20Parameters.getShieldedTRC20ContractAddress().toByteArray(),
33-
ovkDecryptTRC20Parameters.getEventsList()
34-
);
37+
ovkDecryptTRC20Parameters.getShieldedTRC20ContractAddress().toByteArray());
3538
response.getWriter()
3639
.println(ScanShieldedTRC20NotesByIvkServlet.convertOutput(notes, params.isVisible()));
3740
} catch (Exception e) {
@@ -40,6 +43,13 @@ protected void doPost(HttpServletRequest request, HttpServletResponse response)
4043
}
4144

4245
protected void doGet(HttpServletRequest request, HttpServletResponse response) {
46+
try {
47+
Util.rejectIfEventsPresent(request.getParameterValues("events"));
48+
} catch (IllegalArgumentException e) {
49+
response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
50+
Util.processError(e, response);
51+
return;
52+
}
4353
try {
4454
boolean visible = Util.getVisible(request);
4555
long startBlockIndex = Long.parseLong(request.getParameter("start_block_index"));
@@ -51,7 +61,7 @@ protected void doGet(HttpServletRequest request, HttpServletResponse response) {
5161
}
5262
GrpcAPI.DecryptNotesTRC20 notes = wallet
5363
.scanShieldedTRC20NotesByOvk(startBlockIndex, endBlockIndex,
54-
ByteArray.fromHexString(ovk), ByteArray.fromHexString(contractAddress), null);
64+
ByteArray.fromHexString(ovk), ByteArray.fromHexString(contractAddress));
5565

5666
response.getWriter()
5767
.println(ScanShieldedTRC20NotesByIvkServlet.convertOutput(notes, visible));

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

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import com.google.protobuf.GeneratedMessageV3;
1313
import com.google.protobuf.InvalidProtocolBufferException;
1414
import com.google.protobuf.Message;
15+
import com.google.protobuf.ProtocolStringList;
1516

1617
import java.io.BufferedReader;
1718
import java.io.IOException;
@@ -64,6 +65,9 @@
6465
@Slf4j(topic = "API")
6566
public class Util {
6667

68+
public static final String EVENTS_DEPRECATED_MSG =
69+
"'events' field is deprecated and no longer supported";
70+
6771
public static final String PERMISSION_ID = "Permission_id";
6872
public static final String VISIBLE = "visible";
6973
public static final String TRANSACTION = "transaction";
@@ -80,6 +84,24 @@ public class Util {
8084
public static final String FUNCTION_PARAMETER = "parameter";
8185
public static final String CALL_DATA = "data";
8286

87+
public static void rejectIfEventsPresent(ProtocolStringList events) {
88+
if (events.stream().anyMatch(s -> !s.isEmpty())) {
89+
logger.info(EVENTS_DEPRECATED_MSG);
90+
throw new IllegalArgumentException(EVENTS_DEPRECATED_MSG);
91+
}
92+
}
93+
94+
public static void rejectIfEventsPresent(String[] eventsParams) {
95+
if (eventsParams != null) {
96+
for (String v : eventsParams) {
97+
if (v != null && !v.isEmpty()) {
98+
logger.info(EVENTS_DEPRECATED_MSG);
99+
throw new IllegalArgumentException(EVENTS_DEPRECATED_MSG);
100+
}
101+
}
102+
}
103+
}
104+
83105
public static String printTransactionFee(String transactionFee) {
84106
JSONObject jsonObject = new JSONObject();
85107
JSONObject receipt = JSONObject.parseObject(transactionFee);

0 commit comments

Comments
 (0)