From 1980f0b2cf5d06aee390ccdf05f73f4fdeff671e Mon Sep 17 00:00:00 2001 From: 0xbigapple Date: Thu, 28 Aug 2025 17:07:36 +0800 Subject: [PATCH 1/3] fix: return null for genesis block in eth_getBlockReceipts --- .../services/jsonrpc/TronJsonRpcImpl.java | 4 +++- .../tron/core/jsonrpc/JsonrpcServiceTest.java | 21 +++---------------- 2 files changed, 6 insertions(+), 19 deletions(-) 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 f681a94fe9f..7e9b886224d 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 @@ -849,7 +849,9 @@ private TransactionContext findTransactionContext(TransactionInfoList infoList, public List getBlockReceipts(String blockNumOrTag) throws JsonRpcInvalidParamsException, JsonRpcInternalException { Block block = wallet.getByJsonBlockId(blockNumOrTag); - if (block == null) { + + // block receipts not available: block is genesis, not produced yet, or pruned in light node + if (block == null || block.getBlockHeader().getRawData().getNumber() == 0) { return null; } 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 f6f4a35c1b7..b3c9f4b6e45 100644 --- a/framework/src/test/java/org/tron/core/jsonrpc/JsonrpcServiceTest.java +++ b/framework/src/test/java/org/tron/core/jsonrpc/JsonrpcServiceTest.java @@ -164,23 +164,6 @@ public void init() { dbManager.getTransactionStore() .put(transactionCapsule3.getTransactionId().getBytes(), transactionCapsule3); - blockCapsule0.getTransactions().forEach(tx -> { - TransactionCapsule transactionCapsule = new TransactionCapsule(tx.getInstance()); - transactionCapsule.setBlockNum(blockCapsule0.getNum()); - dbManager.getTransactionStore() - .put(transactionCapsule.getTransactionId().getBytes(), transactionCapsule); - }); - - TransactionRetCapsule transactionRetCapsule0 = new TransactionRetCapsule(); - blockCapsule0.getTransactions().forEach(tx -> { - TransactionInfoCapsule transactionInfoCapsule = new TransactionInfoCapsule(); - transactionInfoCapsule.setId(tx.getTransactionId().getBytes()); - transactionInfoCapsule.setBlockNumber(blockCapsule0.getNum()); - transactionRetCapsule0.addTransactionInfo(transactionInfoCapsule.getInstance()); - }); - dbManager.getTransactionRetStore().put( - ByteArray.fromLong(blockCapsule0.getNum()), transactionRetCapsule0); - List logs = new ArrayList<>(); logs.add(Protocol.TransactionInfo.Log.newBuilder() .setAddress(ByteString.copyFrom("address1".getBytes())) @@ -340,6 +323,8 @@ public void testGetBlockByNumber() { } Assert.assertEquals(ByteArray.toJsonHex(0L), blockResult.getNumber()); Assert.assertEquals(ByteArray.toJsonHex(blockCapsule0.getNum()), blockResult.getNumber()); + Assert.assertEquals(blockResult.getTransactions().length, + blockCapsule0.getTransactions().size()); // latest try { @@ -1048,7 +1033,7 @@ public void testGetBlockReceipts() { try { List transactionReceiptList = tronJsonRpc.getBlockReceipts("earliest"); - Assert.assertFalse(transactionReceiptList.isEmpty()); + Assert.assertNull(transactionReceiptList); } catch (JsonRpcInvalidParamsException | JsonRpcInternalException e) { throw new RuntimeException(e); } From 8570eea285dd6c078612afe8042fae54e36a974f Mon Sep 17 00:00:00 2001 From: 0xbigapple Date: Fri, 29 Aug 2025 13:06:01 +0800 Subject: [PATCH 2/3] feat:support query eth_getBlockReceipts by blockHash --- .../tron/core/services/jsonrpc/TronJsonRpc.java | 2 +- .../core/services/jsonrpc/TronJsonRpcImpl.java | 15 ++++++++++++--- .../org/tron/core/jsonrpc/JsonrpcServiceTest.java | 14 ++++++++++++++ 3 files changed, 27 insertions(+), 4 deletions(-) diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java index 5e6fc771c80..658c8051038 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java @@ -151,7 +151,7 @@ TransactionResult getTransactionByBlockNumberAndIndex(String blockNumOrTag, Stri @JsonRpcError(exception = JsonRpcInvalidParamsException.class, code = -32602, data = "{}"), @JsonRpcError(exception = JsonRpcInternalException.class, code = -32000, data = "{}") }) - List getBlockReceipts(String blockNumOrTag) + List getBlockReceipts(String blockNumOrHashOrTag) throws JsonRpcInvalidParamsException, JsonRpcInternalException; @JsonRpcMethod("eth_call") 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 7e9b886224d..be1427a1789 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 @@ -839,16 +839,25 @@ private TransactionContext findTransactionContext(TransactionInfoList infoList, /** * Get all transaction receipts for a specific block - * @param blockNumOrTag the block number or tag (latest, earliest, pending, finalized) + * @param blockNumOrHashOrTag blockNumber or blockHash or tag, + * tag includes: latest, earliest, pending, finalized * @return List of TransactionReceipt objects for all transactions in the block, * null if block not found * @throws JsonRpcInvalidParamsException if the parameter format is invalid * @throws JsonRpcInternalException if there's an internal error */ @Override - public List getBlockReceipts(String blockNumOrTag) + public List getBlockReceipts(String blockNumOrHashOrTag) throws JsonRpcInvalidParamsException, JsonRpcInternalException { - Block block = wallet.getByJsonBlockId(blockNumOrTag); + + Block block = null; + + if (Pattern.matches(HASH_REGEX, blockNumOrHashOrTag)) { + block = getBlockByJsonHash(blockNumOrHashOrTag); + } else { + block = wallet.getByJsonBlockId(blockNumOrHashOrTag); + } + // block receipts not available: block is genesis, not produced yet, or pruned in light node if (block == null || block.getBlockHeader().getRawData().getNumber() == 0) { 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 b3c9f4b6e45..81db38ce286 100644 --- a/framework/src/test/java/org/tron/core/jsonrpc/JsonrpcServiceTest.java +++ b/framework/src/test/java/org/tron/core/jsonrpc/JsonrpcServiceTest.java @@ -1073,6 +1073,20 @@ public void testGetBlockReceipts() { throw new RuntimeException(e); } + try { + String blockHash = blockCapsule1.getBlockId().toString(); + List transactionReceiptList + = tronJsonRpc.getBlockReceipts(blockHash); + List transactionReceiptList2 + = tronJsonRpc.getBlockReceipts("0x" + blockHash); + + Assert.assertFalse(transactionReceiptList.isEmpty()); + Assert.assertEquals(JSON.toJSONString(transactionReceiptList), + JSON.toJSONString(transactionReceiptList2)); + } catch (JsonRpcInvalidParamsException | JsonRpcInternalException e) { + throw new RuntimeException(e); + } + } @Test From baec508df2cf7206f91a5a07934b404ec85ac06b Mon Sep 17 00:00:00 2001 From: 0xbigapple Date: Fri, 29 Aug 2025 13:14:58 +0800 Subject: [PATCH 3/3] checkStyle --- .../java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) 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 be1427a1789..7a1518038d6 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 @@ -858,7 +858,6 @@ public List getBlockReceipts(String blockNumOrHashOrTag) block = wallet.getByJsonBlockId(blockNumOrHashOrTag); } - // block receipts not available: block is genesis, not produced yet, or pruned in light node if (block == null || block.getBlockHeader().getRawData().getNumber() == 0) { return null; @@ -868,7 +867,7 @@ public List getBlockReceipts(String blockNumOrHashOrTag) long blockNum = blockCapsule.getNum(); TransactionInfoList transactionInfoList = wallet.getTransactionInfoByBlockNum(blockNum); - //energy price at the block timestamp + // energy price at the block timestamp long energyFee = wallet.getEnergyFee(blockCapsule.getTimeStamp()); // Validate transaction list size consistency