Skip to content

Commit b38c35c

Browse files
authored
fix(crypto): deprecate events field in shielded TRC20 scan APIs (#6683)
1 parent 2c307c8 commit b38c35c

10 files changed

Lines changed: 360 additions & 88 deletions

File tree

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

Lines changed: 16 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,6 @@
4444
import com.google.common.collect.Range;
4545
import com.google.protobuf.ByteString;
4646
import com.google.protobuf.InvalidProtocolBufferException;
47-
import com.google.protobuf.ProtocolStringList;
4847
import java.math.BigInteger;
4948
import java.security.SignatureException;
5049
import java.util.ArrayList;
@@ -158,7 +157,6 @@
158157
import org.tron.core.capsule.TransactionCapsule;
159158
import org.tron.core.capsule.TransactionInfoCapsule;
160159
import org.tron.core.capsule.TransactionResultCapsule;
161-
import org.tron.core.capsule.TransactionRetCapsule;
162160
import org.tron.core.capsule.VotesCapsule;
163161
import org.tron.core.capsule.WitnessCapsule;
164162
import org.tron.core.capsule.utils.MarketUtils;
@@ -3808,8 +3806,8 @@ public ShieldedTRC20Parameters createShieldedContractParametersWithoutAsk(
38083806
}
38093807
}
38103808

