From 5a3ed04059e08232edd2ed6231d621586e13ec1c Mon Sep 17 00:00:00 2001 From: Gabriel-Trintinalia Date: Fri, 16 Dec 2022 16:19:49 +1100 Subject: [PATCH 1/5] Initial implementation of EngineGetPayloadV2 Signed-off-by: Gabriel Trintinalia --- .../besu/ethereum/api/jsonrpc/RpcMethod.java | 1 + .../methods/engine/EngineGetPayload.java | 23 ++-- .../methods/engine/EngineGetPayloadV2.java | 49 +++++++ .../internal/results/BlockResultFactory.java | 5 + .../results/EngineGetPayloadResultV2.java | 43 ++++++ .../ExecutionEngineJsonRpcMethods.java | 7 + .../engine/EngineGetPayloadTestV2.java | 127 ++++++++++++++++++ 7 files changed, 245 insertions(+), 10 deletions(-) create mode 100644 ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineGetPayloadV2.java create mode 100644 ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/results/EngineGetPayloadResultV2.java create mode 100644 ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineGetPayloadTestV2.java diff --git a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/RpcMethod.java b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/RpcMethod.java index 130955c7fb3..ff06bb3a828 100644 --- a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/RpcMethod.java +++ b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/RpcMethod.java @@ -47,6 +47,7 @@ public enum RpcMethod { DEBUG_GET_BAD_BLOCKS("debug_getBadBlocks"), ENGINE_GET_PAYLOAD("engine_getPayloadV1"), + ENGINE_GET_PAYLOAD_V2("engine_getPayloadV2"), ENGINE_EXECUTE_PAYLOAD("engine_executePayloadV1"), ENGINE_NEW_PAYLOAD("engine_newPayloadV1"), ENGINE_FORKCHOICE_UPDATED("engine_forkchoiceUpdatedV1"), diff --git a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineGetPayload.java b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineGetPayload.java index 41daf4360ab..07210c56c52 100644 --- a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineGetPayload.java +++ b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineGetPayload.java @@ -39,7 +39,7 @@ public class EngineGetPayload extends ExecutionEngineJsonRpcMethod { private final MergeMiningCoordinator mergeMiningCoordinator; - private final BlockResultFactory blockResultFactory; + protected final BlockResultFactory blockResultFactory; private static final Logger LOG = LoggerFactory.getLogger(EngineGetPayload.class); public EngineGetPayload( @@ -66,21 +66,24 @@ public JsonRpcResponse syncResponse(final JsonRpcRequestContext request) { mergeMiningCoordinator.finalizeProposalById(payloadId); final Optional block = mergeContext.get().retrieveBlockById(payloadId); if (block.isPresent()) { - var proposal = block.get(); - var proposalHeader = proposal.getHeader(); + final var proposal = block.get(); + final var proposalHeader = proposal.getHeader(); infoLambda( LOG, "Fetch block proposal by identifier: {}, hash: {}, number: {}, coinbase: {}, transaction count: {}", - () -> payloadId.toHexString(), - () -> proposalHeader.getHash(), - () -> proposalHeader.getNumber(), - () -> proposalHeader.getCoinbase(), + payloadId::toHexString, + proposalHeader::getHash, + proposalHeader::getNumber, + proposalHeader::getCoinbase, () -> proposal.getBody().getTransactions().size()); debugLambda(LOG, "assembledBlock {}", () -> block.map(Block::toString).get()); - return new JsonRpcSuccessResponse( - request.getRequest().getId(), - blockResultFactory.enginePayloadTransactionComplete(block.get())); + return createResponse(request, block.get()); } return new JsonRpcErrorResponse(request.getRequest().getId(), JsonRpcError.UNKNOWN_PAYLOAD); } + + protected JsonRpcResponse createResponse(final JsonRpcRequestContext request, final Block block) { + return new JsonRpcSuccessResponse( + request.getRequest().getId(), blockResultFactory.enginePayloadTransactionComplete(block)); + } } diff --git a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineGetPayloadV2.java b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineGetPayloadV2.java new file mode 100644 index 00000000000..579be356f8d --- /dev/null +++ b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineGetPayloadV2.java @@ -0,0 +1,49 @@ +/* + * Copyright Hyperledger Besu Contributors. + * + * 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.api.jsonrpc.internal.methods.engine; + +import org.hyperledger.besu.consensus.merge.blockcreation.MergeMiningCoordinator; +import org.hyperledger.besu.ethereum.ProtocolContext; +import org.hyperledger.besu.ethereum.api.jsonrpc.RpcMethod; +import org.hyperledger.besu.ethereum.api.jsonrpc.internal.JsonRpcRequestContext; +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.api.jsonrpc.internal.results.BlockResultFactory; +import org.hyperledger.besu.ethereum.core.Block; + +import io.vertx.core.Vertx; + +public class EngineGetPayloadV2 extends EngineGetPayload { + + public EngineGetPayloadV2( + final Vertx vertx, + final ProtocolContext protocolContext, + final MergeMiningCoordinator mergeMiningCoordinator, + final BlockResultFactory blockResultFactory, + final EngineCallListener engineCallListener) { + super(vertx, protocolContext, mergeMiningCoordinator, blockResultFactory, engineCallListener); + } + + @Override + public String getName() { + return RpcMethod.ENGINE_GET_PAYLOAD_V2.getMethodName(); + } + + @Override + protected JsonRpcResponse createResponse(final JsonRpcRequestContext request, final Block block) { + return new JsonRpcSuccessResponse( + request.getRequest().getId(), blockResultFactory.enginePayloadTransactionCompleteV2(block)); + } +} diff --git a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/results/BlockResultFactory.java b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/results/BlockResultFactory.java index e4311753542..1f84999cd3b 100644 --- a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/results/BlockResultFactory.java +++ b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/results/BlockResultFactory.java @@ -95,6 +95,11 @@ public EngineGetPayloadResult enginePayloadTransactionComplete(final Block block return new EngineGetPayloadResult(block.getHeader(), txs); } + public EngineGetPayloadResultV2 enginePayloadTransactionCompleteV2(final Block block) { + final EngineGetPayloadResult payload = enginePayloadTransactionComplete(block); + return new EngineGetPayloadResultV2(payload, Quantity.create(0)); + } + public BlockResult transactionHash(final BlockWithMetadata blockWithMetadata) { return transactionHash(blockWithMetadata, false); } diff --git a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/results/EngineGetPayloadResultV2.java b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/results/EngineGetPayloadResultV2.java new file mode 100644 index 00000000000..98726a056da --- /dev/null +++ b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/results/EngineGetPayloadResultV2.java @@ -0,0 +1,43 @@ +/* + * Copyright Hyperledger Besu Contributors. + * + * 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.api.jsonrpc.internal.results; + +import com.fasterxml.jackson.annotation.JsonGetter; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; + +@JsonPropertyOrder({ + "executionPayload", + "blockValue", +}) +public class EngineGetPayloadResultV2 { + protected final EngineGetPayloadResult executionPayload; + private final String blockValue; + + public EngineGetPayloadResultV2( + final EngineGetPayloadResult executionPayload, final String blockValue) { + this.executionPayload = executionPayload; + this.blockValue = blockValue; + } + + @JsonGetter(value = "executionPayload") + public EngineGetPayloadResult getExecutionPayload() { + return executionPayload; + } + + @JsonGetter(value = "blockValue") + public String getBlockValue() { + return blockValue; + } +} diff --git a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/methods/ExecutionEngineJsonRpcMethods.java b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/methods/ExecutionEngineJsonRpcMethods.java index a29022aa0ab..f7e8d7f6852 100644 --- a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/methods/ExecutionEngineJsonRpcMethods.java +++ b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/methods/ExecutionEngineJsonRpcMethods.java @@ -21,6 +21,7 @@ import org.hyperledger.besu.ethereum.api.jsonrpc.internal.methods.engine.EngineExchangeTransitionConfiguration; import org.hyperledger.besu.ethereum.api.jsonrpc.internal.methods.engine.EngineForkchoiceUpdated; import org.hyperledger.besu.ethereum.api.jsonrpc.internal.methods.engine.EngineGetPayload; +import org.hyperledger.besu.ethereum.api.jsonrpc.internal.methods.engine.EngineGetPayloadV2; import org.hyperledger.besu.ethereum.api.jsonrpc.internal.methods.engine.EngineNewPayload; import org.hyperledger.besu.ethereum.api.jsonrpc.internal.methods.engine.EngineQosTimer; import org.hyperledger.besu.ethereum.api.jsonrpc.internal.results.BlockResultFactory; @@ -73,6 +74,12 @@ protected Map create() { mergeCoordinator.get(), blockResultFactory, engineQosTimer), + new EngineGetPayloadV2( + consensusEngineServer, + protocolContext, + mergeCoordinator.get(), + blockResultFactory, + engineQosTimer), new EngineNewPayload( consensusEngineServer, protocolContext, diff --git a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineGetPayloadTestV2.java b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineGetPayloadTestV2.java new file mode 100644 index 00000000000..937226eeb20 --- /dev/null +++ b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineGetPayloadTestV2.java @@ -0,0 +1,127 @@ +/* + * Copyright Hyperledger Besu Contributors. + * + * 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.api.jsonrpc.internal.methods.engine; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import org.hyperledger.besu.consensus.merge.MergeContext; +import org.hyperledger.besu.consensus.merge.blockcreation.MergeMiningCoordinator; +import org.hyperledger.besu.consensus.merge.blockcreation.PayloadIdentifier; +import org.hyperledger.besu.datatypes.Address; +import org.hyperledger.besu.datatypes.Hash; +import org.hyperledger.besu.ethereum.ProtocolContext; +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.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.api.jsonrpc.internal.results.BlockResultFactory; +import org.hyperledger.besu.ethereum.api.jsonrpc.internal.results.EngineGetPayloadResultV2; +import org.hyperledger.besu.ethereum.api.jsonrpc.internal.results.Quantity; +import org.hyperledger.besu.ethereum.core.Block; +import org.hyperledger.besu.ethereum.core.BlockBody; +import org.hyperledger.besu.ethereum.core.BlockHeader; +import org.hyperledger.besu.ethereum.core.BlockHeaderTestFixture; + +import java.util.Collections; +import java.util.Optional; + +import io.vertx.core.Vertx; +import org.apache.tuweni.bytes.Bytes32; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.junit.MockitoJUnitRunner; + +@RunWith(MockitoJUnitRunner.class) +public class EngineGetPayloadTestV2 { + + private EngineGetPayloadV2 method; + private static final Vertx vertx = Vertx.vertx(); + private static final BlockResultFactory factory = new BlockResultFactory(); + private static final PayloadIdentifier mockPid = + PayloadIdentifier.forPayloadParams( + Hash.ZERO, 1337L, Bytes32.random(), Address.fromHexString("0x42")); + private static final BlockHeader mockHeader = + new BlockHeaderTestFixture().prevRandao(Bytes32.random()).buildHeader(); + private static final Block mockBlock = + new Block(mockHeader, new BlockBody(Collections.emptyList(), Collections.emptyList())); + + @Mock private ProtocolContext protocolContext; + + @Mock private MergeContext mergeContext; + @Mock private MergeMiningCoordinator mergeMiningCoordinator; + + @Mock private EngineCallListener engineCallListener; + + @Before + public void before() { + when(mergeContext.retrieveBlockById(mockPid)).thenReturn(Optional.of(mockBlock)); + when(protocolContext.safeConsensusContext(Mockito.any())).thenReturn(Optional.of(mergeContext)); + this.method = + new EngineGetPayloadV2( + vertx, protocolContext, mergeMiningCoordinator, factory, engineCallListener); + } + + @Test + public void shouldReturnExpectedMethodName() { + // will break as specs change, intentional: + assertThat(method.getName()).isEqualTo("engine_getPayloadV2"); + } + + @Test + public void shouldReturnBlockForKnownPayloadId() { + final var resp = resp(mockPid); + assertThat(resp).isInstanceOf(JsonRpcSuccessResponse.class); + Optional.of(resp) + .map(JsonRpcSuccessResponse.class::cast) + .ifPresent( + r -> { + assertThat(r.getResult()).isInstanceOf(EngineGetPayloadResultV2.class); + final EngineGetPayloadResultV2 res = (EngineGetPayloadResultV2) r.getResult(); + assertThat(res.getExecutionPayload().getHash()) + .isEqualTo(mockHeader.getHash().toString()); + assertThat(res.getBlockValue()).isEqualTo(Quantity.create(0)); + assertThat(res.getExecutionPayload().getPrevRandao()) + .isEqualTo(mockHeader.getPrevRandao().map(Bytes32::toString).orElse("")); + }); + verify(engineCallListener, times(1)).executionEngineCalled(); + } + + @Test + public void shouldFailForUnknownPayloadId() { + final var resp = + resp( + PayloadIdentifier.forPayloadParams( + Hash.ZERO, 0L, Bytes32.random(), Address.fromHexString("0x42"))); + assertThat(resp).isInstanceOf(JsonRpcErrorResponse.class); + verify(engineCallListener, times(1)).executionEngineCalled(); + } + + private JsonRpcResponse resp(final PayloadIdentifier pid) { + return method.response( + new JsonRpcRequestContext( + new JsonRpcRequest( + "2.0", + RpcMethod.ENGINE_GET_PAYLOAD_V2.getMethodName(), + new Object[] {pid.serialize()}))); + } +} From 41392c4534e455b5c8107cd717859dfb9a572afd Mon Sep 17 00:00:00 2001 From: Gabriel-Trintinalia Date: Tue, 20 Dec 2022 21:21:03 +1100 Subject: [PATCH 2/5] Classes reorganization Signed-off-by: Gabriel Trintinalia --- .../engine/AbstractEngineGetPayload.java | 80 +++++++++++++++++++ .../methods/engine/EngineGetPayload.java | 44 +--------- .../methods/engine/EngineGetPayloadV2.java | 2 +- 3 files changed, 83 insertions(+), 43 deletions(-) create mode 100644 ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/AbstractEngineGetPayload.java diff --git a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/AbstractEngineGetPayload.java b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/AbstractEngineGetPayload.java new file mode 100644 index 00000000000..5f70c8f6564 --- /dev/null +++ b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/AbstractEngineGetPayload.java @@ -0,0 +1,80 @@ +/* + * Copyright Hyperledger Besu Contributors. + * + * 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.api.jsonrpc.internal.methods.engine; + +import static org.hyperledger.besu.util.Slf4jLambdaHelper.debugLambda; +import static org.hyperledger.besu.util.Slf4jLambdaHelper.infoLambda; + +import org.hyperledger.besu.consensus.merge.blockcreation.MergeMiningCoordinator; +import org.hyperledger.besu.consensus.merge.blockcreation.PayloadIdentifier; +import org.hyperledger.besu.ethereum.ProtocolContext; +import org.hyperledger.besu.ethereum.api.jsonrpc.internal.JsonRpcRequestContext; +import org.hyperledger.besu.ethereum.api.jsonrpc.internal.methods.ExecutionEngineJsonRpcMethod; +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.results.BlockResultFactory; +import org.hyperledger.besu.ethereum.core.Block; + +import java.util.Optional; + +import io.vertx.core.Vertx; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public abstract class AbstractEngineGetPayload extends ExecutionEngineJsonRpcMethod { + + private final MergeMiningCoordinator mergeMiningCoordinator; + protected final BlockResultFactory blockResultFactory; + private static final Logger LOG = LoggerFactory.getLogger(AbstractEngineGetPayload.class); + + public AbstractEngineGetPayload( + final Vertx vertx, + final ProtocolContext protocolContext, + final MergeMiningCoordinator mergeMiningCoordinator, + final BlockResultFactory blockResultFactory, + final EngineCallListener engineCallListener) { + super(vertx, protocolContext, engineCallListener); + this.mergeMiningCoordinator = mergeMiningCoordinator; + this.blockResultFactory = blockResultFactory; + } + + @Override + public JsonRpcResponse syncResponse(final JsonRpcRequestContext request) { + engineCallListener.executionEngineCalled(); + + final PayloadIdentifier payloadId = request.getRequiredParameter(0, PayloadIdentifier.class); + mergeMiningCoordinator.finalizeProposalById(payloadId); + final Optional block = mergeContext.get().retrieveBlockById(payloadId); + if (block.isPresent()) { + final var proposal = block.get(); + final var proposalHeader = proposal.getHeader(); + infoLambda( + LOG, + "Fetch block proposal by identifier: {}, hash: {}, number: {}, coinbase: {}, transaction count: {}", + payloadId::toHexString, + proposalHeader::getHash, + proposalHeader::getNumber, + proposalHeader::getCoinbase, + () -> proposal.getBody().getTransactions().size()); + debugLambda(LOG, "assembledBlock {}", () -> block.map(Block::toString).get()); + return createResponse(request, block.get()); + } + return new JsonRpcErrorResponse(request.getRequest().getId(), JsonRpcError.UNKNOWN_PAYLOAD); + } + + protected abstract JsonRpcResponse createResponse( + final JsonRpcRequestContext request, final Block block); +} diff --git a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineGetPayload.java b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineGetPayload.java index 07210c56c52..54919e23485 100644 --- a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineGetPayload.java +++ b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineGetPayload.java @@ -14,33 +14,18 @@ */ package org.hyperledger.besu.ethereum.api.jsonrpc.internal.methods.engine; -import static org.hyperledger.besu.util.Slf4jLambdaHelper.debugLambda; -import static org.hyperledger.besu.util.Slf4jLambdaHelper.infoLambda; - import org.hyperledger.besu.consensus.merge.blockcreation.MergeMiningCoordinator; -import org.hyperledger.besu.consensus.merge.blockcreation.PayloadIdentifier; import org.hyperledger.besu.ethereum.ProtocolContext; import org.hyperledger.besu.ethereum.api.jsonrpc.RpcMethod; import org.hyperledger.besu.ethereum.api.jsonrpc.internal.JsonRpcRequestContext; -import org.hyperledger.besu.ethereum.api.jsonrpc.internal.methods.ExecutionEngineJsonRpcMethod; -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.api.jsonrpc.internal.results.BlockResultFactory; import org.hyperledger.besu.ethereum.core.Block; -import java.util.Optional; - import io.vertx.core.Vertx; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class EngineGetPayload extends ExecutionEngineJsonRpcMethod { - private final MergeMiningCoordinator mergeMiningCoordinator; - protected final BlockResultFactory blockResultFactory; - private static final Logger LOG = LoggerFactory.getLogger(EngineGetPayload.class); +public class EngineGetPayload extends AbstractEngineGetPayload { public EngineGetPayload( final Vertx vertx, @@ -48,9 +33,7 @@ public EngineGetPayload( final MergeMiningCoordinator mergeMiningCoordinator, final BlockResultFactory blockResultFactory, final EngineCallListener engineCallListener) { - super(vertx, protocolContext, engineCallListener); - this.mergeMiningCoordinator = mergeMiningCoordinator; - this.blockResultFactory = blockResultFactory; + super(vertx, protocolContext, mergeMiningCoordinator, blockResultFactory, engineCallListener); } @Override @@ -59,29 +42,6 @@ public String getName() { } @Override - public JsonRpcResponse syncResponse(final JsonRpcRequestContext request) { - engineCallListener.executionEngineCalled(); - - final PayloadIdentifier payloadId = request.getRequiredParameter(0, PayloadIdentifier.class); - mergeMiningCoordinator.finalizeProposalById(payloadId); - final Optional block = mergeContext.get().retrieveBlockById(payloadId); - if (block.isPresent()) { - final var proposal = block.get(); - final var proposalHeader = proposal.getHeader(); - infoLambda( - LOG, - "Fetch block proposal by identifier: {}, hash: {}, number: {}, coinbase: {}, transaction count: {}", - payloadId::toHexString, - proposalHeader::getHash, - proposalHeader::getNumber, - proposalHeader::getCoinbase, - () -> proposal.getBody().getTransactions().size()); - debugLambda(LOG, "assembledBlock {}", () -> block.map(Block::toString).get()); - return createResponse(request, block.get()); - } - return new JsonRpcErrorResponse(request.getRequest().getId(), JsonRpcError.UNKNOWN_PAYLOAD); - } - protected JsonRpcResponse createResponse(final JsonRpcRequestContext request, final Block block) { return new JsonRpcSuccessResponse( request.getRequest().getId(), blockResultFactory.enginePayloadTransactionComplete(block)); diff --git a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineGetPayloadV2.java b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineGetPayloadV2.java index 579be356f8d..c52941e70c4 100644 --- a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineGetPayloadV2.java +++ b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineGetPayloadV2.java @@ -25,7 +25,7 @@ import io.vertx.core.Vertx; -public class EngineGetPayloadV2 extends EngineGetPayload { +public class EngineGetPayloadV2 extends AbstractEngineGetPayload { public EngineGetPayloadV2( final Vertx vertx, From a475252905ba4171456d31aa521a03ee394283ad Mon Sep 17 00:00:00 2001 From: Gabriel-Trintinalia Date: Tue, 20 Dec 2022 22:01:14 +1100 Subject: [PATCH 3/5] Classes reorganization Signed-off-by: Gabriel Trintinalia --- .../methods/engine/EngineGetPayload.java | 3 +- .../methods/engine/EngineGetPayloadV2.java | 4 +- .../AbstractEngineGetPayloadResult.java | 17 ++ .../internal/results/BlockResultFactory.java | 27 ++- .../results/EngineGetPayloadResult.java | 2 +- .../results/EngineGetPayloadResultV2.java | 43 ----- .../EngineGetPayloadResultWithdraws.java | 155 ++++++++++++++++++ .../engine/EngineGetPayloadTestV2.java | 7 +- 8 files changed, 205 insertions(+), 53 deletions(-) create mode 100644 ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/results/AbstractEngineGetPayloadResult.java delete mode 100644 ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/results/EngineGetPayloadResultV2.java create mode 100644 ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/results/EngineGetPayloadResultWithdraws.java diff --git a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineGetPayload.java b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineGetPayload.java index 54919e23485..6adc3e03563 100644 --- a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineGetPayload.java +++ b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineGetPayload.java @@ -44,6 +44,7 @@ public String getName() { @Override protected JsonRpcResponse createResponse(final JsonRpcRequestContext request, final Block block) { return new JsonRpcSuccessResponse( - request.getRequest().getId(), blockResultFactory.enginePayloadTransactionComplete(block)); + request.getRequest().getId(), + blockResultFactory.createEnginePayloadTransactionComplete(block, false)); } } diff --git a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineGetPayloadV2.java b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineGetPayloadV2.java index c52941e70c4..8ef99f1b0b9 100644 --- a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineGetPayloadV2.java +++ b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineGetPayloadV2.java @@ -43,7 +43,9 @@ public String getName() { @Override protected JsonRpcResponse createResponse(final JsonRpcRequestContext request, final Block block) { + final boolean includeWithdraws = true; return new JsonRpcSuccessResponse( - request.getRequest().getId(), blockResultFactory.enginePayloadTransactionCompleteV2(block)); + request.getRequest().getId(), + blockResultFactory.createEnginePayloadTransactionComplete(block, includeWithdraws)); } } diff --git a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/results/AbstractEngineGetPayloadResult.java b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/results/AbstractEngineGetPayloadResult.java new file mode 100644 index 00000000000..ba27993a2fb --- /dev/null +++ b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/results/AbstractEngineGetPayloadResult.java @@ -0,0 +1,17 @@ +/* + * Copyright Hyperledger Besu Contributors. + * + * 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.api.jsonrpc.internal.results; + +public abstract class AbstractEngineGetPayloadResult {} diff --git a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/results/BlockResultFactory.java b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/results/BlockResultFactory.java index 1f84999cd3b..0b6f14bb2f2 100644 --- a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/results/BlockResultFactory.java +++ b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/results/BlockResultFactory.java @@ -85,7 +85,15 @@ public BlockResult transactionComplete(final Block block) { block.getHeader(), txs, ommers, block.getHeader().getDifficulty(), block.calculateSize()); } - public EngineGetPayloadResult enginePayloadTransactionComplete(final Block block) { + public AbstractEngineGetPayloadResult createEnginePayloadTransactionComplete( + final Block block, final boolean includeWithdraws) { + + return includeWithdraws + ? enginePayloadTransactionCompleteWithdraws(block) + : enginePayloadTransactionComplete(block); + } + + private EngineGetPayloadResult enginePayloadTransactionComplete(final Block block) { final List txs = block.getBody().getTransactions().stream() .map(TransactionEncoder::encodeOpaqueBytes) @@ -95,9 +103,20 @@ public EngineGetPayloadResult enginePayloadTransactionComplete(final Block block return new EngineGetPayloadResult(block.getHeader(), txs); } - public EngineGetPayloadResultV2 enginePayloadTransactionCompleteV2(final Block block) { - final EngineGetPayloadResult payload = enginePayloadTransactionComplete(block); - return new EngineGetPayloadResultV2(payload, Quantity.create(0)); + private EngineGetPayloadResultWithdraws enginePayloadTransactionCompleteWithdraws( + final Block block) { + final List txs = + block.getBody().getTransactions().stream() + .map(TransactionEncoder::encodeOpaqueBytes) + .map(Bytes::toHexString) + .collect(Collectors.toList()); + + final long blockValue = calculateBlockValue(txs); + return new EngineGetPayloadResultWithdraws(block.getHeader(), txs, Quantity.create(blockValue)); + } + + private long calculateBlockValue(final List ignored) { + return 0L; } public BlockResult transactionHash(final BlockWithMetadata blockWithMetadata) { diff --git a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/results/EngineGetPayloadResult.java b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/results/EngineGetPayloadResult.java index 9e827e1d8cf..ed19e945a47 100644 --- a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/results/EngineGetPayloadResult.java +++ b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/results/EngineGetPayloadResult.java @@ -39,7 +39,7 @@ "blockHash", "transactions" }) -public class EngineGetPayloadResult { +public class EngineGetPayloadResult extends AbstractEngineGetPayloadResult { protected final String blockHash; private final String parentHash; private final String feeRecipient; diff --git a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/results/EngineGetPayloadResultV2.java b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/results/EngineGetPayloadResultV2.java deleted file mode 100644 index 98726a056da..00000000000 --- a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/results/EngineGetPayloadResultV2.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright Hyperledger Besu Contributors. - * - * 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.api.jsonrpc.internal.results; - -import com.fasterxml.jackson.annotation.JsonGetter; -import com.fasterxml.jackson.annotation.JsonPropertyOrder; - -@JsonPropertyOrder({ - "executionPayload", - "blockValue", -}) -public class EngineGetPayloadResultV2 { - protected final EngineGetPayloadResult executionPayload; - private final String blockValue; - - public EngineGetPayloadResultV2( - final EngineGetPayloadResult executionPayload, final String blockValue) { - this.executionPayload = executionPayload; - this.blockValue = blockValue; - } - - @JsonGetter(value = "executionPayload") - public EngineGetPayloadResult getExecutionPayload() { - return executionPayload; - } - - @JsonGetter(value = "blockValue") - public String getBlockValue() { - return blockValue; - } -} diff --git a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/results/EngineGetPayloadResultWithdraws.java b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/results/EngineGetPayloadResultWithdraws.java new file mode 100644 index 00000000000..44ebb70a22d --- /dev/null +++ b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/results/EngineGetPayloadResultWithdraws.java @@ -0,0 +1,155 @@ +/* + * Copyright Hyperledger Besu Contributors. + * + * 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.api.jsonrpc.internal.results; + +import org.hyperledger.besu.ethereum.core.BlockHeader; + +import java.util.List; + +import com.fasterxml.jackson.annotation.JsonGetter; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; +import org.apache.tuweni.bytes.Bytes32; + +@JsonPropertyOrder({ + "executionPayload", + "blockValue", +}) +public class EngineGetPayloadResultWithdraws extends AbstractEngineGetPayloadResult { + protected final PayloadResult executionPayload; + private final String blockValue; + + public EngineGetPayloadResultWithdraws( + final BlockHeader header, final List transactions, final String blockValue) { + this.executionPayload = new PayloadResult(header, transactions); + this.blockValue = blockValue; + } + + @JsonGetter(value = "executionPayload") + public PayloadResult getExecutionPayload() { + return executionPayload; + } + + @JsonGetter(value = "blockValue") + public String getBlockValue() { + return blockValue; + } + + public static class PayloadResult { + + protected final String blockHash; + private final String parentHash; + private final String feeRecipient; + private final String stateRoot; + private final String receiptsRoot; + private final String logsBloom; + private final String prevRandao; + private final String blockNumber; + private final String gasLimit; + private final String gasUsed; + private final String timestamp; + private final String extraData; + private final String baseFeePerGas; + protected final List transactions; + + public PayloadResult(final BlockHeader header, final List transactions) { + this.blockNumber = Quantity.create(header.getNumber()); + this.blockHash = header.getHash().toString(); + this.parentHash = header.getParentHash().toString(); + this.logsBloom = header.getLogsBloom().toString(); + this.stateRoot = header.getStateRoot().toString(); + this.receiptsRoot = header.getReceiptsRoot().toString(); + this.extraData = header.getExtraData().toString(); + this.baseFeePerGas = header.getBaseFee().map(Quantity::create).orElse(null); + this.gasLimit = Quantity.create(header.getGasLimit()); + this.gasUsed = Quantity.create(header.getGasUsed()); + this.timestamp = Quantity.create(header.getTimestamp()); + this.transactions = transactions; + this.feeRecipient = header.getCoinbase().toString(); + this.prevRandao = header.getPrevRandao().map(Bytes32::toHexString).orElse(null); + } + + @JsonGetter(value = "blockNumber") + public String getNumber() { + return blockNumber; + } + + @JsonGetter(value = "blockHash") + public String getHash() { + return blockHash; + } + + @JsonGetter(value = "parentHash") + public String getParentHash() { + return parentHash; + } + + @JsonGetter(value = "logsBloom") + public String getLogsBloom() { + return logsBloom; + } + + @JsonGetter(value = "prevRandao") + public String getPrevRandao() { + return prevRandao; + } + + @JsonGetter(value = "stateRoot") + public String getStateRoot() { + return stateRoot; + } + + @JsonGetter(value = "receiptsRoot") + public String getReceiptRoot() { + return receiptsRoot; + } + + @JsonGetter(value = "extraData") + public String getExtraData() { + return extraData; + } + + @JsonGetter(value = "baseFeePerGas") + public String getBaseFeePerGas() { + return baseFeePerGas; + } + + @JsonGetter(value = "gasLimit") + public String getGasLimit() { + return gasLimit; + } + + @JsonGetter(value = "gasUsed") + public String getGasUsed() { + return gasUsed; + } + + @JsonGetter(value = "timestamp") + public String getTimestamp() { + return timestamp; + } + + @JsonGetter(value = "transactions") + public List getTransactions() { + return transactions; + } + + @JsonGetter(value = "feeRecipient") + @JsonInclude(JsonInclude.Include.NON_NULL) + public String getFeeRecipient() { + return feeRecipient; + } + } +} diff --git a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineGetPayloadTestV2.java b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineGetPayloadTestV2.java index 937226eeb20..30d6f89d9f7 100644 --- a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineGetPayloadTestV2.java +++ b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineGetPayloadTestV2.java @@ -32,7 +32,7 @@ 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.api.jsonrpc.internal.results.BlockResultFactory; -import org.hyperledger.besu.ethereum.api.jsonrpc.internal.results.EngineGetPayloadResultV2; +import org.hyperledger.besu.ethereum.api.jsonrpc.internal.results.EngineGetPayloadResultWithdraws; import org.hyperledger.besu.ethereum.api.jsonrpc.internal.results.Quantity; import org.hyperledger.besu.ethereum.core.Block; import org.hyperledger.besu.ethereum.core.BlockBody; @@ -95,8 +95,9 @@ public void shouldReturnBlockForKnownPayloadId() { .map(JsonRpcSuccessResponse.class::cast) .ifPresent( r -> { - assertThat(r.getResult()).isInstanceOf(EngineGetPayloadResultV2.class); - final EngineGetPayloadResultV2 res = (EngineGetPayloadResultV2) r.getResult(); + assertThat(r.getResult()).isInstanceOf(EngineGetPayloadResultWithdraws.class); + final EngineGetPayloadResultWithdraws res = + (EngineGetPayloadResultWithdraws) r.getResult(); assertThat(res.getExecutionPayload().getHash()) .isEqualTo(mockHeader.getHash().toString()); assertThat(res.getBlockValue()).isEqualTo(Quantity.create(0)); From 7f8104c7cfb9a0ea4ec49e87eed2c8d320f03e49 Mon Sep 17 00:00:00 2001 From: Gabriel-Trintinalia Date: Tue, 20 Dec 2022 22:03:18 +1100 Subject: [PATCH 4/5] Rename class to conform with Java conventions Signed-off-by: Gabriel Trintinalia --- ...{EngineGetPayloadTestV2.java => EngineGetPayloadV2Test.java} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/{EngineGetPayloadTestV2.java => EngineGetPayloadV2Test.java} (99%) diff --git a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineGetPayloadTestV2.java b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineGetPayloadV2Test.java similarity index 99% rename from ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineGetPayloadTestV2.java rename to ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineGetPayloadV2Test.java index 30d6f89d9f7..25e9228b2e9 100644 --- a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineGetPayloadTestV2.java +++ b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineGetPayloadV2Test.java @@ -52,7 +52,7 @@ import org.mockito.junit.MockitoJUnitRunner; @RunWith(MockitoJUnitRunner.class) -public class EngineGetPayloadTestV2 { +public class EngineGetPayloadV2Test { private EngineGetPayloadV2 method; private static final Vertx vertx = Vertx.vertx(); From adcf9a6d326348a864b0f8c616066b1c4ed2fa97 Mon Sep 17 00:00:00 2001 From: Gabriel-Trintinalia Date: Wed, 21 Dec 2022 13:05:05 +1100 Subject: [PATCH 5/5] Remove abstract class and rename methods to match Spec (V2) Signed-off-by: Gabriel Trintinalia --- ...eGetPayload.java => EngineGetPayloadV1.java} | 7 +++---- .../methods/engine/EngineGetPayloadV2.java | 4 +--- .../results/AbstractEngineGetPayloadResult.java | 17 ----------------- .../internal/results/BlockResultFactory.java | 17 ++++------------- ...esult.java => EngineGetPayloadResultV1.java} | 4 ++-- ...draws.java => EngineGetPayloadResultV2.java} | 4 ++-- .../methods/ExecutionEngineJsonRpcMethods.java | 4 ++-- ...oadTest.java => EngineGetPayloadV1Test.java} | 16 ++++++++-------- .../methods/engine/EngineGetPayloadV2Test.java | 7 +++---- 9 files changed, 25 insertions(+), 55 deletions(-) rename ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/{EngineGetPayload.java => EngineGetPayloadV1.java} (90%) delete mode 100644 ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/results/AbstractEngineGetPayloadResult.java rename ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/results/{EngineGetPayloadResult.java => EngineGetPayloadResultV1.java} (95%) rename ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/results/{EngineGetPayloadResultWithdraws.java => EngineGetPayloadResultV2.java} (97%) rename ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/{EngineGetPayloadTest.java => EngineGetPayloadV1Test.java} (94%) diff --git a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineGetPayload.java b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineGetPayloadV1.java similarity index 90% rename from ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineGetPayload.java rename to ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineGetPayloadV1.java index 6adc3e03563..bdea602d9c4 100644 --- a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineGetPayload.java +++ b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineGetPayloadV1.java @@ -25,9 +25,9 @@ import io.vertx.core.Vertx; -public class EngineGetPayload extends AbstractEngineGetPayload { +public class EngineGetPayloadV1 extends AbstractEngineGetPayload { - public EngineGetPayload( + public EngineGetPayloadV1( final Vertx vertx, final ProtocolContext protocolContext, final MergeMiningCoordinator mergeMiningCoordinator, @@ -44,7 +44,6 @@ public String getName() { @Override protected JsonRpcResponse createResponse(final JsonRpcRequestContext request, final Block block) { return new JsonRpcSuccessResponse( - request.getRequest().getId(), - blockResultFactory.createEnginePayloadTransactionComplete(block, false)); + request.getRequest().getId(), blockResultFactory.payloadTransactionCompleteV1(block)); } } diff --git a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineGetPayloadV2.java b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineGetPayloadV2.java index 8ef99f1b0b9..22aadfd5b59 100644 --- a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineGetPayloadV2.java +++ b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineGetPayloadV2.java @@ -43,9 +43,7 @@ public String getName() { @Override protected JsonRpcResponse createResponse(final JsonRpcRequestContext request, final Block block) { - final boolean includeWithdraws = true; return new JsonRpcSuccessResponse( - request.getRequest().getId(), - blockResultFactory.createEnginePayloadTransactionComplete(block, includeWithdraws)); + request.getRequest().getId(), blockResultFactory.payloadTransactionCompleteV2(block)); } } diff --git a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/results/AbstractEngineGetPayloadResult.java b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/results/AbstractEngineGetPayloadResult.java deleted file mode 100644 index ba27993a2fb..00000000000 --- a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/results/AbstractEngineGetPayloadResult.java +++ /dev/null @@ -1,17 +0,0 @@ -/* - * Copyright Hyperledger Besu Contributors. - * - * 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.api.jsonrpc.internal.results; - -public abstract class AbstractEngineGetPayloadResult {} diff --git a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/results/BlockResultFactory.java b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/results/BlockResultFactory.java index 0b6f14bb2f2..3ee515a448c 100644 --- a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/results/BlockResultFactory.java +++ b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/results/BlockResultFactory.java @@ -85,26 +85,17 @@ public BlockResult transactionComplete(final Block block) { block.getHeader(), txs, ommers, block.getHeader().getDifficulty(), block.calculateSize()); } - public AbstractEngineGetPayloadResult createEnginePayloadTransactionComplete( - final Block block, final boolean includeWithdraws) { - - return includeWithdraws - ? enginePayloadTransactionCompleteWithdraws(block) - : enginePayloadTransactionComplete(block); - } - - private EngineGetPayloadResult enginePayloadTransactionComplete(final Block block) { + public EngineGetPayloadResultV1 payloadTransactionCompleteV1(final Block block) { final List txs = block.getBody().getTransactions().stream() .map(TransactionEncoder::encodeOpaqueBytes) .map(Bytes::toHexString) .collect(Collectors.toList()); - return new EngineGetPayloadResult(block.getHeader(), txs); + return new EngineGetPayloadResultV1(block.getHeader(), txs); } - private EngineGetPayloadResultWithdraws enginePayloadTransactionCompleteWithdraws( - final Block block) { + public EngineGetPayloadResultV2 payloadTransactionCompleteV2(final Block block) { final List txs = block.getBody().getTransactions().stream() .map(TransactionEncoder::encodeOpaqueBytes) @@ -112,7 +103,7 @@ private EngineGetPayloadResultWithdraws enginePayloadTransactionCompleteWithdraw .collect(Collectors.toList()); final long blockValue = calculateBlockValue(txs); - return new EngineGetPayloadResultWithdraws(block.getHeader(), txs, Quantity.create(blockValue)); + return new EngineGetPayloadResultV2(block.getHeader(), txs, Quantity.create(blockValue)); } private long calculateBlockValue(final List ignored) { diff --git a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/results/EngineGetPayloadResult.java b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/results/EngineGetPayloadResultV1.java similarity index 95% rename from ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/results/EngineGetPayloadResult.java rename to ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/results/EngineGetPayloadResultV1.java index ed19e945a47..0b21d15ef62 100644 --- a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/results/EngineGetPayloadResult.java +++ b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/results/EngineGetPayloadResultV1.java @@ -39,7 +39,7 @@ "blockHash", "transactions" }) -public class EngineGetPayloadResult extends AbstractEngineGetPayloadResult { +public class EngineGetPayloadResultV1 { protected final String blockHash; private final String parentHash; private final String feeRecipient; @@ -55,7 +55,7 @@ public class EngineGetPayloadResult extends AbstractEngineGetPayloadResult { private final String baseFeePerGas; protected final List transactions; - public EngineGetPayloadResult(final BlockHeader header, final List transactions) { + public EngineGetPayloadResultV1(final BlockHeader header, final List transactions) { this.blockNumber = Quantity.create(header.getNumber()); this.blockHash = header.getHash().toString(); this.parentHash = header.getParentHash().toString(); diff --git a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/results/EngineGetPayloadResultWithdraws.java b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/results/EngineGetPayloadResultV2.java similarity index 97% rename from ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/results/EngineGetPayloadResultWithdraws.java rename to ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/results/EngineGetPayloadResultV2.java index 44ebb70a22d..458becbc316 100644 --- a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/results/EngineGetPayloadResultWithdraws.java +++ b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/results/EngineGetPayloadResultV2.java @@ -27,11 +27,11 @@ "executionPayload", "blockValue", }) -public class EngineGetPayloadResultWithdraws extends AbstractEngineGetPayloadResult { +public class EngineGetPayloadResultV2 { protected final PayloadResult executionPayload; private final String blockValue; - public EngineGetPayloadResultWithdraws( + public EngineGetPayloadResultV2( final BlockHeader header, final List transactions, final String blockValue) { this.executionPayload = new PayloadResult(header, transactions); this.blockValue = blockValue; diff --git a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/methods/ExecutionEngineJsonRpcMethods.java b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/methods/ExecutionEngineJsonRpcMethods.java index f7e8d7f6852..8d64b41d22f 100644 --- a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/methods/ExecutionEngineJsonRpcMethods.java +++ b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/methods/ExecutionEngineJsonRpcMethods.java @@ -20,7 +20,7 @@ import org.hyperledger.besu.ethereum.api.jsonrpc.internal.methods.JsonRpcMethod; import org.hyperledger.besu.ethereum.api.jsonrpc.internal.methods.engine.EngineExchangeTransitionConfiguration; import org.hyperledger.besu.ethereum.api.jsonrpc.internal.methods.engine.EngineForkchoiceUpdated; -import org.hyperledger.besu.ethereum.api.jsonrpc.internal.methods.engine.EngineGetPayload; +import org.hyperledger.besu.ethereum.api.jsonrpc.internal.methods.engine.EngineGetPayloadV1; import org.hyperledger.besu.ethereum.api.jsonrpc.internal.methods.engine.EngineGetPayloadV2; import org.hyperledger.besu.ethereum.api.jsonrpc.internal.methods.engine.EngineNewPayload; import org.hyperledger.besu.ethereum.api.jsonrpc.internal.methods.engine.EngineQosTimer; @@ -68,7 +68,7 @@ protected Map create() { if (mergeCoordinator.isPresent()) { return mapOf( - new EngineGetPayload( + new EngineGetPayloadV1( consensusEngineServer, protocolContext, mergeCoordinator.get(), diff --git a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineGetPayloadTest.java b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineGetPayloadV1Test.java similarity index 94% rename from ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineGetPayloadTest.java rename to ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineGetPayloadV1Test.java index da53dd26746..bc8988f2d78 100644 --- a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineGetPayloadTest.java +++ b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineGetPayloadV1Test.java @@ -32,7 +32,7 @@ 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.api.jsonrpc.internal.results.BlockResultFactory; -import org.hyperledger.besu.ethereum.api.jsonrpc.internal.results.EngineGetPayloadResult; +import org.hyperledger.besu.ethereum.api.jsonrpc.internal.results.EngineGetPayloadResultV1; import org.hyperledger.besu.ethereum.core.Block; import org.hyperledger.besu.ethereum.core.BlockBody; import org.hyperledger.besu.ethereum.core.BlockHeader; @@ -51,9 +51,9 @@ import org.mockito.junit.MockitoJUnitRunner; @RunWith(MockitoJUnitRunner.class) -public class EngineGetPayloadTest { +public class EngineGetPayloadV1Test { - private EngineGetPayload method; + private EngineGetPayloadV1 method; private static final Vertx vertx = Vertx.vertx(); private static final BlockResultFactory factory = new BlockResultFactory(); private static final PayloadIdentifier mockPid = @@ -76,7 +76,7 @@ public void before() { when(mergeContext.retrieveBlockById(mockPid)).thenReturn(Optional.of(mockBlock)); when(protocolContext.safeConsensusContext(Mockito.any())).thenReturn(Optional.of(mergeContext)); this.method = - new EngineGetPayload( + new EngineGetPayloadV1( vertx, protocolContext, mergeMiningCoordinator, factory, engineCallListener); } @@ -88,14 +88,14 @@ public void shouldReturnExpectedMethodName() { @Test public void shouldReturnBlockForKnownPayloadId() { - var resp = resp(mockPid); + final var resp = resp(mockPid); assertThat(resp).isInstanceOf(JsonRpcSuccessResponse.class); Optional.of(resp) .map(JsonRpcSuccessResponse.class::cast) .ifPresent( r -> { - assertThat(r.getResult()).isInstanceOf(EngineGetPayloadResult.class); - EngineGetPayloadResult res = (EngineGetPayloadResult) r.getResult(); + assertThat(r.getResult()).isInstanceOf(EngineGetPayloadResultV1.class); + final EngineGetPayloadResultV1 res = (EngineGetPayloadResultV1) r.getResult(); assertThat(res.getHash()).isEqualTo(mockHeader.getHash().toString()); assertThat(res.getPrevRandao()) .isEqualTo(mockHeader.getPrevRandao().map(Bytes32::toString).orElse("")); @@ -105,7 +105,7 @@ public void shouldReturnBlockForKnownPayloadId() { @Test public void shouldFailForUnknownPayloadId() { - var resp = + final var resp = resp( PayloadIdentifier.forPayloadParams( Hash.ZERO, 0L, Bytes32.random(), Address.fromHexString("0x42"))); diff --git a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineGetPayloadV2Test.java b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineGetPayloadV2Test.java index 25e9228b2e9..6034c6a6559 100644 --- a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineGetPayloadV2Test.java +++ b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineGetPayloadV2Test.java @@ -32,7 +32,7 @@ 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.api.jsonrpc.internal.results.BlockResultFactory; -import org.hyperledger.besu.ethereum.api.jsonrpc.internal.results.EngineGetPayloadResultWithdraws; +import org.hyperledger.besu.ethereum.api.jsonrpc.internal.results.EngineGetPayloadResultV2; import org.hyperledger.besu.ethereum.api.jsonrpc.internal.results.Quantity; import org.hyperledger.besu.ethereum.core.Block; import org.hyperledger.besu.ethereum.core.BlockBody; @@ -95,9 +95,8 @@ public void shouldReturnBlockForKnownPayloadId() { .map(JsonRpcSuccessResponse.class::cast) .ifPresent( r -> { - assertThat(r.getResult()).isInstanceOf(EngineGetPayloadResultWithdraws.class); - final EngineGetPayloadResultWithdraws res = - (EngineGetPayloadResultWithdraws) r.getResult(); + assertThat(r.getResult()).isInstanceOf(EngineGetPayloadResultV2.class); + final EngineGetPayloadResultV2 res = (EngineGetPayloadResultV2) r.getResult(); assertThat(res.getExecutionPayload().getHash()) .isEqualTo(mockHeader.getHash().toString()); assertThat(res.getBlockValue()).isEqualTo(Quantity.create(0));