From fb685a1c614b77621001c2c28f2f2cb27a37fe49 Mon Sep 17 00:00:00 2001 From: Gabriel-Trintinalia Date: Fri, 9 Jun 2023 00:37:09 +1000 Subject: [PATCH] Make the return of hardforkfor optional (#5547) Signed-off-by: Gabriel-Trintinalia --- .../merge/TransitionProtocolSchedule.java | 2 +- .../methods/engine/EngineGetPayloadV3.java | 22 +++++++++++-------- .../engine/AbstractEngineGetPayloadTest.java | 2 +- .../mainnet/DefaultProtocolSchedule.java | 13 +++++------ .../ethereum/mainnet/ProtocolSchedule.java | 2 +- .../NoRewardProtocolScheduleWrapper.java | 2 +- 6 files changed, 22 insertions(+), 21 deletions(-) diff --git a/consensus/merge/src/main/java/org/hyperledger/besu/consensus/merge/TransitionProtocolSchedule.java b/consensus/merge/src/main/java/org/hyperledger/besu/consensus/merge/TransitionProtocolSchedule.java index a7d84eabb6f..9a7795e4306 100644 --- a/consensus/merge/src/main/java/org/hyperledger/besu/consensus/merge/TransitionProtocolSchedule.java +++ b/consensus/merge/src/main/java/org/hyperledger/besu/consensus/merge/TransitionProtocolSchedule.java @@ -204,7 +204,7 @@ public void putTimestampMilestone(final long timestamp, final ProtocolSpec proto } @Override - public ScheduledProtocolSpec.Hardfork hardforkFor( + public Optional hardforkFor( final Predicate predicate) { return this.transitionUtils.dispatchFunctionAccordingToMergeState( schedule -> schedule.hardforkFor(predicate)); diff --git a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineGetPayloadV3.java b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineGetPayloadV3.java index f34bb53f66c..8998cd1ebe0 100644 --- a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineGetPayloadV3.java +++ b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineGetPayloadV3.java @@ -28,6 +28,8 @@ import org.hyperledger.besu.ethereum.mainnet.ProtocolSchedule; import org.hyperledger.besu.ethereum.mainnet.ScheduledProtocolSpec; +import java.util.Optional; + import io.vertx.core.Vertx; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -35,8 +37,8 @@ public class EngineGetPayloadV3 extends AbstractEngineGetPayload { private static final Logger LOG = LoggerFactory.getLogger(EngineGetPayloadV3.class); - private final ScheduledProtocolSpec.Hardfork shanghai; - private final ScheduledProtocolSpec.Hardfork cancun; + private final Optional shanghai; + private final Optional cancun; public EngineGetPayloadV3( final Vertx vertx, @@ -70,20 +72,22 @@ protected JsonRpcResponse createResponse( try { long builtAt = blockWithReceipts.getHeader().getTimestamp(); - if (builtAt < this.shanghai.milestone()) { + if (cancun.isPresent() && builtAt >= cancun.get().milestone()) { return new JsonRpcSuccessResponse( request.getRequest().getId(), - blockResultFactory.payloadTransactionCompleteV1(blockWithReceipts.getBlock())); - } else if (builtAt >= this.shanghai.milestone() && builtAt < this.cancun.milestone()) { + blockResultFactory.payloadTransactionCompleteV3(blockWithReceipts)); + } + + if (shanghai.isPresent() && builtAt >= this.shanghai.get().milestone()) { return new JsonRpcSuccessResponse( request.getRequest().getId(), blockResultFactory.payloadTransactionCompleteV2(blockWithReceipts)); - } else { - return new JsonRpcSuccessResponse( - request.getRequest().getId(), - blockResultFactory.payloadTransactionCompleteV3(blockWithReceipts)); } + return new JsonRpcSuccessResponse( + request.getRequest().getId(), + blockResultFactory.payloadTransactionCompleteV1(blockWithReceipts.getBlock())); + } catch (ClassCastException e) { LOG.error("configuration error, can't call V3 endpoint with non-default protocol schedule"); return new JsonRpcErrorResponse(request.getRequest().getId(), JsonRpcError.INTERNAL_ERROR); diff --git a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/AbstractEngineGetPayloadTest.java b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/AbstractEngineGetPayloadTest.java index cbfb3b1f45d..056fae6fe78 100644 --- a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/AbstractEngineGetPayloadTest.java +++ b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/AbstractEngineGetPayloadTest.java @@ -121,7 +121,7 @@ public void before() { when(mergeContext.retrieveBlockById(mockPid)).thenReturn(Optional.of(mockBlockWithReceipts)); when(protocolContext.safeConsensusContext(Mockito.any())).thenReturn(Optional.of(mergeContext)); when(protocolSchedule.hardforkFor(any())) - .thenReturn(new ScheduledProtocolSpec.Hardfork("shanghai", SHANGHAI_AT)); + .thenReturn(Optional.of(new ScheduledProtocolSpec.Hardfork("shanghai", SHANGHAI_AT))); this.method = methodFactory.create( vertx, diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/DefaultProtocolSchedule.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/DefaultProtocolSchedule.java index 910de0f6494..17b9a7a64eb 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/DefaultProtocolSchedule.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/DefaultProtocolSchedule.java @@ -122,15 +122,12 @@ public boolean anyMatch(final Predicate predicate) { } @Override - public ScheduledProtocolSpec.Hardfork hardforkFor( + public Optional hardforkFor( final Predicate predicate) { - ScheduledProtocolSpec spec = - this.protocolSpecs.stream() - .filter(predicate) - .findFirst() - .orElseThrow( - () -> new IllegalStateException("No hardfork found for predicate " + predicate)); - return spec.fork(); + return this.protocolSpecs.stream() + .filter(predicate) + .findFirst() + .map(ScheduledProtocolSpec::fork); } @Override diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/ProtocolSchedule.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/ProtocolSchedule.java index 5575d2111c6..a249a6b5285 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/ProtocolSchedule.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/ProtocolSchedule.java @@ -47,7 +47,7 @@ default ProtocolSpec getForNextBlockHeader( void putTimestampMilestone(final long timestamp, final ProtocolSpec protocolSpec); - default ScheduledProtocolSpec.Hardfork hardforkFor( + default Optional hardforkFor( final Predicate predicate) { throw new UnsupportedOperationException("Not implemented"); } diff --git a/ethereum/retesteth/src/main/java/org/hyperledger/besu/ethereum/retesteth/NoRewardProtocolScheduleWrapper.java b/ethereum/retesteth/src/main/java/org/hyperledger/besu/ethereum/retesteth/NoRewardProtocolScheduleWrapper.java index 099be6df4e4..ef42b25102a 100644 --- a/ethereum/retesteth/src/main/java/org/hyperledger/besu/ethereum/retesteth/NoRewardProtocolScheduleWrapper.java +++ b/ethereum/retesteth/src/main/java/org/hyperledger/besu/ethereum/retesteth/NoRewardProtocolScheduleWrapper.java @@ -115,7 +115,7 @@ public void putTimestampMilestone(final long timestamp, final ProtocolSpec proto } @Override - public ScheduledProtocolSpec.Hardfork hardforkFor( + public Optional hardforkFor( final Predicate predicate) { return delegate.hardforkFor(predicate); }