From f50eee6aec1765daba3f62baa050bdf24fc5eec7 Mon Sep 17 00:00:00 2001 From: Antoine Toulme Date: Tue, 2 Mar 2021 09:23:58 -0800 Subject: [PATCH] Fix how ethproxy handles the initial message (#1959) Signed-off-by: Antoine Toulme --- .../stratum/Stratum1EthProxyProtocol.java | 15 ++-- .../stratum/Stratum1EthProxyProtocolTest.java | 70 +++++++++++++++++++ 2 files changed, 77 insertions(+), 8 deletions(-) create mode 100644 ethereum/stratum/src/test/java/org/hyperledger/besu/ethereum/stratum/Stratum1EthProxyProtocolTest.java diff --git a/ethereum/stratum/src/main/java/org/hyperledger/besu/ethereum/stratum/Stratum1EthProxyProtocol.java b/ethereum/stratum/src/main/java/org/hyperledger/besu/ethereum/stratum/Stratum1EthProxyProtocol.java index 6c93572e23..13aa6c3c39 100644 --- a/ethereum/stratum/src/main/java/org/hyperledger/besu/ethereum/stratum/Stratum1EthProxyProtocol.java +++ b/ethereum/stratum/src/main/java/org/hyperledger/besu/ethereum/stratum/Stratum1EthProxyProtocol.java @@ -18,7 +18,6 @@ import static org.apache.logging.log4j.LogManager.getLogger; import org.hyperledger.besu.ethereum.api.jsonrpc.RpcMethod; 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.JsonRpcSuccessResponse; import org.hyperledger.besu.ethereum.blockcreation.EthHashMiningCoordinator; import org.hyperledger.besu.ethereum.blockcreation.MiningCoordinator; @@ -35,6 +34,7 @@ import java.util.function.Function; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.json.JsonMapper; import com.google.common.io.BaseEncoding; +import io.vertx.core.json.DecodeException; import io.vertx.core.json.JsonObject; import org.apache.logging.log4j.Logger; import org.apache.tuweni.bytes.Bytes; @@ -65,21 +65,20 @@ public class Stratum1EthProxyProtocol implements StratumProtocol { @Override public boolean canHandle(final String initialMessage, final StratumConnection conn) { - JsonRpcRequestContext req; + JsonRpcRequest req; try { - req = new JsonObject(initialMessage).mapTo(JsonRpcRequestContext.class); - } catch (IllegalArgumentException e) { + req = new JsonObject(initialMessage).mapTo(JsonRpcRequest.class); + } catch (DecodeException | IllegalArgumentException e) { LOG.debug(e.getMessage(), e); return false; } - if (!"eth_submitLogin".equals(req.getRequest().getMethod())) { - LOG.debug("Invalid first message method: {}", req.getRequest().getMethod()); + if (!"eth_submitLogin".equals(req.getMethod())) { + LOG.debug("Invalid first message method: {}", req.getMethod()); return false; } try { - String response = - mapper.writeValueAsString(new JsonRpcSuccessResponse(req.getRequest().getId(), true)); + String response = mapper.writeValueAsString(new JsonRpcSuccessResponse(req.getId(), true)); conn.send(response + "\n"); } catch (JsonProcessingException e) { LOG.debug(e.getMessage(), e); diff --git a/ethereum/stratum/src/test/java/org/hyperledger/besu/ethereum/stratum/Stratum1EthProxyProtocolTest.java b/ethereum/stratum/src/test/java/org/hyperledger/besu/ethereum/stratum/Stratum1EthProxyProtocolTest.java new file mode 100644 index 0000000000..44c094dfef --- /dev/null +++ b/ethereum/stratum/src/test/java/org/hyperledger/besu/ethereum/stratum/Stratum1EthProxyProtocolTest.java @@ -0,0 +1,70 @@ +/* + * 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.stratum; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.mock; + +import org.hyperledger.besu.ethereum.blockcreation.EthHashMiningCoordinator; +import org.hyperledger.besu.ethereum.blockcreation.MiningCoordinator; + +import java.util.ArrayList; +import java.util.List; + +import org.junit.Before; +import org.junit.Test; + +public class Stratum1EthProxyProtocolTest { + + private Stratum1EthProxyProtocol protocol; + private StratumConnection conn; + private List receivedMessages; + + @Before + public void setUp() { + MiningCoordinator coordinator = mock(EthHashMiningCoordinator.class); + protocol = new Stratum1EthProxyProtocol(coordinator); + receivedMessages = new ArrayList<>(); + conn = new StratumConnection(new StratumProtocol[0], null, receivedMessages::add); + } + + @Test + public void testCanHandleEmptyString() { + assertThat(protocol.canHandle("", conn)).isFalse(); + } + + @Test + public void testCanHandleMalformedJSON() { + assertThat(protocol.canHandle("{[\"foo\",", conn)).isFalse(); + } + + @Test + public void testCanHandleWrongMethod() { + assertThat( + protocol.canHandle( + "{\"id\":0,\"method\":\"eth_byebye\",\"params\":[\"0xdeadbeefdeadbeef.worker\"]}", + conn)) + .isFalse(); + } + + @Test + public void testCanHandleWellFormedRequest() { + assertThat( + protocol.canHandle( + "{\"id\":0,\"method\":\"eth_submitLogin\",\"params\":[\"0xdeadbeefdeadbeef.worker\"]}", + conn)) + .isTrue(); + } +}