3811-
private int getShieldedTRC20LogType(TransactionInfo.Log log, byte[] contractAddress,
3812-
ProtocolStringList topicsList) throws ZksnarkException {
3809+
private int getShieldedTRC20LogType(TransactionInfo.Log log, byte[] contractAddress)
3810+
throws ZksnarkException {
38133811
byte[] logAddress = log.getAddress().toByteArray();
38143812
byte[] addressWithoutPrefix = new byte[20];
38153813
if (ArrayUtils.isEmpty(contractAddress) || contractAddress.length != 21) {
@@ -3822,33 +3820,14 @@ private int getShieldedTRC20LogType(TransactionInfo.Log log, byte[] contractAddr
38223820
for (ByteString bs : logTopicsList) {
38233821
topicsBytes = ByteUtil.merge(topicsBytes, bs.toByteArray());
38243822
}
3825-
if (Objects.isNull(topicsList) || topicsList.isEmpty()) {
3826-
if (Arrays.equals(topicsBytes, SHIELDED_TRC20_LOG_TOPICS_MINT)) {
3827-
return 1;
3828-
} else if (Arrays.equals(topicsBytes, SHIELDED_TRC20_LOG_TOPICS_TRANSFER)) {
3829-
return 2;
3830-
} else if (Arrays.equals(topicsBytes, SHIELDED_TRC20_LOG_TOPICS_BURN_LEAF)) {
3831-
return 3;
3832-
} else if (Arrays.equals(topicsBytes, SHIELDED_TRC20_LOG_TOPICS_BURN_TOKEN)) {
3833-
return 4;
3834-
}
3835-
} else {
3836-
for (String topic : topicsList) {
3837-
byte[] topicHash = Hash.sha3(ByteArray.fromString(topic));
3838-
if (Arrays.equals(topicsBytes, topicHash)) {
3839-
if (topic.toLowerCase().contains("mint")) {
3840-
return 1;
3841-
} else if (topic.toLowerCase().contains("transfer")) {
3842-
return 2;
3843-
} else if (topic.toLowerCase().contains("burn")) {
3844-
if (topic.toLowerCase().contains("leaf")) {
3845-
return 3;
3846-
} else if (topic.toLowerCase().contains("token")) {
3847-
return 4;
3848-
}
3849-
}
3850-
}
3851-
}
3823+
if (Arrays.equals(topicsBytes, SHIELDED_TRC20_LOG_TOPICS_MINT)) {
3824+
return 1;
3825+
} else if (Arrays.equals(topicsBytes, SHIELDED_TRC20_LOG_TOPICS_TRANSFER)) {
3826+
return 2;
3827+
} else if (Arrays.equals(topicsBytes, SHIELDED_TRC20_LOG_TOPICS_BURN_LEAF)) {
3828+
return 3;
3829+
} else if (Arrays.equals(topicsBytes, SHIELDED_TRC20_LOG_TOPICS_BURN_TOKEN)) {
3830+
return 4;
38523831
}
38533832
}
38543833
return 0;
@@ -3898,8 +3877,7 @@ private Optional<DecryptNotesTRC20.NoteTx> getNoteTxFromLogListByIvk(
38983877
}
38993878

39003879
private DecryptNotesTRC20 queryTRC20NoteByIvk(long startNum, long endNum,
3901-
byte[] shieldedTRC20ContractAddress, byte[] ivk, byte[] ak, byte[] nk,
3902-
ProtocolStringList topicsList)
3880+
byte[] shieldedTRC20ContractAddress, byte[] ivk, byte[] ak, byte[] nk)
39033881
throws BadItemException, ZksnarkException, ContractExeException {
39043882
if (!(startNum >= 0 && endNum > startNum && endNum - startNum <= 1000)) {
39053883
throw new BadItemException(
@@ -3920,7 +3898,7 @@ private DecryptNotesTRC20 queryTRC20NoteByIvk(long startNum, long endNum,
39203898
Optional<DecryptNotesTRC20.NoteTx> noteTx;
39213899
int index = 0;
39223900
for (TransactionInfo.Log log : logList) {
3923-
int logType = getShieldedTRC20LogType(log, shieldedTRC20ContractAddress, topicsList);
3901+
int logType = getShieldedTRC20LogType(log, shieldedTRC20ContractAddress);
39243902
if (logType > 0) {
39253903
noteBuilder = DecryptNotesTRC20.NoteTx.newBuilder();
39263904
noteBuilder.setTxid(ByteString.copyFrom(txId));
@@ -4004,12 +3982,11 @@ private boolean isShieldedTRC20NoteSpent(GrpcAPI.Note note, long pos, byte[] ak,
40043982

40053983
public DecryptNotesTRC20 scanShieldedTRC20NotesByIvk(
40063984
long startNum, long endNum, byte[] shieldedTRC20ContractAddress,
4007-
byte[] ivk, byte[] ak, byte[] nk, ProtocolStringList topicsList)
3985+
byte[] ivk, byte[] ak, byte[] nk)
40083986
throws BadItemException, ZksnarkException, ContractExeException {
40093987
checkAllowShieldedTransactionApi();
40103988

4011-
return queryTRC20NoteByIvk(startNum, endNum,
4012-
shieldedTRC20ContractAddress, ivk, ak, nk, topicsList);
3989+
return queryTRC20NoteByIvk(startNum, endNum, shieldedTRC20ContractAddress, ivk, ak, nk);
40133990
}
40143991

40153992
private Optional<DecryptNotesTRC20.NoteTx> getNoteTxFromLogListByOvk(
@@ -4083,7 +4060,7 @@ private Optional<DecryptNotesTRC20.NoteTx> getNoteTxFromLogListByOvk(
40834060
}
40844061

40854062
public DecryptNotesTRC20 scanShieldedTRC20NotesByOvk(long startNum, long endNum,
4086-
byte[] ovk, byte[] shieldedTRC20ContractAddress, ProtocolStringList topicsList)
4063+
byte[] ovk, byte[] shieldedTRC20ContractAddress)
40874064
throws ZksnarkException, BadItemException {
40884065
checkAllowShieldedTransactionApi();
40894066

@@ -4105,7 +4082,7 @@ public DecryptNotesTRC20 scanShieldedTRC20NotesByOvk(long startNum, long endNum,
41054082
Optional<DecryptNotesTRC20.NoteTx> noteTx;
41064083
int index = 0;
41074084
for (TransactionInfo.Log log : logList) {
4108-
int logType = getShieldedTRC20LogType(log, shieldedTRC20ContractAddress, topicsList);
4085+
int logType = getShieldedTRC20LogType(log, shieldedTRC20ContractAddress);
41094086
if (logType > 0) {
41104087
noteBuilder = DecryptNotesTRC20.NoteTx.newBuilder();
41114088
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 (Util.hasMeaningfulEvents(events)) {
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: 26 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 INT64_AS_STRING_PARAM = "int64_as_string";
@@ -81,6 +85,28 @@ public class Util {
8185
public static final String FUNCTION_PARAMETER = "parameter";
8286
public static final String CALL_DATA = "data";
8387

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

0 commit comments

Comments
 (0)