From 3da676e260fc5e631445d00b7c807f4f1293d77e Mon Sep 17 00:00:00 2001 From: jiangyuanshu <317787106@qq.com> Date: Fri, 15 Nov 2024 14:28:12 +0800 Subject: [PATCH 1/2] fix the bug of eth_getLogs --- .../jsonrpc/filters/LogBlockQuery.java | 8 ++-- .../org/tron/core/jsonrpc/JsonRpcTest.java | 46 +++++++++++++++++-- 2 files changed, 46 insertions(+), 8 deletions(-) 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 94e29e657be..7ee6ce74c10 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 @@ -191,17 +191,17 @@ public int[][][] getConditions() { Bloom bloom = Bloom.create(hash); BitSet bs = BitSet.valueOf(bloom.getData()); - int[] bitIndex = new int[3]; //must same as the number of hash function in Bloom - int nonZeroCount = 0; + //number of nonZero positions may be equal or less than number(3) of hash function in Bloom + List bitIndexList = new ArrayList<>(); for (int i = bs.nextSetBit(0); i >= 0; i = bs.nextSetBit(i + 1)) { // operate on index i here if (i == Integer.MAX_VALUE) { break; // or (i+1) would overflow } - bitIndex[nonZeroCount++] = i; + bitIndexList.add(i); } - bitIndexes[j] = bitIndex; + bitIndexes[j] = bitIndexList.stream().mapToInt(Integer::intValue).toArray(); } allConditionsIndex[k] = bitIndexes; } 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 f221d0c95ac..81d2af47bbf 100644 --- a/framework/src/test/java/org/tron/core/jsonrpc/JsonRpcTest.java +++ b/framework/src/test/java/org/tron/core/jsonrpc/JsonRpcTest.java @@ -347,17 +347,16 @@ private int[] getBloomIndex(String s) { Bloom bloom = Bloom.create(Hash.sha3(ByteArray.fromHexString(s))); BitSet bs = BitSet.valueOf(bloom.getData()); - int[] bitIndex = new int[3]; //must same as the number of hash function in Bloom - int nonZeroCount = 0; + List bitIndexList = new ArrayList<>(); for (int i = bs.nextSetBit(0); i >= 0; i = bs.nextSetBit(i + 1)) { // operate on index i here if (i == Integer.MAX_VALUE) { break; // or (i+1) would overflow } - bitIndex[nonZeroCount++] = i; + bitIndexList.add(i); } - return bitIndex; + return bitIndexList.stream().mapToInt(Integer::intValue).toArray(); } @Test @@ -416,4 +415,43 @@ public void testGetConditions() { Assert.fail(); } } + + @Test + public void testGetConditionWithHashCollision() { + try { + List addressList = new ArrayList<>(); + addressList.add("0x57f1887a8bf19b14fc0df6fd9b2acc9af147ea85"); + addressList.add("0x3038114c1a1e72c5bfa8b003bc3650ad2ba254a0"); + + Object[] topics = new Object[0]; + + LogFilterWrapper logFilterWrapper = + new LogFilterWrapper(new FilterRequest(null, + null, + addressList, + topics, + null), + 100, + null); + + LogBlockQuery logBlockQuery = new LogBlockQuery(logFilterWrapper, null, 100, null); + int[][][] conditions = logBlockQuery.getConditions(); + //level = depth(address) + depth(topics), skip null + Assert.assertEquals(1, conditions.length); + //elements number + Assert.assertEquals(2, conditions[0].length); + + Assert.assertEquals(3, conditions[0][0].length); + //Hash collision, only two nonZero position + Assert.assertEquals(2, conditions[0][1].length); + + Assert.assertArrayEquals(conditions[0][0], + getBloomIndex("0x57f1887a8bf19b14fc0df6fd9b2acc9af147ea85")); + Assert.assertArrayEquals(conditions[0][1], + getBloomIndex("0x3038114c1a1e72c5bfa8b003bc3650ad2ba254a0")); + + } catch (JsonRpcInvalidParamsException e) { + Assert.fail(); + } + } } From b9a49120150340966a01bbb871aa579ab0eba3da Mon Sep 17 00:00:00 2001 From: jiangyuanshu <317787106@qq.com> Date: Fri, 14 Feb 2025 20:09:41 +0800 Subject: [PATCH 2/2] add test case of generateFilterId --- .../src/test/java/org/tron/core/jsonrpc/JsonRpcTest.java | 6 ++++++ 1 file changed, 6 insertions(+) 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 e75e4b17ab5..c9e6d6a2330 100644 --- a/framework/src/test/java/org/tron/core/jsonrpc/JsonRpcTest.java +++ b/framework/src/test/java/org/tron/core/jsonrpc/JsonRpcTest.java @@ -19,6 +19,7 @@ import org.tron.common.utils.ByteUtil; import org.tron.common.utils.Commons; import org.tron.core.exception.JsonRpcInvalidParamsException; +import org.tron.core.services.jsonrpc.JsonRpcApiUtil; import org.tron.core.services.jsonrpc.TronJsonRpc.FilterRequest; import org.tron.core.services.jsonrpc.filters.LogBlockQuery; import org.tron.core.services.jsonrpc.filters.LogFilter; @@ -352,4 +353,9 @@ public void testGetConditionWithHashCollision() { Assert.fail(); } } + + @Test + public void testGenerateFilterId() { + Assert.assertEquals(32, JsonRpcApiUtil.generateFilterId().length()); + } }