diff --git a/common/src/main/java/org/tron/common/parameter/CommonParameter.java b/common/src/main/java/org/tron/common/parameter/CommonParameter.java index 23974183fdc..45893970fb0 100644 --- a/common/src/main/java/org/tron/common/parameter/CommonParameter.java +++ b/common/src/main/java/org/tron/common/parameter/CommonParameter.java @@ -8,9 +8,9 @@ import java.util.Set; import lombok.Getter; import lombok.Setter; -import org.tron.common.cron.CronExpression; import org.tron.common.args.GenesisBlock; import org.tron.common.config.DbBackupConfig; +import org.tron.common.cron.CronExpression; import org.tron.common.logsfilter.EventPluginConfig; import org.tron.common.logsfilter.FilterQuery; import org.tron.common.setting.RocksDbSettings; @@ -495,6 +495,13 @@ public class CommonParameter { @Getter @Setter public boolean jsonRpcHttpPBFTNodeEnable = false; + @Getter + @Setter + public int jsonRpcMaxBlockRange = 5000; + @Getter + @Setter + public int jsonRpcMaxSubTopics = 1000; + @Getter @Setter public int maxTransactionPendingSize; diff --git a/common/src/main/java/org/tron/common/utils/ByteUtil.java b/common/src/main/java/org/tron/common/utils/ByteUtil.java index 88d4cfdf90b..a7f7abd8fa8 100644 --- a/common/src/main/java/org/tron/common/utils/ByteUtil.java +++ b/common/src/main/java/org/tron/common/utils/ByteUtil.java @@ -479,40 +479,41 @@ public static byte[] setBit(byte[] data, int pos, int val) { public static byte[] compress(byte[] data) throws EventBloomException { Deflater deflater = new Deflater(); - deflater.setInput(data); - ByteArrayOutputStream outputStream = new ByteArrayOutputStream(data.length); + try (ByteArrayOutputStream outputStream = new ByteArrayOutputStream(data.length)) { + deflater.setInput(data); + deflater.finish(); + byte[] buffer = new byte[1024]; - deflater.finish(); - byte[] buffer = new byte[1024]; - while (!deflater.finished()) { - int count = deflater.deflate(buffer); // returns the generated code... index - outputStream.write(buffer, 0, count); - } - try { - outputStream.close(); + while (!deflater.finished()) { + int count = deflater.deflate(buffer); // returns the generated code... index + outputStream.write(buffer, 0, count); + } + + return outputStream.toByteArray(); } catch (IOException e) { throw new EventBloomException("compress data failed"); + } finally { + deflater.end(); } - byte[] output = outputStream.toByteArray(); - - return output; } public static byte[] decompress(byte[] data) throws IOException, DataFormatException { Inflater inflater = new Inflater(); - inflater.setInput(data); - ByteArrayOutputStream outputStream = new ByteArrayOutputStream(data.length); - byte[] buffer = new byte[1024]; - while (!inflater.finished()) { - int count = inflater.inflate(buffer); - outputStream.write(buffer, 0, count); - } - outputStream.close(); - byte[] output = outputStream.toByteArray(); + try (ByteArrayOutputStream outputStream = new ByteArrayOutputStream(data.length)) { + inflater.setInput(data); + byte[] buffer = new byte[1024]; + + while (!inflater.finished()) { + int count = inflater.inflate(buffer); + outputStream.write(buffer, 0, count); + } - return output; + return outputStream.toByteArray(); + } finally { + inflater.end(); + } } } diff --git a/common/src/main/java/org/tron/core/Constant.java b/common/src/main/java/org/tron/core/Constant.java index bb35b207795..c5a8a02fb4e 100644 --- a/common/src/main/java/org/tron/core/Constant.java +++ b/common/src/main/java/org/tron/core/Constant.java @@ -145,6 +145,8 @@ public class Constant { public static final String NODE_JSONRPC_HTTP_SOLIDITY_PORT = "node.jsonrpc.httpSolidityPort"; public static final String NODE_JSONRPC_HTTP_PBFT_ENABLE = "node.jsonrpc.httpPBFTEnable"; public static final String NODE_JSONRPC_HTTP_PBFT_PORT = "node.jsonrpc.httpPBFTPort"; + public static final String NODE_JSONRPC_MAX_BLOCK_RANGE = "node.jsonrpc.maxBlockRange"; + public static final String NODE_JSONRPC_MAX_SUB_TOPICS = "node.jsonrpc.maxSubTopics"; public static final String NODE_DISABLED_API_LIST = "node.disabledApi"; diff --git a/framework/src/main/java/org/tron/core/config/args/Args.java b/framework/src/main/java/org/tron/core/config/args/Args.java index f9e6610930f..3162360bbb9 100644 --- a/framework/src/main/java/org/tron/core/config/args/Args.java +++ b/framework/src/main/java/org/tron/core/config/args/Args.java @@ -202,6 +202,8 @@ public static void clearParam() { PARAMETER.jsonRpcHttpFullNodeEnable = false; PARAMETER.jsonRpcHttpSolidityNodeEnable = false; PARAMETER.jsonRpcHttpPBFTNodeEnable = false; + PARAMETER.jsonRpcMaxBlockRange = 5000; + PARAMETER.jsonRpcMaxSubTopics = 1000; PARAMETER.nodeMetricsEnable = false; PARAMETER.metricsStorageEnable = false; PARAMETER.metricsPrometheusEnable = false; @@ -507,6 +509,16 @@ public static void setParam(final Config config) { config.getBoolean(Constant.NODE_JSONRPC_HTTP_PBFT_ENABLE); } + if (config.hasPath(Constant.NODE_JSONRPC_MAX_BLOCK_RANGE)) { + PARAMETER.jsonRpcMaxBlockRange = + config.getInt(Constant.NODE_JSONRPC_MAX_BLOCK_RANGE); + } + + if (config.hasPath(Constant.NODE_JSONRPC_MAX_SUB_TOPICS)) { + PARAMETER.jsonRpcMaxSubTopics = + config.getInt(Constant.NODE_JSONRPC_MAX_SUB_TOPICS); + } + if (config.hasPath(Constant.VM_MIN_TIME_RATIO)) { PARAMETER.minTimeRatio = config.getDouble(Constant.VM_MIN_TIME_RATIO); } diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java index 6b90ec92283..eb432432a1c 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java @@ -1327,7 +1327,7 @@ public LogFilterElement[] getLogs(FilterRequest fr) throws JsonRpcInvalidParamsE long currentMaxBlockNum = wallet.getNowBlock().getBlockHeader().getRawData().getNumber(); //convert FilterRequest to LogFilterWrapper - LogFilterWrapper logFilterWrapper = new LogFilterWrapper(fr, currentMaxBlockNum, wallet); + LogFilterWrapper logFilterWrapper = new LogFilterWrapper(fr, currentMaxBlockNum, wallet, true); return getLogsByLogFilterWrapper(logFilterWrapper, currentMaxBlockNum); } diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/filters/LogBlockQuery.java b/framework/src/main/java/org/tron/core/services/jsonrpc/filters/LogBlockQuery.java index 7ee6ce74c10..7665c51106f 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/filters/LogBlockQuery.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/filters/LogBlockQuery.java @@ -39,23 +39,21 @@ public LogBlockQuery(LogFilterWrapper logFilterWrapper, SectionBloomStore sectio this.currentMaxBlockNum = currentMaxBlockNum; if (logFilterWrapper.getFromBlock() == Long.MAX_VALUE) { - minSection = (int) (currentMaxBlockNum / Bloom.BLOOM_BIT_SIZE); minBlock = currentMaxBlockNum; } else { - minSection = (int) (logFilterWrapper.getFromBlock() / Bloom.BLOOM_BIT_SIZE); minBlock = logFilterWrapper.getFromBlock(); } + minSection = (int) (minBlock / Bloom.BLOOM_BIT_SIZE); if (logFilterWrapper.getToBlock() == Long.MAX_VALUE) { - maxSection = (int) (currentMaxBlockNum / Bloom.BLOOM_BIT_SIZE); maxBlock = currentMaxBlockNum; } else { - maxSection = (int) (logFilterWrapper.getToBlock() / Bloom.BLOOM_BIT_SIZE); maxBlock = logFilterWrapper.getToBlock(); if (maxBlock > currentMaxBlockNum) { maxBlock = currentMaxBlockNum; } } + maxSection = (int) (maxBlock / Bloom.BLOOM_BIT_SIZE); } public List getPossibleBlock() throws ExecutionException, InterruptedException, @@ -71,7 +69,7 @@ public List getPossibleBlock() throws ExecutionException, InterruptedExcep BitSet blockNumBitSet = new BitSet(capacity); blockNumBitSet.set(0, capacity); - //works serial + // works serial for (int[][] conditionsIndex : allConditionsIndex) { BitSet bitSet = subMatch(conditionsIndex); blockNumBitSet.and(bitSet); diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/filters/LogFilter.java b/framework/src/main/java/org/tron/core/services/jsonrpc/filters/LogFilter.java index 01be54538b2..ce315e506d2 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/filters/LogFilter.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/filters/LogFilter.java @@ -13,6 +13,7 @@ import org.tron.common.bloom.Bloom; import org.tron.common.crypto.Hash; import org.tron.common.runtime.vm.DataWord; +import org.tron.core.config.args.Args; import org.tron.core.exception.JsonRpcInvalidParamsException; import org.tron.core.services.jsonrpc.TronJsonRpc.FilterRequest; import org.tron.protos.Protocol.TransactionInfo.Log; @@ -35,6 +36,8 @@ public class LogFilter { @Setter private Bloom[][] filterBlooms; + // The maximum number of topic criteria allowed, vm.LOG4 - vm.LOG0 + private final int maxTopics = 4; public LogFilter() { } @@ -66,8 +69,8 @@ public LogFilter(FilterRequest fr) throws JsonRpcInvalidParamsException { if (fr.getTopics() != null) { //restrict depth of topics, because event has a signature and most 3 indexed parameters - if (fr.getTopics().length > 4) { - throw new JsonRpcInvalidParamsException("topics size should be <= 4"); + if (fr.getTopics().length > maxTopics) { + throw new JsonRpcInvalidParamsException("topics size should be <= " + maxTopics); } for (Object topic : fr.getTopics()) { if (topic == null) { @@ -79,6 +82,10 @@ public LogFilter(FilterRequest fr) throws JsonRpcInvalidParamsException { throw new JsonRpcInvalidParamsException("invalid topic(s): " + topic); } } else if (topic instanceof ArrayList) { + int maxSubTopics = Args.getInstance().getJsonRpcMaxSubTopics(); + if (maxSubTopics > 0 && ((ArrayList) topic).size() > maxSubTopics) { + throw new JsonRpcInvalidParamsException("exceed max topics: " + maxSubTopics); + } List t = new ArrayList<>(); for (Object s : ((ArrayList) topic)) { diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/filters/LogFilterAndResult.java b/framework/src/main/java/org/tron/core/services/jsonrpc/filters/LogFilterAndResult.java index 5ed6c3e3841..3b893aec4cf 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/filters/LogFilterAndResult.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/filters/LogFilterAndResult.java @@ -16,7 +16,8 @@ public class LogFilterAndResult extends FilterResult { public LogFilterAndResult(FilterRequest fr, long currentMaxBlockNum, Wallet wallet) throws JsonRpcInvalidParamsException { - this.logFilterWrapper = new LogFilterWrapper(fr, currentMaxBlockNum, wallet); + // eth_newFilter, no need to check block range + this.logFilterWrapper = new LogFilterWrapper(fr, currentMaxBlockNum, wallet, false); result = new LinkedBlockingQueue<>(); this.updateExpireTime(); } diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/filters/LogFilterWrapper.java b/framework/src/main/java/org/tron/core/services/jsonrpc/filters/LogFilterWrapper.java index 7fcbab33ee3..ec5c4640a16 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/filters/LogFilterWrapper.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/filters/LogFilterWrapper.java @@ -7,6 +7,7 @@ import org.apache.commons.lang3.StringUtils; import org.tron.common.utils.ByteArray; import org.tron.core.Wallet; +import org.tron.core.config.args.Args; import org.tron.core.exception.JsonRpcInvalidParamsException; import org.tron.core.services.jsonrpc.JsonRpcApiUtil; import org.tron.core.services.jsonrpc.TronJsonRpc.FilterRequest; @@ -23,8 +24,8 @@ public class LogFilterWrapper { @Getter private final long toBlock; - public LogFilterWrapper(FilterRequest fr, long currentMaxBlockNum, Wallet wallet) - throws JsonRpcInvalidParamsException { + public LogFilterWrapper(FilterRequest fr, long currentMaxBlockNum, Wallet wallet, + boolean checkBlockRange) throws JsonRpcInvalidParamsException { // 1.convert FilterRequest to LogFilter this.logFilter = new LogFilter(fr); @@ -86,6 +87,12 @@ public LogFilterWrapper(FilterRequest fr, long currentMaxBlockNum, Wallet wallet throw new JsonRpcInvalidParamsException("please verify: fromBlock <= toBlock"); } } + + // till now, it needs to check block range for eth_getLogs + int maxBlockRange = Args.getInstance().getJsonRpcMaxBlockRange(); + if (checkBlockRange && maxBlockRange > 0 && (toBlockSrc - fromBlockSrc) > maxBlockRange) { + throw new JsonRpcInvalidParamsException("exceed max block range: " + maxBlockRange); + } } this.fromBlock = fromBlockSrc; diff --git a/framework/src/main/resources/config-localtest.conf b/framework/src/main/resources/config-localtest.conf index 50e7539c1d0..405a0f92b2d 100644 --- a/framework/src/main/resources/config-localtest.conf +++ b/framework/src/main/resources/config-localtest.conf @@ -161,6 +161,8 @@ node { # httpSolidityPort = 8555 # httpPBFTEnable = true # httpPBFTPort = 8565 + # maxBlockRange = 5000 + # maxSubTopics = 1000 } } diff --git a/framework/src/main/resources/config.conf b/framework/src/main/resources/config.conf index a89d6fd094e..3236573a889 100644 --- a/framework/src/main/resources/config.conf +++ b/framework/src/main/resources/config.conf @@ -291,6 +291,14 @@ node { # httpSolidityPort = 8555 # httpPBFTEnable = true # httpPBFTPort = 8565 + + # The maximum blocks range to retrieve logs for eth_getLogs, default value is 5000, + # should be > 0, otherwise means no limit. + # maxBlockRange = 5000 + + # The maximum number of allowed topics within a topic criteria, default value is 1000, + # should be > 0, otherwise means no limit. + # maxSubTopics = 1000 } # Disabled api list, it will work for http, rpc and pbft, both fullnode and soliditynode, diff --git a/framework/src/test/java/org/tron/core/config/args/ArgsTest.java b/framework/src/test/java/org/tron/core/config/args/ArgsTest.java index 845f70a38a4..c3c9f24ef6b 100644 --- a/framework/src/test/java/org/tron/core/config/args/ArgsTest.java +++ b/framework/src/test/java/org/tron/core/config/args/ArgsTest.java @@ -173,6 +173,8 @@ public void testInitService() { Assert.assertFalse(Args.getInstance().isJsonRpcHttpFullNodeEnable()); Assert.assertFalse(Args.getInstance().isJsonRpcHttpSolidityNodeEnable()); Assert.assertFalse(Args.getInstance().isJsonRpcHttpPBFTNodeEnable()); + Assert.assertEquals(5000, Args.getInstance().getJsonRpcMaxBlockRange()); + Assert.assertEquals(1000, Args.getInstance().getJsonRpcMaxSubTopics()); Args.clearParam(); // test set all true value storage.put("node.rpc.enable", "true"); @@ -184,6 +186,8 @@ public void testInitService() { storage.put("node.jsonrpc.httpFullNodeEnable", "true"); storage.put("node.jsonrpc.httpSolidityEnable", "true"); storage.put("node.jsonrpc.httpPBFTEnable", "true"); + storage.put("node.jsonrpc.maxBlockRange", "10"); + storage.put("node.jsonrpc.maxSubTopics", "20"); config = ConfigFactory.defaultOverrides().withFallback(ConfigFactory.parseMap(storage)); // test value Args.setParam(config); @@ -196,6 +200,8 @@ public void testInitService() { Assert.assertTrue(Args.getInstance().isJsonRpcHttpFullNodeEnable()); Assert.assertTrue(Args.getInstance().isJsonRpcHttpSolidityNodeEnable()); Assert.assertTrue(Args.getInstance().isJsonRpcHttpPBFTNodeEnable()); + Assert.assertEquals(10, Args.getInstance().getJsonRpcMaxBlockRange()); + Assert.assertEquals(20, Args.getInstance().getJsonRpcMaxSubTopics()); Args.clearParam(); // test set all false value storage.put("node.rpc.enable", "false"); @@ -207,6 +213,8 @@ public void testInitService() { storage.put("node.jsonrpc.httpFullNodeEnable", "false"); storage.put("node.jsonrpc.httpSolidityEnable", "false"); storage.put("node.jsonrpc.httpPBFTEnable", "false"); + storage.put("node.jsonrpc.maxBlockRange", "5000"); + storage.put("node.jsonrpc.maxSubTopics", "1000"); config = ConfigFactory.defaultOverrides().withFallback(ConfigFactory.parseMap(storage)); // test value Args.setParam(config); @@ -219,6 +227,8 @@ public void testInitService() { Assert.assertFalse(Args.getInstance().isJsonRpcHttpFullNodeEnable()); Assert.assertFalse(Args.getInstance().isJsonRpcHttpSolidityNodeEnable()); Assert.assertFalse(Args.getInstance().isJsonRpcHttpPBFTNodeEnable()); + Assert.assertEquals(5000, Args.getInstance().getJsonRpcMaxBlockRange()); + Assert.assertEquals(1000, Args.getInstance().getJsonRpcMaxSubTopics()); Args.clearParam(); // test set random value storage.put("node.rpc.enable", "false"); @@ -230,6 +240,8 @@ public void testInitService() { storage.put("node.jsonrpc.httpFullNodeEnable", "true"); storage.put("node.jsonrpc.httpSolidityEnable", "false"); storage.put("node.jsonrpc.httpPBFTEnable", "true"); + storage.put("node.jsonrpc.maxBlockRange", "30"); + storage.put("node.jsonrpc.maxSubTopics", "40"); config = ConfigFactory.defaultOverrides().withFallback(ConfigFactory.parseMap(storage)); // test value Args.setParam(config); @@ -242,6 +254,8 @@ public void testInitService() { Assert.assertTrue(Args.getInstance().isJsonRpcHttpFullNodeEnable()); Assert.assertFalse(Args.getInstance().isJsonRpcHttpSolidityNodeEnable()); Assert.assertTrue(Args.getInstance().isJsonRpcHttpPBFTNodeEnable()); + Assert.assertEquals(30, Args.getInstance().getJsonRpcMaxBlockRange()); + Assert.assertEquals(40, Args.getInstance().getJsonRpcMaxSubTopics()); Args.clearParam(); } } diff --git a/framework/src/test/java/org/tron/core/jsonrpc/JsonRpcTest.java b/framework/src/test/java/org/tron/core/jsonrpc/JsonRpcTest.java index c9e6d6a2330..bef0b5a1593 100644 --- a/framework/src/test/java/org/tron/core/jsonrpc/JsonRpcTest.java +++ b/framework/src/test/java/org/tron/core/jsonrpc/JsonRpcTest.java @@ -284,7 +284,8 @@ public void testGetConditions() { topics, null), 100, - null); + null, + false); LogBlockQuery logBlockQuery = new LogBlockQuery(logFilterWrapper, null, 100, null); int[][][] conditions = logBlockQuery.getConditions(); @@ -331,7 +332,8 @@ public void testGetConditionWithHashCollision() { topics, null), 100, - null); + null, + false); LogBlockQuery logBlockQuery = new LogBlockQuery(logFilterWrapper, null, 100, null); int[][][] conditions = logBlockQuery.getConditions(); diff --git a/framework/src/test/java/org/tron/core/jsonrpc/JsonrpcServiceTest.java b/framework/src/test/java/org/tron/core/jsonrpc/JsonrpcServiceTest.java index 7af59f28ace..3da7072c216 100644 --- a/framework/src/test/java/org/tron/core/jsonrpc/JsonrpcServiceTest.java +++ b/framework/src/test/java/org/tron/core/jsonrpc/JsonrpcServiceTest.java @@ -7,6 +7,9 @@ import com.google.gson.JsonObject; import com.google.protobuf.ByteString; import io.prometheus.client.CollectorRegistry; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; import javax.annotation.Resource; import lombok.extern.slf4j.Slf4j; import org.apache.http.client.methods.CloseableHttpResponse; @@ -545,7 +548,7 @@ public void testLogFilterWrapper() { // fromBlock and toBlock are both empty try { LogFilterWrapper logFilterWrapper = - new LogFilterWrapper(new FilterRequest(null, null, null, null, null), 100, null); + new LogFilterWrapper(new FilterRequest(null, null, null, null, null), 100, null, false); Assert.assertEquals(100, logFilterWrapper.getFromBlock()); Assert.assertEquals(Long.MAX_VALUE, logFilterWrapper.getToBlock()); } catch (JsonRpcInvalidParamsException e) { @@ -555,7 +558,7 @@ public void testLogFilterWrapper() { // fromBlock is not empty and smaller than currentMaxBlockNum, toBlock is empty try { LogFilterWrapper logFilterWrapper = - new LogFilterWrapper(new FilterRequest("0x14", null, null, null, null), 100, null); + new LogFilterWrapper(new FilterRequest("0x14", null, null, null, null), 100, null, false); Assert.assertEquals(20, logFilterWrapper.getFromBlock()); Assert.assertEquals(Long.MAX_VALUE, logFilterWrapper.getToBlock()); } catch (JsonRpcInvalidParamsException e) { @@ -565,7 +568,7 @@ public void testLogFilterWrapper() { // fromBlock is not empty and bigger than currentMaxBlockNum, toBlock is empty try { LogFilterWrapper logFilterWrapper = - new LogFilterWrapper(new FilterRequest("0x78", null, null, null, null), 100, null); + new LogFilterWrapper(new FilterRequest("0x78", null, null, null, null), 100, null, false); Assert.assertEquals(120, logFilterWrapper.getFromBlock()); Assert.assertEquals(Long.MAX_VALUE, logFilterWrapper.getToBlock()); } catch (JsonRpcInvalidParamsException e) { @@ -575,7 +578,7 @@ public void testLogFilterWrapper() { // fromBlock is empty, toBlock is not empty and smaller than currentMaxBlockNum try { LogFilterWrapper logFilterWrapper = - new LogFilterWrapper(new FilterRequest(null, "0x14", null, null, null), 100, null); + new LogFilterWrapper(new FilterRequest(null, "0x14", null, null, null), 100, null, false); Assert.assertEquals(20, logFilterWrapper.getFromBlock()); Assert.assertEquals(20, logFilterWrapper.getToBlock()); } catch (JsonRpcInvalidParamsException e) { @@ -585,7 +588,7 @@ public void testLogFilterWrapper() { // fromBlock is empty, toBlock is not empty and bigger than currentMaxBlockNum try { LogFilterWrapper logFilterWrapper = - new LogFilterWrapper(new FilterRequest(null, "0x78", null, null, null), 100, null); + new LogFilterWrapper(new FilterRequest(null, "0x78", null, null, null), 100, null, false); Assert.assertEquals(100, logFilterWrapper.getFromBlock()); Assert.assertEquals(120, logFilterWrapper.getToBlock()); } catch (JsonRpcInvalidParamsException e) { @@ -594,55 +597,210 @@ public void testLogFilterWrapper() { // fromBlock is not empty, toBlock is not empty try { - LogFilterWrapper logFilterWrapper = - new LogFilterWrapper(new FilterRequest("0x14", "0x78", null, null, null), 100, null); + LogFilterWrapper logFilterWrapper = new LogFilterWrapper(new FilterRequest("0x14", "0x78", + null, null, null), 100, null, false); Assert.assertEquals(20, logFilterWrapper.getFromBlock()); Assert.assertEquals(120, logFilterWrapper.getToBlock()); } catch (JsonRpcInvalidParamsException e) { Assert.fail(); } try { - LogFilterWrapper logFilterWrapper = - new LogFilterWrapper(new FilterRequest("0x78", "0x14", null, null, null), 100, null); + new LogFilterWrapper(new FilterRequest("0x78", "0x14", + null, null, null), 100, null, false); } catch (JsonRpcInvalidParamsException e) { Assert.assertEquals("please verify: fromBlock <= toBlock", e.getMessage()); } //fromBlock or toBlock is not hex num try { - LogFilterWrapper logFilterWrapper = - new LogFilterWrapper(new FilterRequest("earliest", null, null, null, null), 100, null); + LogFilterWrapper logFilterWrapper = new LogFilterWrapper(new FilterRequest("earliest", null, + null, null, null), 100, null, false); Assert.assertEquals(0, logFilterWrapper.getFromBlock()); Assert.assertEquals(Long.MAX_VALUE, logFilterWrapper.getToBlock()); } catch (JsonRpcInvalidParamsException e) { Assert.fail(); } try { - LogFilterWrapper logFilterWrapper = - new LogFilterWrapper(new FilterRequest("latest", null, null, null, null), 100, null); + LogFilterWrapper logFilterWrapper = new LogFilterWrapper(new FilterRequest("latest", null, + null, null, null), 100, null, false); Assert.assertEquals(100, logFilterWrapper.getFromBlock()); Assert.assertEquals(Long.MAX_VALUE, logFilterWrapper.getToBlock()); } catch (JsonRpcInvalidParamsException e) { Assert.fail(); } try { - new LogFilterWrapper(new FilterRequest("pending", null, null, null, null), 100, null); + new LogFilterWrapper(new FilterRequest("pending", null, null, null, null), + 100, null, false); } catch (JsonRpcInvalidParamsException e) { Assert.assertEquals("TAG pending not supported", e.getMessage()); } try { - LogFilterWrapper logFilterWrapper = - new LogFilterWrapper(new FilterRequest("finalized", null, null, null, null), 100, wallet); + LogFilterWrapper logFilterWrapper = new LogFilterWrapper(new FilterRequest("finalized", null, + null, null, null), 100, wallet, false); Assert.assertEquals(LATEST_SOLIDIFIED_BLOCK_NUM, logFilterWrapper.getFromBlock()); Assert.assertEquals(Long.MAX_VALUE, logFilterWrapper.getToBlock()); } catch (JsonRpcInvalidParamsException e) { Assert.fail(); } try { - new LogFilterWrapper(new FilterRequest("test", null, null, null, null), 100, null); + new LogFilterWrapper(new FilterRequest("test", null, null, null, null), + 100, null, false); } catch (JsonRpcInvalidParamsException e) { Assert.assertEquals("Incorrect hex syntax", e.getMessage()); } + + try { + new LogFilterWrapper(new FilterRequest("0x0", "0x1f40", null, + null, null), 10_000, null, false); + } catch (JsonRpcInvalidParamsException e) { + Assert.fail(); + } + + try { + new LogFilterWrapper(new FilterRequest("0x0", "0x1f40", null, + null, null), 10_000, null, true); + } catch (JsonRpcInvalidParamsException e) { + Assert.assertEquals( + "exceed max block range: " + Args.getInstance().jsonRpcMaxBlockRange, + e.getMessage()); + } + + int oldMaxBlockRange = Args.getInstance().getJsonRpcMaxBlockRange(); + Args.getInstance().setJsonRpcMaxBlockRange(10_000); + try { + new LogFilterWrapper(new FilterRequest("0x0", "0x1f40", null, + null, null), 10_000, null, true); + } catch (JsonRpcInvalidParamsException e) { + Assert.fail(); + } + try { + new LogFilterWrapper(new FilterRequest("0x0", "0x1f40", null, + null, null), 10_000, null, false); + } catch (JsonRpcInvalidParamsException e) { + Assert.fail(); + } + + Args.getInstance().setJsonRpcMaxBlockRange(0); + try { + new LogFilterWrapper(new FilterRequest("0x0", "0x1f40", null, + null, null), 10_000, null, true); + } catch (JsonRpcInvalidParamsException e) { + Assert.fail(); + } + try { + new LogFilterWrapper(new FilterRequest("0x0", "0x1f40", null, + null, null), 10_000, null, false); + } catch (JsonRpcInvalidParamsException e) { + Assert.fail(); + } + + Args.getInstance().setJsonRpcMaxBlockRange(-2); + try { + new LogFilterWrapper(new FilterRequest("0x0", "0x1f40", null, + null, null), 10_000, null, true); + } catch (JsonRpcInvalidParamsException e) { + Assert.fail(); + } + try { + new LogFilterWrapper(new FilterRequest("0x0", "0x1f40", null, + null, null), 10_000, null, false); + } catch (JsonRpcInvalidParamsException e) { + Assert.fail(); + } + + // reset + Args.getInstance().setJsonRpcMaxBlockRange(oldMaxBlockRange); + } + + @Test + public void testMaxSubTopics() { + List topics = new ArrayList<>(); + topics.add(new ArrayList<>(Collections.singletonList( + "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef"))); + topics.add(new ArrayList<>(Collections.EMPTY_LIST)); + List subTopics = new ArrayList<>(); + for (int i = 0; i < Args.getInstance().getJsonRpcMaxSubTopics() + 1; i++) { + subTopics.add("0x0000000000000000000000414de17123a3c706ab197957e131350b2537dd4883"); + } + topics.add(subTopics); + + try { + new LogFilterWrapper(new FilterRequest("0xbb8", "0x1f40", + null, topics.toArray(), null), 10_000, null, false); + } catch (JsonRpcInvalidParamsException e) { + Assert.assertEquals( + "exceed max topics: " + Args.getInstance().getJsonRpcMaxSubTopics(), + e.getMessage()); + } + + try { + tronJsonRpc.getLogs(new FilterRequest("0xbb8", "0x1f40", + null, topics.toArray(), null)); + } catch (JsonRpcInvalidParamsException e) { + Assert.assertEquals( + "exceed max topics: " + Args.getInstance().getJsonRpcMaxSubTopics(), + e.getMessage()); + } catch (Exception e) { + Assert.fail(); + } + + try { + tronJsonRpc.newFilter(new FilterRequest("0xbb8", "0x1f40", + null, topics.toArray(), null)); + } catch (JsonRpcInvalidParamsException e) { + Assert.assertEquals( + "exceed max topics: " + Args.getInstance().getJsonRpcMaxSubTopics(), + e.getMessage()); + } catch (Exception e) { + Assert.fail(); + } + + int oldMaxSubTopics = Args.getInstance().getJsonRpcMaxSubTopics(); + Args.getInstance().setJsonRpcMaxSubTopics(2_000); + try { + new LogFilterWrapper(new FilterRequest("0xbb8", "0x1f40", + null, topics.toArray(), null), 10_000, null, false); + } catch (JsonRpcInvalidParamsException e) { + Assert.fail(); + } + + Args.getInstance().setJsonRpcMaxSubTopics(0); + try { + new LogFilterWrapper(new FilterRequest("0xbb8", "0x1f40", + null, topics.toArray(), null), 10_000, null, false); + } catch (JsonRpcInvalidParamsException e) { + Assert.fail(); + } + + Args.getInstance().setJsonRpcMaxSubTopics(oldMaxSubTopics); + } + + @Test + public void testMethodBlockRange() { + try { + tronJsonRpc.getLogs(new FilterRequest("0x0", "0x1f40", null, + null, null)); + } catch (JsonRpcInvalidParamsException e) { + Assert.assertEquals( + "exceed max block range: " + Args.getInstance().jsonRpcMaxBlockRange, + e.getMessage()); + } catch (Exception e) { + Assert.fail(); + } + + try { + tronJsonRpc.newFilter(new FilterRequest("0x0", "0x1f40", null, + null, null)); + } catch (Exception e) { + Assert.fail(); + } + + try { + tronJsonRpc.getLogs(new FilterRequest("0x0", "0x1", null, + null, null)); + } catch (Exception e) { + Assert.fail(); + } } @Test diff --git a/framework/src/test/java/org/tron/core/jsonrpc/SectionBloomStoreTest.java b/framework/src/test/java/org/tron/core/jsonrpc/SectionBloomStoreTest.java index 6e350a38999..111370bfffd 100644 --- a/framework/src/test/java/org/tron/core/jsonrpc/SectionBloomStoreTest.java +++ b/framework/src/test/java/org/tron/core/jsonrpc/SectionBloomStoreTest.java @@ -132,7 +132,7 @@ public void testWriteAndQuery() { try { LogFilterWrapper logFilterWrapper = new LogFilterWrapper( new FilterRequest("earliest", "latest", ByteArray.toJsonHex(address1), null, null), - currentMaxBlockNum, null); + currentMaxBlockNum, null, false); LogBlockQuery logBlockQuery = new LogBlockQuery(logFilterWrapper, sectionBloomStore, currentMaxBlockNum, sectionExecutor); @@ -149,7 +149,7 @@ public void testWriteAndQuery() { try { LogFilterWrapper logFilterWrapper = new LogFilterWrapper( new FilterRequest("earliest", "latest", addressList, null, null), - currentMaxBlockNum, null); + currentMaxBlockNum, null, false); LogBlockQuery logBlockQuery = new LogBlockQuery(logFilterWrapper, sectionBloomStore, currentMaxBlockNum, sectionExecutor); @@ -165,7 +165,7 @@ public void testWriteAndQuery() { LogFilterWrapper logFilterWrapper = new LogFilterWrapper( new FilterRequest("earliest", "latest", null, new String[] {ByteArray.toHexString(topic1)}, null), - currentMaxBlockNum, null); + currentMaxBlockNum, null, false); LogBlockQuery logBlockQuery = new LogBlockQuery(logFilterWrapper, sectionBloomStore, currentMaxBlockNum, sectionExecutor); @@ -181,7 +181,7 @@ public void testWriteAndQuery() { LogFilterWrapper logFilterWrapper = new LogFilterWrapper( new FilterRequest("earliest", "latest", null, new String[] {ByteArray.toHexString(topic2)}, null), - currentMaxBlockNum, null); + currentMaxBlockNum, null, false); LogBlockQuery logBlockQuery = new LogBlockQuery(logFilterWrapper, sectionBloomStore, currentMaxBlockNum, sectionExecutor); @@ -199,7 +199,7 @@ public void testWriteAndQuery() { LogFilterWrapper logFilterWrapper = new LogFilterWrapper( new FilterRequest("earliest", "latest", null, new Object[] {topicList}, null), - currentMaxBlockNum, null); + currentMaxBlockNum, null, false); LogBlockQuery logBlockQuery = new LogBlockQuery(logFilterWrapper, sectionBloomStore, currentMaxBlockNum, sectionExecutor); @@ -226,7 +226,7 @@ public void testWriteAndQuery() { LogFilterWrapper logFilterWrapper = new LogFilterWrapper( new FilterRequest("earliest", "latest", null, new Object[] {ByteArray.toJsonHex(topic1), ByteArray.toJsonHex(topic2)}, null), - currentMaxBlockNum, null); + currentMaxBlockNum, null, false); LogBlockQuery logBlockQuery = new LogBlockQuery(logFilterWrapper, sectionBloomStore, currentMaxBlockNum, sectionExecutor); diff --git a/framework/src/test/resources/config-localtest.conf b/framework/src/test/resources/config-localtest.conf index b6c1f41154a..ff31369a915 100644 --- a/framework/src/test/resources/config-localtest.conf +++ b/framework/src/test/resources/config-localtest.conf @@ -125,15 +125,6 @@ node { PBFTPort = 8092 } - jsonrpc { - httpFullNodeEnable = false - httpFullNodePort = 8545 - httpSolidityEnable = false - httpSolidityPort = 8555 - httpPBFTEnable = false - httpPBFTPort = 8565 - } - rpc { enable = false port = 50051 @@ -174,6 +165,8 @@ node { # httpSolidityPort = 8555 # httpPBFTEnable = true # httpPBFTPort = 8565 + # maxBlockRange = 5000 + # maxSubTopics = 1000 } } diff --git a/framework/src/test/resources/config-test-index.conf b/framework/src/test/resources/config-test-index.conf index cff08fd3abb..faa2f93dc5e 100644 --- a/framework/src/test/resources/config-test-index.conf +++ b/framework/src/test/resources/config-test-index.conf @@ -86,6 +86,8 @@ node { httpFullNodeEnable = false httpSolidityEnable = false httpPBFTEnable = false + # maxBlockRange = 5000 + # maxSubTopics = 1000 } rpc { diff --git a/framework/src/test/resources/config-test-mainnet.conf b/framework/src/test/resources/config-test-mainnet.conf index de9170a0ec4..12acad64d8d 100644 --- a/framework/src/test/resources/config-test-mainnet.conf +++ b/framework/src/test/resources/config-test-mainnet.conf @@ -92,6 +92,8 @@ node { httpFullNodeEnable = false httpSolidityEnable = false httpPBFTEnable = false + # maxBlockRange = 5000 + # maxSubTopics = 1000 } rpc { diff --git a/framework/src/test/resources/config-test.conf b/framework/src/test/resources/config-test.conf index 795f9df9162..eaa6659a8c4 100644 --- a/framework/src/test/resources/config-test.conf +++ b/framework/src/test/resources/config-test.conf @@ -116,6 +116,8 @@ node { httpFullNodeEnable = false httpSolidityEnable = false httpPBFTEnable = false + # maxBlockRange = 5000 + # maxSubTopics = 1000 } # use your ipv6 address for node discovery and tcp connection, default false