From a59d8107075358799611f1665899671bc9a5318f Mon Sep 17 00:00:00 2001 From: Marccio Silva Date: Tue, 11 May 2021 18:46:41 -0300 Subject: [PATCH] Handle eth_getLogs (with blockHash filter) case when block doesn't exist --- .../main/java/org/ethereum/rpc/LogFilter.java | 3 ++ .../org/ethereum/rpc/Web3ImplLogsTest.java | 37 ++++++++++++++----- 2 files changed, 30 insertions(+), 10 deletions(-) diff --git a/rskj-core/src/main/java/org/ethereum/rpc/LogFilter.java b/rskj-core/src/main/java/org/ethereum/rpc/LogFilter.java index f7226d1bc67..73f26815553 100644 --- a/rskj-core/src/main/java/org/ethereum/rpc/LogFilter.java +++ b/rskj-core/src/main/java/org/ethereum/rpc/LogFilter.java @@ -223,6 +223,9 @@ else if ("latest".equalsIgnoreCase(fr.fromBlock)) { private static void processSingleBlockByHash(String blockHash, Blockchain blockchain, LogFilter filter, BlocksBloomStore blocksBloomStore) { Keccak256 keccak256BlockHash = new Keccak256(stringHexToByteArray(blockHash)); Block blockByHash = blockchain.getBlockByHash(keccak256BlockHash.getBytes()); + if (blockByHash == null) { + return; + } long blockNumber = blockByHash.getNumber(); processBlocks(blockNumber, blockNumber, filter, blockchain, blocksBloomStore); diff --git a/rskj-core/src/test/java/org/ethereum/rpc/Web3ImplLogsTest.java b/rskj-core/src/test/java/org/ethereum/rpc/Web3ImplLogsTest.java index fac6a2d12d2..b52d1fca35d 100644 --- a/rskj-core/src/test/java/org/ethereum/rpc/Web3ImplLogsTest.java +++ b/rskj-core/src/test/java/org/ethereum/rpc/Web3ImplLogsTest.java @@ -23,6 +23,7 @@ import co.rsk.core.Wallet; import co.rsk.core.WalletFactory; import co.rsk.core.bc.MiningMainchainView; +import co.rsk.crypto.Keccak256; import co.rsk.db.RepositoryLocator; import co.rsk.logfilter.BlocksBloomStore; import co.rsk.peg.BridgeSupportFactory; @@ -57,8 +58,8 @@ import java.util.ArrayList; import java.util.List; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; +import static org.ethereum.rpc.TypeConverter.stringHexToByteArray; +import static org.junit.Assert.*; import static org.mockito.Mockito.mock; /** @@ -89,11 +90,13 @@ public class Web3ImplLogsTest { // Examples: // Incremented(bool indexed odd, uint x) -> Keccak-256("Incremented(bool,uint256)") // - private final static String GET_VALUED_EVENT_SIGNATURE = "1ee041944547858a75ebef916083b6d4f5ae04bea9cd809334469dd07dbf441b"; - private final static String INC_EVENT_SIGNATURE = "6e61ef44ac2747ff8b84d353a908eb8bd5c3fb118334d57698c5cfc7041196ad"; - private final static String ONE_TOPIC = "0000000000000000000000000000000000000000000000000000000000000001"; - private final static String INCREMENT_METHOD_SIGNATURE = "371303c0"; - private final static String GET_VALUE_METHOD_SIGNATURE = "20965255"; + private static final String GET_VALUED_EVENT_SIGNATURE = "1ee041944547858a75ebef916083b6d4f5ae04bea9cd809334469dd07dbf441b"; + private static final String INC_EVENT_SIGNATURE = "6e61ef44ac2747ff8b84d353a908eb8bd5c3fb118334d57698c5cfc7041196ad"; + private static final String ONE_TOPIC = "0000000000000000000000000000000000000000000000000000000000000001"; + private static final String INCREMENT_METHOD_SIGNATURE = "371303c0"; + private static final String GET_VALUE_METHOD_SIGNATURE = "20965255"; + private static final String TRACKED_TEST_BLOCK_HASH = "0xafb368a4f74e51a3c6b6d72b049c4fc7bc7506251f13a3afa4fee4bece0e85eb"; + private static final String UNTRACKED_TEST_BLOCK_HASH = "0xdea168a4f74e51a3eeb6d72b049c4fc7bc750dd51f13a3afa4fee4bece0e85eb"; private final TestSystemProperties config = new TestSystemProperties(); private Blockchain blockChain; private MiningMainchainView mainchainView; @@ -819,7 +822,7 @@ public void getLogsTwiceFromBlockchainWithCallContractAndFilterBySecondTopic() t public void getLogsFromBlockchainWithEventInContractCreationReturnsAsExpectedWithBlockHashFilter() throws Exception { addEventInContractCreation(); Web3.FilterRequest fr = new Web3.FilterRequest(); - final String blockHash = "0xafb368a4f74e51a3c6b6d72b049c4fc7bc7506251f13a3afa4fee4bece0e85eb"; + final String blockHash = TRACKED_TEST_BLOCK_HASH; fr.blockHash = blockHash; Object[] logs = web3.eth_getLogs(fr); @@ -832,12 +835,26 @@ public void getLogsFromBlockchainWithEventInContractCreationReturnsAsExpectedWit assertEquals(txdto.getContractAddress(),((LogFilterElement)logs[0]).address); } + @Test + public void getLogsWithBlockHashFilterForNonexistentBlockThrowsException() throws Exception { + final String blockHash = UNTRACKED_TEST_BLOCK_HASH; + byte[] blockHashBytes = new Keccak256(stringHexToByteArray(blockHash)).getBytes(); + assertFalse(blockChain.hasBlockInSomeBlockchain(blockHashBytes)); + Web3.FilterRequest fr = new Web3.FilterRequest(); + fr.blockHash = blockHash; + + Object[] logs = web3.eth_getLogs(fr); + + assertNotNull(logs); + assertEquals(0, logs.length); + } + @Test(expected = RskJsonRpcRequestException.class) public void getLogsThrowsExceptionWhenBlockHashIsUsedCombinedWithFromBlock() throws Exception { addEventInContractCreation(); Web3.FilterRequest fr = new Web3.FilterRequest(); fr.fromBlock = "earliest"; - fr.blockHash = "0xafb368a4f74e51a3c6b6d72b049c4fc7bc7506251f13a3afa4fee4bece0e85eb"; + fr.blockHash = TRACKED_TEST_BLOCK_HASH; web3.eth_getLogs(fr); } @@ -847,7 +864,7 @@ public void getLogsThrowsExceptionWhenBlockHashIsUsedCombinedWithToBlock() throw addEventInContractCreation(); Web3.FilterRequest fr = new Web3.FilterRequest(); fr.toBlock = "latest"; - fr.blockHash = "0xafb368a4f74e51a3c6b6d72b049c4fc7bc7506251f13a3afa4fee4bece0e85eb"; + fr.blockHash = TRACKED_TEST_BLOCK_HASH; web3.eth_getLogs(fr); }