From 445f39f8537eef3501644194480feea27a3d2184 Mon Sep 17 00:00:00 2001 From: Danno Ferrin Date: Mon, 6 Jul 2020 16:47:01 -0600 Subject: [PATCH] return errors on failed test_importRawBlock (#1186) Previously we were returning success with a zero length hash, meaning we understood the response but there were problems with the RLP. Instead now we return one of two errors "Could not decode RLP for Block" or "Could not import Block". For #1130 Signed-off-by: Danno Ferrin --- .../internal/response/JsonRpcError.java | 7 +- .../retesteth/methods/TestImportRawBlock.java | 10 +- .../methods/TestImportRawBlockTest.java | 104 ++++++++++++++++++ 3 files changed, 117 insertions(+), 4 deletions(-) create mode 100644 ethereum/retesteth/src/test/java/org/hyperledger/besu/ethereum/retesteth/methods/TestImportRawBlockTest.java diff --git a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/response/JsonRpcError.java b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/response/JsonRpcError.java index 61ff0ac312..00aaafc52a 100644 --- a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/response/JsonRpcError.java +++ b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/response/JsonRpcError.java @@ -170,7 +170,12 @@ public enum JsonRpcError { METHOD_UNIMPLEMENTED(-50200, "MethodUnimplemented"), /** Plugins error */ - PLUGIN_NOT_FOUND(-60000, "Plugin not found"); + PLUGIN_NOT_FOUND(-60000, "Plugin not found"), + + // Retesteth Errors + + BLOCK_RLP_IMPORT_ERROR(-32000, "Could not decode RLP for Block"), + BLOCK_IMPORT_ERROR(-32000, "Could not import Block"); private final int code; private final String message; diff --git a/ethereum/retesteth/src/main/java/org/hyperledger/besu/ethereum/retesteth/methods/TestImportRawBlock.java b/ethereum/retesteth/src/main/java/org/hyperledger/besu/ethereum/retesteth/methods/TestImportRawBlock.java index c2d9bd2956..1cf096b988 100644 --- a/ethereum/retesteth/src/main/java/org/hyperledger/besu/ethereum/retesteth/methods/TestImportRawBlock.java +++ b/ethereum/retesteth/src/main/java/org/hyperledger/besu/ethereum/retesteth/methods/TestImportRawBlock.java @@ -17,6 +17,8 @@ package org.hyperledger.besu.ethereum.retesteth.methods; import org.hyperledger.besu.ethereum.ProtocolContext; import org.hyperledger.besu.ethereum.api.jsonrpc.internal.JsonRpcRequestContext; import org.hyperledger.besu.ethereum.api.jsonrpc.internal.methods.JsonRpcMethod; +import org.hyperledger.besu.ethereum.api.jsonrpc.internal.response.JsonRpcError; +import org.hyperledger.besu.ethereum.api.jsonrpc.internal.response.JsonRpcErrorResponse; import org.hyperledger.besu.ethereum.api.jsonrpc.internal.response.JsonRpcResponse; import org.hyperledger.besu.ethereum.api.jsonrpc.internal.response.JsonRpcSuccessResponse; import org.hyperledger.besu.ethereum.core.Block; @@ -33,7 +35,7 @@ import org.apache.tuweni.bytes.Bytes; public class TestImportRawBlock implements JsonRpcMethod { private static final Logger LOG = LogManager.getLogger(); - private static final String METHOD_NAME = "test_importRawBlock"; + public static final String METHOD_NAME = "test_importRawBlock"; private final RetestethContext context; @@ -59,7 +61,8 @@ public class TestImportRawBlock implements JsonRpcMethod { RLP.input(Bytes.fromHexString(input)), protocolSpec.getBlockHeaderFunctions()); } catch (final RLPException | IllegalArgumentException e) { LOG.debug("Failed to parse block RLP", e); - return new JsonRpcSuccessResponse(requestContext.getRequest().getId(), "0x"); + return new JsonRpcErrorResponse( + requestContext.getRequest().getId(), JsonRpcError.BLOCK_RLP_IMPORT_ERROR); } final BlockImporter blockImporter = protocolSpec.getBlockImporter(); @@ -72,7 +75,8 @@ public class TestImportRawBlock implements JsonRpcMethod { requestContext.getRequest().getId(), block.getHash().toString()); } else { LOG.debug("Failed to import block."); - return new JsonRpcSuccessResponse(requestContext.getRequest().getId(), "0x"); + return new JsonRpcErrorResponse( + requestContext.getRequest().getId(), JsonRpcError.BLOCK_IMPORT_ERROR); } } } diff --git a/ethereum/retesteth/src/test/java/org/hyperledger/besu/ethereum/retesteth/methods/TestImportRawBlockTest.java b/ethereum/retesteth/src/test/java/org/hyperledger/besu/ethereum/retesteth/methods/TestImportRawBlockTest.java new file mode 100644 index 0000000000..040cd8813b --- /dev/null +++ b/ethereum/retesteth/src/test/java/org/hyperledger/besu/ethereum/retesteth/methods/TestImportRawBlockTest.java @@ -0,0 +1,104 @@ +/* + * Copyright ConsenSys AG. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on + * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the + * specific language governing permissions and limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + * + */ + +package org.hyperledger.besu.ethereum.retesteth.methods; + +import static org.assertj.core.api.Assertions.assertThat; + +import org.hyperledger.besu.ethereum.api.jsonrpc.internal.JsonRpcRequest; +import org.hyperledger.besu.ethereum.api.jsonrpc.internal.JsonRpcRequestContext; +import org.hyperledger.besu.ethereum.api.jsonrpc.internal.response.JsonRpcError; +import org.hyperledger.besu.ethereum.api.jsonrpc.internal.response.JsonRpcErrorResponse; +import org.hyperledger.besu.ethereum.api.jsonrpc.internal.response.JsonRpcResponseType; +import org.hyperledger.besu.ethereum.api.jsonrpc.internal.response.JsonRpcSuccessResponse; +import org.hyperledger.besu.ethereum.retesteth.RetestethContext; + +import java.io.IOException; + +import com.google.common.base.Charsets; +import com.google.common.io.Resources; +import io.vertx.core.json.JsonObject; +import org.junit.Before; +import org.junit.Test; + +public class TestImportRawBlockTest { + private TestImportRawBlock test_importRawBlock; + + @Before + public void setupClass() throws IOException { + final RetestethContext context = new RetestethContext(); + test_importRawBlock = new TestImportRawBlock(context); + final TestSetChainParams test_setChainParams = new TestSetChainParams(context); + final String chainParamsJsonString = + Resources.toString( + TestSetChainParamsTest.class.getResource("multimpleBalanceInstructionChainParams.json"), + Charsets.UTF_8); + final JsonObject chainParamsJson = new JsonObject(chainParamsJsonString); + + final JsonRpcRequestContext request = + new JsonRpcRequestContext( + new JsonRpcRequest( + "2.0", TestSetChainParams.METHOD_NAME, new Object[] {chainParamsJson.getMap()})); + + assertThat(test_setChainParams.response(request)) + .isEqualTo(new JsonRpcSuccessResponse(null, true)); + } + + @Test + public void testMissingParent() { + final String rawBlockRLPString = + "0xf9045df901f9a0e38bef3dadb98e856ea82c7e9813b76a6ec8d9cf60694dd65d800a1669c1a1fda03770bba814f8cc5534ab5e40bdb3fe51866b537805c5577888091766e621fc13948888f1f195afa192cfee860698584c030f4c9db1a019ce64082807650d3d01ac60cd16a583e9472dcc0ccb8f39dd867e317cf025dda09735e49acaddb4d8338ed33df8dd006449b20b85e89e47224ac8ec8f7ea26071a0056b23fbba480696b65fe5a59b8f2148a1299103c4f57df839233af2cf4ca2d2b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000830200000483301fd28252088454c99c2142a00000000000000000000000000000000000000000000000000000000000000000880000000000000000f862f86003018304cb2f94095e7baea6a6c7c4c2dfeb977efac326af552d870a801ba0a7b7f2fa93025fc1e6aa18c1aa07c32a456439754e196cb74f2f7d12cf3e840da02078cf840fb25fc3d858b2a85b622f21be0588b5c5d81d433427f6470e06a4a7f901faf901f7a0f88512d9e022357594866c44ecaa2fc9cb48f34d1987e401109400761aeb898da01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d4934794bcde5374fce5edbc8e2a8697c15331677e6ebf0ba0fe87abb0d3ab38d4eb64405de03db5245b0d40c4b85d8a1b5028ada8643de2dba056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000002833007cf808454c9945142a00000000000000000000000000000000000000000000000000000000000000000880000000000000000"; + + final JsonRpcRequestContext request = + new JsonRpcRequestContext( + new JsonRpcRequest( + "2.0", TestImportRawBlock.METHOD_NAME, new Object[] {rawBlockRLPString})); + + final var response = test_importRawBlock.response(request); + assertThat(response.getType()).isEqualTo(JsonRpcResponseType.ERROR); + assertThat(((JsonRpcErrorResponse) response).getError()) + .isEqualTo(JsonRpcError.BLOCK_IMPORT_ERROR); + } + + @Test + public void testBadBlock() { + final String rawBlockRLPString = "0xf9045df901f9a08"; + + final JsonRpcRequestContext request = + new JsonRpcRequestContext( + new JsonRpcRequest( + "2.0", TestImportRawBlock.METHOD_NAME, new Object[] {rawBlockRLPString})); + + final var response = test_importRawBlock.response(request); + assertThat(response.getType()).isEqualTo(JsonRpcResponseType.ERROR); + assertThat(((JsonRpcErrorResponse) response).getError()) + .isEqualTo(JsonRpcError.BLOCK_RLP_IMPORT_ERROR); + } + + @Test + public void testGoodBlock() { + final String rawBlockRLPString = + "0xf90262f901faa0e38bef3dadb98e856ea82c7e9813b76a6ec8d9cf60694dd65d800a1669c1a1fda01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a06e6be3f633fe0399cb17a9d8238b988a39bd9ab3e0ac0820f4df705a1ee37536a06fb77a9ddaa64a8e161b643d05533a4093f2be900ad06279b1b56b3bcee3b979a04b33fa3c9c50b7b9a4500f5c0b1e71ab43362abc81c2cf31fd2b54acf7d750d8b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000001832fefba83016b66845db7320980a00000000000000000000000000000000000000000000000000000000000000000880000000000000000f862f860800a830249f094095e7baea6a6c7c4c2dfeb977efac326af552d870a801ba0d42a045ac77a6d4676dd5fbc5104ed7471b6cef2465cfefaa52919b340f942a9a06e4d319aea79e45cde79d337e6edf849ceac505cab65dd41a572cab132d4dccac0"; + + final JsonRpcRequestContext request = + new JsonRpcRequestContext( + new JsonRpcRequest( + "2.0", TestImportRawBlock.METHOD_NAME, new Object[] {rawBlockRLPString})); + + final var response = test_importRawBlock.response(request); + assertThat(response.getType()).isEqualTo(JsonRpcResponseType.SUCCESS); + } +}