From 3e54a1190b134c647404682ea51457fcbc420002 Mon Sep 17 00:00:00 2001 From: garyschulte Date: Wed, 27 Jul 2022 17:25:04 -0700 Subject: [PATCH 1/7] initial impl of engine-api override: * remove reliance on isMergeEnabled in pre-merge block header validation rules * create a merge-specific block header validtion stack rather than leveraging mainnet * re-add --engine-api-enabled cli param Signed-off-by: garyschulte --- .../org/hyperledger/besu/cli/BesuCommand.java | 19 ++++--- .../merge/MergeProtocolSchedule.java | 6 ++- .../merge/MergeValidationRulesetFactory.java | 54 +++++++++---------- .../blockcreation/AbstractBlockCreator.java | 6 +-- .../blockcreation/PoWMinerExecutor.java | 3 +- .../mainnet/MainnetBlockHeaderValidator.java | 4 +- .../CalculatedDifficultyValidationRule.java | 5 +- .../ProofOfWorkValidationRule.java | 7 --- .../TimestampMoreRecentThanParent.java | 4 -- 9 files changed, 46 insertions(+), 62 deletions(-) diff --git a/besu/src/main/java/org/hyperledger/besu/cli/BesuCommand.java b/besu/src/main/java/org/hyperledger/besu/cli/BesuCommand.java index 0d9097a0f11..fee8760e9ea 100644 --- a/besu/src/main/java/org/hyperledger/besu/cli/BesuCommand.java +++ b/besu/src/main/java/org/hyperledger/besu/cli/BesuCommand.java @@ -568,9 +568,9 @@ static class GraphQlOptionGroup { static class EngineRPCOptionGroup { @Option( names = {"--engine-rpc-enabled"}, - description = "deprectaed parameter, do not use.", - hidden = true) - private final Boolean deprecatedIsEngineRpcEnabled = false; + description = + "enable the engine api, even in the absence of merge-specific configurations.") + private final Boolean overrideEngineRpcEnabled = false; @Option( names = {"--engine-rpc-port", "--engine-rpc-http-port"}, @@ -2129,12 +2129,7 @@ private JsonRpcConfiguration createEngineJsonRpcConfiguration( final Integer listenPort, final List allowCallsFrom) { JsonRpcConfiguration engineConfig = jsonRpcConfiguration(listenPort, Arrays.asList("ENGINE", "ETH"), allowCallsFrom); - if (engineRPCOptionGroup.deprecatedIsEngineRpcEnabled) { - logger.warn( - "--engine-api-enabled parameter has been deprecated and will be removed in a future release. " - + "Merge support is implicitly enabled by the presence of terminalTotalDifficulty in the genesis config."); - } - engineConfig.setEnabled(isMergeEnabled()); + engineConfig.setEnabled(isEngineApiEnabled()); if (!engineRPCOptionGroup.isEngineAuthDisabled) { engineConfig.setAuthenticationEnabled(true); engineConfig.setAuthenticationAlgorithm(JwtAlgorithm.HS256); @@ -3098,7 +3093,7 @@ private List getEffectivePorts() { effectivePorts, jsonRPCWebsocketOptionGroup.rpcWsPort, jsonRPCWebsocketOptionGroup.isRpcWsEnabled); - addPortIfEnabled(effectivePorts, engineRPCOptionGroup.engineRpcPort, isMergeEnabled()); + addPortIfEnabled(effectivePorts, engineRPCOptionGroup.engineRpcPort, isEngineApiEnabled()); addPortIfEnabled( effectivePorts, metricsOptionGroup.metricsPort, metricsOptionGroup.isMetricsEnabled); addPortIfEnabled( @@ -3222,6 +3217,10 @@ private boolean isMergeEnabled() { return MergeConfigOptions.isMergeEnabled(); } + private boolean isEngineApiEnabled() { + return engineRPCOptionGroup.overrideEngineRpcEnabled || isMergeEnabled(); + } + public static List getJDKEnabledCypherSuites() { try { SSLContext context = SSLContext.getInstance("TLS"); diff --git a/consensus/merge/src/main/java/org/hyperledger/besu/consensus/merge/MergeProtocolSchedule.java b/consensus/merge/src/main/java/org/hyperledger/besu/consensus/merge/MergeProtocolSchedule.java index 01133d841db..70e5cb24fd4 100644 --- a/consensus/merge/src/main/java/org/hyperledger/besu/consensus/merge/MergeProtocolSchedule.java +++ b/consensus/merge/src/main/java/org/hyperledger/besu/consensus/merge/MergeProtocolSchedule.java @@ -22,6 +22,7 @@ import org.hyperledger.besu.ethereum.mainnet.ProtocolScheduleBuilder; import org.hyperledger.besu.ethereum.mainnet.ProtocolSpecAdapters; import org.hyperledger.besu.ethereum.mainnet.ProtocolSpecBuilder; +import org.hyperledger.besu.ethereum.mainnet.feemarket.BaseFeeMarket; import org.hyperledger.besu.ethereum.mainnet.feemarket.FeeMarket; import org.hyperledger.besu.evm.MainnetEVMs; import org.hyperledger.besu.evm.internal.EvmConfiguration; @@ -74,6 +75,9 @@ private static ProtocolSpecBuilder applyMergeSpecificModifications( } private static BlockHeaderValidator.Builder getBlockHeaderValidator(final FeeMarket feeMarket) { - return MergeValidationRulesetFactory.mergeBlockHeaderValidator(feeMarket); + if (!feeMarket.implementsBaseFee()) { + throw new RuntimeException("Invalid configuration: missing BaseFeeMarket for merge net"); + } + return MergeValidationRulesetFactory.mergeBlockHeaderValidator((BaseFeeMarket) feeMarket); } } diff --git a/consensus/merge/src/main/java/org/hyperledger/besu/consensus/merge/MergeValidationRulesetFactory.java b/consensus/merge/src/main/java/org/hyperledger/besu/consensus/merge/MergeValidationRulesetFactory.java index 1c26bdcd50d..9afe2e00584 100644 --- a/consensus/merge/src/main/java/org/hyperledger/besu/consensus/merge/MergeValidationRulesetFactory.java +++ b/consensus/merge/src/main/java/org/hyperledger/besu/consensus/merge/MergeValidationRulesetFactory.java @@ -14,25 +14,28 @@ */ package org.hyperledger.besu.consensus.merge; +import static org.hyperledger.besu.ethereum.mainnet.MainnetBlockHeaderValidator.MIN_GAS_LIMIT; +import static org.hyperledger.besu.ethereum.mainnet.MainnetBlockHeaderValidator.TIMESTAMP_TOLERANCE_S; + import org.hyperledger.besu.consensus.merge.headervalidationrules.ConstantOmmersHashRule; import org.hyperledger.besu.consensus.merge.headervalidationrules.IncrementalTimestampRule; import org.hyperledger.besu.consensus.merge.headervalidationrules.MergeUnfinalizedValidationRule; import org.hyperledger.besu.consensus.merge.headervalidationrules.NoDifficultyRule; import org.hyperledger.besu.consensus.merge.headervalidationrules.NoNonceRule; +import org.hyperledger.besu.ethereum.core.BlockHeader; import org.hyperledger.besu.ethereum.mainnet.BlockHeaderValidator; -import org.hyperledger.besu.ethereum.mainnet.EpochCalculator; -import org.hyperledger.besu.ethereum.mainnet.MainnetBlockHeaderValidator; -import org.hyperledger.besu.ethereum.mainnet.PoWHasher; import org.hyperledger.besu.ethereum.mainnet.feemarket.BaseFeeMarket; -import org.hyperledger.besu.ethereum.mainnet.feemarket.FeeMarket; +import org.hyperledger.besu.ethereum.mainnet.headervalidationrules.AncestryValidationRule; +import org.hyperledger.besu.ethereum.mainnet.headervalidationrules.BaseFeeMarketBlockHeaderGasPriceValidationRule; +import org.hyperledger.besu.ethereum.mainnet.headervalidationrules.ExtraDataMaxLengthValidationRule; +import org.hyperledger.besu.ethereum.mainnet.headervalidationrules.GasLimitRangeAndDeltaValidationRule; +import org.hyperledger.besu.ethereum.mainnet.headervalidationrules.GasUsageValidationRule; +import org.hyperledger.besu.ethereum.mainnet.headervalidationrules.TimestampBoundedByFutureParameter; import java.util.Optional; public class MergeValidationRulesetFactory { - private static final EpochCalculator preMergeCalculator = - new EpochCalculator.DefaultEpochCalculator(); - /** * Creates a set of rules which when executed will determine if a given block header is valid with * respect to its parent (or chain). @@ -40,28 +43,25 @@ public class MergeValidationRulesetFactory { *

Specifically the set of rules provided by this function are to be used for a Mainnet Merge * chain. * - * @param feeMarket the applicable {@link FeeMarket}, either PGA or BaseFee. + * @param baseFeeMarket the applicable {@link BaseFeeMarket} * @return the header validator. */ - public static BlockHeaderValidator.Builder mergeBlockHeaderValidator(final FeeMarket feeMarket) { + public static BlockHeaderValidator.Builder mergeBlockHeaderValidator( + final BaseFeeMarket baseFeeMarket) { - if (!feeMarket.implementsBaseFee()) { - return MainnetBlockHeaderValidator.createPgaBlockHeaderValidator( - preMergeCalculator, PoWHasher.ETHASH_LIGHT); - } else { - return MainnetBlockHeaderValidator.createBaseFeeMarketValidator( - Optional.of(feeMarket) - .filter(FeeMarket::implementsBaseFee) - .map(BaseFeeMarket.class::cast) - .orElseThrow( - () -> - new RuntimeException( - "Invalid configuration: missing BaseFeeMarket for merge net"))) - .addRule(new MergeUnfinalizedValidationRule()) - .addRule(new ConstantOmmersHashRule()) - .addRule(new NoNonceRule()) - .addRule(new NoDifficultyRule()) - .addRule(new IncrementalTimestampRule()); - } + return new BlockHeaderValidator.Builder() + .addRule(new AncestryValidationRule()) + .addRule(new GasUsageValidationRule()) + .addRule( + new GasLimitRangeAndDeltaValidationRule( + MIN_GAS_LIMIT, Long.MAX_VALUE, Optional.of(baseFeeMarket))) + .addRule(new TimestampBoundedByFutureParameter(TIMESTAMP_TOLERANCE_S)) + .addRule(new ExtraDataMaxLengthValidationRule(BlockHeader.MAX_EXTRA_DATA_BYTES)) + .addRule((new BaseFeeMarketBlockHeaderGasPriceValidationRule(baseFeeMarket))) + .addRule(new MergeUnfinalizedValidationRule()) + .addRule(new ConstantOmmersHashRule()) + .addRule(new NoNonceRule()) + .addRule(new NoDifficultyRule()) + .addRule(new IncrementalTimestampRule()); } } diff --git a/ethereum/blockcreation/src/main/java/org/hyperledger/besu/ethereum/blockcreation/AbstractBlockCreator.java b/ethereum/blockcreation/src/main/java/org/hyperledger/besu/ethereum/blockcreation/AbstractBlockCreator.java index a5d4eae0942..333191667eb 100644 --- a/ethereum/blockcreation/src/main/java/org/hyperledger/besu/ethereum/blockcreation/AbstractBlockCreator.java +++ b/ethereum/blockcreation/src/main/java/org/hyperledger/besu/ethereum/blockcreation/AbstractBlockCreator.java @@ -14,7 +14,6 @@ */ package org.hyperledger.besu.ethereum.blockcreation; -import org.hyperledger.besu.config.MergeConfigOptions; import org.hyperledger.besu.datatypes.Address; import org.hyperledger.besu.datatypes.Hash; import org.hyperledger.besu.datatypes.Wei; @@ -44,7 +43,6 @@ import org.hyperledger.besu.plugin.services.securitymodule.SecurityModuleException; import java.math.BigInteger; -import java.util.Collections; import java.util.List; import java.util.Optional; import java.util.concurrent.CancellationException; @@ -191,9 +189,7 @@ protected Block createBlock( final SealableBlockHeader sealableBlockHeader = BlockHeaderBuilder.create() .populateFrom(processableBlockHeader) - .ommersHash( - BodyValidation.ommersHash( - MergeConfigOptions.isMergeEnabled() ? Collections.emptyList() : ommers)) + .ommersHash(BodyValidation.ommersHash(ommers)) .stateRoot(disposableWorldState.rootHash()) .transactionsRoot( BodyValidation.transactionsRoot(transactionResults.getTransactions())) diff --git a/ethereum/blockcreation/src/main/java/org/hyperledger/besu/ethereum/blockcreation/PoWMinerExecutor.java b/ethereum/blockcreation/src/main/java/org/hyperledger/besu/ethereum/blockcreation/PoWMinerExecutor.java index c570a434cff..5750b2c6672 100644 --- a/ethereum/blockcreation/src/main/java/org/hyperledger/besu/ethereum/blockcreation/PoWMinerExecutor.java +++ b/ethereum/blockcreation/src/main/java/org/hyperledger/besu/ethereum/blockcreation/PoWMinerExecutor.java @@ -14,7 +14,6 @@ */ package org.hyperledger.besu.ethereum.blockcreation; -import org.hyperledger.besu.config.MergeConfigOptions; import org.hyperledger.besu.datatypes.Address; import org.hyperledger.besu.ethereum.ProtocolContext; import org.hyperledger.besu.ethereum.chain.MinedBlockObserver; @@ -85,7 +84,7 @@ public PoWBlockMiner createMiner( final Function blockCreator = (header) -> new PoWBlockCreator( - coinbase.orElseGet(() -> MergeConfigOptions.isMergeEnabled() ? Address.ZERO : null), + coinbase.orElse(Address.ZERO), () -> targetGasLimit.map(AtomicLong::longValue), parent -> extraData, pendingTransactions, diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/MainnetBlockHeaderValidator.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/MainnetBlockHeaderValidator.java index 2c3a054aea0..84b9357d317 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/MainnetBlockHeaderValidator.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/MainnetBlockHeaderValidator.java @@ -34,8 +34,8 @@ public final class MainnetBlockHeaderValidator { public static final Bytes DAO_EXTRA_DATA = Bytes.fromHexString("0x64616f2d686172642d666f726b"); - private static final int MIN_GAS_LIMIT = 5000; - private static final long MAX_GAS_LIMIT = 0x7fffffffffffffffL; + public static final int MIN_GAS_LIMIT = 5000; + public static final long MAX_GAS_LIMIT = 0x7fffffffffffffffL; public static final int TIMESTAMP_TOLERANCE_S = 15; public static final int MINIMUM_SECONDS_SINCE_PARENT = 1; public static final Bytes CLASSIC_FORK_BLOCK_HEADER = diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/headervalidationrules/CalculatedDifficultyValidationRule.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/headervalidationrules/CalculatedDifficultyValidationRule.java index 2bffde67cc5..bcc4e213586 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/headervalidationrules/CalculatedDifficultyValidationRule.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/headervalidationrules/CalculatedDifficultyValidationRule.java @@ -14,7 +14,6 @@ */ package org.hyperledger.besu.ethereum.mainnet.headervalidationrules; -import org.hyperledger.besu.config.MergeConfigOptions; import org.hyperledger.besu.ethereum.ProtocolContext; import org.hyperledger.besu.ethereum.core.BlockHeader; import org.hyperledger.besu.ethereum.mainnet.AttachedBlockHeaderValidationRule; @@ -37,9 +36,7 @@ public CalculatedDifficultyValidationRule(final DifficultyCalculator difficultyC @Override public boolean validate( final BlockHeader header, final BlockHeader parent, final ProtocolContext context) { - if (MergeConfigOptions.isMergeEnabled()) { - return true; - } + final BigInteger actualDifficulty = new BigInteger(1, header.getDifficulty().toArray()); final BigInteger expectedDifficulty = difficultyCalculator.nextDifficulty(header.getTimestamp(), parent, context); diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/headervalidationrules/ProofOfWorkValidationRule.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/headervalidationrules/ProofOfWorkValidationRule.java index 2c98f311b24..6f1612f1c89 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/headervalidationrules/ProofOfWorkValidationRule.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/headervalidationrules/ProofOfWorkValidationRule.java @@ -16,7 +16,6 @@ import static java.lang.Boolean.FALSE; -import org.hyperledger.besu.config.MergeConfigOptions; import org.hyperledger.besu.datatypes.Hash; import org.hyperledger.besu.ethereum.core.BlockHeader; import org.hyperledger.besu.ethereum.mainnet.DetachedBlockHeaderValidationRule; @@ -70,12 +69,6 @@ public boolean validate(final BlockHeader header, final BlockHeader parent) { return false; } - // TODO: remove this rule bypass, use post-merge headervalidation rules - // https://github.com/hyperledger/besu/issues/2898 - if (MergeConfigOptions.isMergeEnabled()) { - return true; - } - final Hash headerHash = hashHeader(header); PoWSolution solution = hasher.hash(header.getNonce(), header.getNumber(), epochCalculator, headerHash); diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/headervalidationrules/TimestampMoreRecentThanParent.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/headervalidationrules/TimestampMoreRecentThanParent.java index 2af6d23d87b..6aa7e5479ef 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/headervalidationrules/TimestampMoreRecentThanParent.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/headervalidationrules/TimestampMoreRecentThanParent.java @@ -16,7 +16,6 @@ import static com.google.common.base.Preconditions.checkArgument; -import org.hyperledger.besu.config.MergeConfigOptions; import org.hyperledger.besu.ethereum.core.BlockHeader; import org.hyperledger.besu.ethereum.mainnet.DetachedBlockHeaderValidationRule; @@ -36,9 +35,6 @@ public TimestampMoreRecentThanParent(final long minimumSecondsSinceParent) { @Override public boolean validate(final BlockHeader header, final BlockHeader parent) { - if (MergeConfigOptions.isMergeEnabled()) { - return true; - } return validateTimestamp(header.getTimestamp(), parent.getTimestamp()); } From c0faff1791334383fb92576e87ff9e99a3ff9a72 Mon Sep 17 00:00:00 2001 From: garyschulte Date: Wed, 27 Jul 2022 21:34:56 -0700 Subject: [PATCH 2/7] revert/re-add non-basefee mergeprotocolschedule Signed-off-by: garyschulte --- .../merge/MergeProtocolSchedule.java | 6 +-- .../merge/MergeValidationRulesetFactory.java | 47 ++++++++++++------- 2 files changed, 31 insertions(+), 22 deletions(-) diff --git a/consensus/merge/src/main/java/org/hyperledger/besu/consensus/merge/MergeProtocolSchedule.java b/consensus/merge/src/main/java/org/hyperledger/besu/consensus/merge/MergeProtocolSchedule.java index 70e5cb24fd4..01133d841db 100644 --- a/consensus/merge/src/main/java/org/hyperledger/besu/consensus/merge/MergeProtocolSchedule.java +++ b/consensus/merge/src/main/java/org/hyperledger/besu/consensus/merge/MergeProtocolSchedule.java @@ -22,7 +22,6 @@ import org.hyperledger.besu.ethereum.mainnet.ProtocolScheduleBuilder; import org.hyperledger.besu.ethereum.mainnet.ProtocolSpecAdapters; import org.hyperledger.besu.ethereum.mainnet.ProtocolSpecBuilder; -import org.hyperledger.besu.ethereum.mainnet.feemarket.BaseFeeMarket; import org.hyperledger.besu.ethereum.mainnet.feemarket.FeeMarket; import org.hyperledger.besu.evm.MainnetEVMs; import org.hyperledger.besu.evm.internal.EvmConfiguration; @@ -75,9 +74,6 @@ private static ProtocolSpecBuilder applyMergeSpecificModifications( } private static BlockHeaderValidator.Builder getBlockHeaderValidator(final FeeMarket feeMarket) { - if (!feeMarket.implementsBaseFee()) { - throw new RuntimeException("Invalid configuration: missing BaseFeeMarket for merge net"); - } - return MergeValidationRulesetFactory.mergeBlockHeaderValidator((BaseFeeMarket) feeMarket); + return MergeValidationRulesetFactory.mergeBlockHeaderValidator(feeMarket); } } diff --git a/consensus/merge/src/main/java/org/hyperledger/besu/consensus/merge/MergeValidationRulesetFactory.java b/consensus/merge/src/main/java/org/hyperledger/besu/consensus/merge/MergeValidationRulesetFactory.java index 9afe2e00584..e5f4f6b82f4 100644 --- a/consensus/merge/src/main/java/org/hyperledger/besu/consensus/merge/MergeValidationRulesetFactory.java +++ b/consensus/merge/src/main/java/org/hyperledger/besu/consensus/merge/MergeValidationRulesetFactory.java @@ -24,7 +24,11 @@ import org.hyperledger.besu.consensus.merge.headervalidationrules.NoNonceRule; import org.hyperledger.besu.ethereum.core.BlockHeader; import org.hyperledger.besu.ethereum.mainnet.BlockHeaderValidator; +import org.hyperledger.besu.ethereum.mainnet.EpochCalculator; +import org.hyperledger.besu.ethereum.mainnet.MainnetBlockHeaderValidator; +import org.hyperledger.besu.ethereum.mainnet.PoWHasher; import org.hyperledger.besu.ethereum.mainnet.feemarket.BaseFeeMarket; +import org.hyperledger.besu.ethereum.mainnet.feemarket.FeeMarket; import org.hyperledger.besu.ethereum.mainnet.headervalidationrules.AncestryValidationRule; import org.hyperledger.besu.ethereum.mainnet.headervalidationrules.BaseFeeMarketBlockHeaderGasPriceValidationRule; import org.hyperledger.besu.ethereum.mainnet.headervalidationrules.ExtraDataMaxLengthValidationRule; @@ -36,6 +40,9 @@ public class MergeValidationRulesetFactory { + private static final EpochCalculator preMergeCalculator = + new EpochCalculator.DefaultEpochCalculator(); + /** * Creates a set of rules which when executed will determine if a given block header is valid with * respect to its parent (or chain). @@ -43,25 +50,31 @@ public class MergeValidationRulesetFactory { *

Specifically the set of rules provided by this function are to be used for a Mainnet Merge * chain. * - * @param baseFeeMarket the applicable {@link BaseFeeMarket} + * @param feeMarket the applicable {@link FeeMarket} * @return the header validator. */ - public static BlockHeaderValidator.Builder mergeBlockHeaderValidator( - final BaseFeeMarket baseFeeMarket) { + public static BlockHeaderValidator.Builder mergeBlockHeaderValidator(final FeeMarket feeMarket) { + + if (!feeMarket.implementsBaseFee()) { + return MainnetBlockHeaderValidator.createPgaBlockHeaderValidator( + preMergeCalculator, PoWHasher.ETHASH_LIGHT); + } else { + var baseFeeMarket = (BaseFeeMarket) feeMarket; - return new BlockHeaderValidator.Builder() - .addRule(new AncestryValidationRule()) - .addRule(new GasUsageValidationRule()) - .addRule( - new GasLimitRangeAndDeltaValidationRule( - MIN_GAS_LIMIT, Long.MAX_VALUE, Optional.of(baseFeeMarket))) - .addRule(new TimestampBoundedByFutureParameter(TIMESTAMP_TOLERANCE_S)) - .addRule(new ExtraDataMaxLengthValidationRule(BlockHeader.MAX_EXTRA_DATA_BYTES)) - .addRule((new BaseFeeMarketBlockHeaderGasPriceValidationRule(baseFeeMarket))) - .addRule(new MergeUnfinalizedValidationRule()) - .addRule(new ConstantOmmersHashRule()) - .addRule(new NoNonceRule()) - .addRule(new NoDifficultyRule()) - .addRule(new IncrementalTimestampRule()); + return new BlockHeaderValidator.Builder() + .addRule(new AncestryValidationRule()) + .addRule(new GasUsageValidationRule()) + .addRule( + new GasLimitRangeAndDeltaValidationRule( + MIN_GAS_LIMIT, Long.MAX_VALUE, Optional.of(baseFeeMarket))) + .addRule(new TimestampBoundedByFutureParameter(TIMESTAMP_TOLERANCE_S)) + .addRule(new ExtraDataMaxLengthValidationRule(BlockHeader.MAX_EXTRA_DATA_BYTES)) + .addRule((new BaseFeeMarketBlockHeaderGasPriceValidationRule(baseFeeMarket))) + .addRule(new MergeUnfinalizedValidationRule()) + .addRule(new ConstantOmmersHashRule()) + .addRule(new NoNonceRule()) + .addRule(new NoDifficultyRule()) + .addRule(new IncrementalTimestampRule()); + } } } From 75fe29d7df3aa1b72dafe2410a51925b53362bb2 Mon Sep 17 00:00:00 2001 From: garyschulte Date: Wed, 27 Jul 2022 22:19:13 -0700 Subject: [PATCH 3/7] fix toml config unit test Signed-off-by: garyschulte --- besu/src/test/resources/everything_config.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/besu/src/test/resources/everything_config.toml b/besu/src/test/resources/everything_config.toml index be722a507ba..0855f14605c 100644 --- a/besu/src/test/resources/everything_config.toml +++ b/besu/src/test/resources/everything_config.toml @@ -44,6 +44,7 @@ random-peer-priority-enabled=false host-whitelist=["all"] host-allowlist=["all"] engine-host-allowlist=["all"] +engine-rpc-enabled=true engine-jwt-disabled=true engine-jwt-secret="/tmp/jwt.hex" required-blocks=["8675309=123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"] From 44b48f39ca70eec2b886a49653697c7eb6e384fa Mon Sep 17 00:00:00 2001 From: garyschulte Date: Thu, 28 Jul 2022 13:49:57 -0700 Subject: [PATCH 4/7] make engine api usable without a merge config. leaves the door open to supporting the engine api with other MiningCoordinators, but disables all but engine_exchangeTransitionConfiguration in the absence of mergeCoordinator Signed-off-by: garyschulte --- .../org/hyperledger/besu/RunnerBuilder.java | 2 +- .../org/hyperledger/besu/cli/BesuCommand.java | 8 ++++--- .../blockcreation/MergeMiningCoordinator.java | 5 ++++ .../methods/ExecutionEngineJsonRpcMethod.java | 5 ++-- ...EngineExchangeTransitionConfiguration.java | 10 ++++++-- .../engine/EngineForkchoiceUpdated.java | 8 ++++--- .../methods/engine/EngineGetPayload.java | 2 +- .../methods/engine/EngineNewPayload.java | 4 ++-- .../ExecutionEngineJsonRpcMethods.java | 23 +++++++++++++------ .../methods/JsonRpcMethodsFactory.java | 7 +----- ...neExchangeTransitionConfigurationTest.java | 16 +++++++++++++ .../blockcreation/MiningCoordinator.java | 4 ++++ .../besu/ethereum/ProtocolContext.java | 8 +++++++ 13 files changed, 75 insertions(+), 27 deletions(-) diff --git a/besu/src/main/java/org/hyperledger/besu/RunnerBuilder.java b/besu/src/main/java/org/hyperledger/besu/RunnerBuilder.java index a21408a80d1..d8b1a38fc20 100644 --- a/besu/src/main/java/org/hyperledger/besu/RunnerBuilder.java +++ b/besu/src/main/java/org/hyperledger/besu/RunnerBuilder.java @@ -305,7 +305,7 @@ public RunnerBuilder jsonRpcConfiguration(final JsonRpcConfiguration jsonRpcConf public RunnerBuilder engineJsonRpcConfiguration( final JsonRpcConfiguration engineJsonRpcConfiguration) { - this.engineJsonRpcConfiguration = Optional.of(engineJsonRpcConfiguration); + this.engineJsonRpcConfiguration = Optional.ofNullable(engineJsonRpcConfiguration); return this; } diff --git a/besu/src/main/java/org/hyperledger/besu/cli/BesuCommand.java b/besu/src/main/java/org/hyperledger/besu/cli/BesuCommand.java index fee8760e9ea..9bada97133d 100644 --- a/besu/src/main/java/org/hyperledger/besu/cli/BesuCommand.java +++ b/besu/src/main/java/org/hyperledger/besu/cli/BesuCommand.java @@ -1933,9 +1933,11 @@ private void configure() throws Exception { jsonRpcConfiguration = jsonRpcConfiguration( jsonRPCHttpOptionGroup.rpcHttpPort, jsonRPCHttpOptionGroup.rpcHttpApis, hostsAllowlist); - engineJsonRpcConfiguration = - createEngineJsonRpcConfiguration( - engineRPCOptionGroup.engineRpcPort, engineRPCOptionGroup.engineHostsAllowlist); + if (isEngineApiEnabled()) { + engineJsonRpcConfiguration = + createEngineJsonRpcConfiguration( + engineRPCOptionGroup.engineRpcPort, engineRPCOptionGroup.engineHostsAllowlist); + } p2pTLSConfiguration = p2pTLSConfigOptions.p2pTLSConfiguration(commandLine); graphQLConfiguration = graphQLConfiguration(); webSocketConfiguration = diff --git a/consensus/merge/src/main/java/org/hyperledger/besu/consensus/merge/blockcreation/MergeMiningCoordinator.java b/consensus/merge/src/main/java/org/hyperledger/besu/consensus/merge/blockcreation/MergeMiningCoordinator.java index b5f616520a7..d83d16eb2c3 100644 --- a/consensus/merge/src/main/java/org/hyperledger/besu/consensus/merge/blockcreation/MergeMiningCoordinator.java +++ b/consensus/merge/src/main/java/org/hyperledger/besu/consensus/merge/blockcreation/MergeMiningCoordinator.java @@ -36,6 +36,11 @@ PayloadIdentifier preparePayload( final Bytes32 random, final Address feeRecipient); + @Override + default boolean isCompatibleWithEngineApi() { + return true; + } + Result rememberBlock(final Block block); Result validateBlock(final Block block); diff --git a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/ExecutionEngineJsonRpcMethod.java b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/ExecutionEngineJsonRpcMethod.java index 0e031cae3c7..65d4a4c4ee9 100644 --- a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/ExecutionEngineJsonRpcMethod.java +++ b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/ExecutionEngineJsonRpcMethod.java @@ -21,6 +21,7 @@ import org.hyperledger.besu.ethereum.api.jsonrpc.internal.response.JsonRpcErrorResponse; import org.hyperledger.besu.ethereum.api.jsonrpc.internal.response.JsonRpcResponse; +import java.util.Optional; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; @@ -40,13 +41,13 @@ public enum EngineStatus { public static final long ENGINE_API_LOGGING_THRESHOLD = 60000L; private final Vertx syncVertx; private static final Logger LOG = LoggerFactory.getLogger(ExecutionEngineJsonRpcMethod.class); - protected final MergeContext mergeContext; + protected final Optional mergeContext; protected final ProtocolContext protocolContext; protected ExecutionEngineJsonRpcMethod(final Vertx vertx, final ProtocolContext protocolContext) { this.syncVertx = vertx; this.protocolContext = protocolContext; - this.mergeContext = protocolContext.getConsensusContext(MergeContext.class); + this.mergeContext = protocolContext.safeConsensusContext(MergeContext.class); } @Override diff --git a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineExchangeTransitionConfiguration.java b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineExchangeTransitionConfiguration.java index 62118a0b862..20649fcc59c 100644 --- a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineExchangeTransitionConfiguration.java +++ b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineExchangeTransitionConfiguration.java @@ -27,11 +27,13 @@ import org.hyperledger.besu.ethereum.api.jsonrpc.internal.response.JsonRpcSuccessResponse; import org.hyperledger.besu.ethereum.api.jsonrpc.internal.results.EngineExchangeTransitionConfigurationResult; import org.hyperledger.besu.ethereum.core.BlockHeader; +import org.hyperledger.besu.ethereum.core.Difficulty; import java.util.Optional; import io.vertx.core.Vertx; import io.vertx.core.json.Json; +import org.apache.tuweni.units.bigints.UInt256; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -39,6 +41,9 @@ public class EngineExchangeTransitionConfiguration extends ExecutionEngineJsonRp private static final Logger LOG = LoggerFactory.getLogger(EngineExchangeTransitionConfiguration.class); + // use (2^256 - 2^10) if engine is enabled in the absence of a TTD configuration + static final Difficulty FALLBACK_TTD_DEFAULT = + Difficulty.MAX_VALUE.subtract(UInt256.valueOf(1024L)); static final long QOS_TIMEOUT_MILLIS = 120000L; private final QosTimer qosTimer; @@ -76,11 +81,12 @@ public JsonRpcResponse syncResponse(final JsonRpcRequestContext requestContext) "received transitionConfiguration: {}", () -> Json.encodePrettily(remoteTransitionConfiguration)); - final Optional maybeTerminalPoWBlockHeader = mergeContext.getTerminalPoWBlock(); + final Optional maybeTerminalPoWBlockHeader = + mergeContext.flatMap(c -> c.getTerminalPoWBlock()); final EngineExchangeTransitionConfigurationResult localTransitionConfiguration = new EngineExchangeTransitionConfigurationResult( - mergeContext.getTerminalTotalDifficulty(), + mergeContext.map(c -> c.getTerminalTotalDifficulty()).orElse(FALLBACK_TTD_DEFAULT), maybeTerminalPoWBlockHeader.map(BlockHeader::getHash).orElse(Hash.ZERO), maybeTerminalPoWBlockHeader.map(BlockHeader::getNumber).orElse(0L)); diff --git a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineForkchoiceUpdated.java b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineForkchoiceUpdated.java index bd8c7f70a15..93ebd4a6367 100644 --- a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineForkchoiceUpdated.java +++ b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineForkchoiceUpdated.java @@ -73,10 +73,12 @@ public JsonRpcResponse syncResponse(final JsonRpcRequestContext requestContext) Optional.ofNullable(forkChoice.getFinalizedBlockHash()) .filter(finalized -> !finalized.isZero()); - mergeContext.fireNewUnverifiedForkchoiceMessageEvent( - forkChoice.getHeadBlockHash(), maybeFinalizedHash, forkChoice.getSafeBlockHash()); + mergeContext.ifPresent( + c -> + c.fireNewUnverifiedForkchoiceMessageEvent( + forkChoice.getHeadBlockHash(), maybeFinalizedHash, forkChoice.getSafeBlockHash())); - if (mergeContext.isSyncing()) { + if (mergeContext.map(c -> c.isSyncing()).orElse(Boolean.TRUE)) { return syncingResponse(requestId, forkChoice); } 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 1006ee90941..93c3a398fde 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 @@ -57,7 +57,7 @@ public String getName() { public JsonRpcResponse syncResponse(final JsonRpcRequestContext request) { final PayloadIdentifier payloadId = request.getRequiredParameter(0, PayloadIdentifier.class); - final Optional block = mergeContext.retrieveBlockById(payloadId); + final Optional block = mergeContext.flatMap(c -> c.retrieveBlockById(payloadId)); if (block.isPresent()) { var proposal = block.get(); var proposalHeader = proposal.getHeader(); diff --git a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineNewPayload.java b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineNewPayload.java index 4713239f453..130d8e2150f 100644 --- a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineNewPayload.java +++ b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineNewPayload.java @@ -166,10 +166,10 @@ public JsonRpcResponse syncResponse(final JsonRpcRequestContext requestContext) final var block = new Block(newBlockHeader, new BlockBody(transactions, Collections.emptyList())); - if (mergeContext.isSyncing() || parentHeader.isEmpty()) { + if (mergeContext.map(c -> c.isSyncing()).orElse(Boolean.TRUE) || parentHeader.isEmpty()) { LOG.debug( "isSyncing: {} parentHeaderMissing: {}, adding {} to backwardsync", - mergeContext.isSyncing(), + mergeContext.map(c -> c.isSyncing()).orElse(null), parentHeader.isEmpty(), block.getHash()); mergeCoordinator 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 d18d4e49262..8c81681974e 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 @@ -26,6 +26,7 @@ import org.hyperledger.besu.ethereum.blockcreation.MiningCoordinator; import java.util.Map; +import java.util.Optional; import io.vertx.core.Vertx; import io.vertx.core.VertxOptions; @@ -34,12 +35,16 @@ public class ExecutionEngineJsonRpcMethods extends ApiGroupJsonRpcMethods { private final BlockResultFactory blockResultFactory = new BlockResultFactory(); - private final MergeMiningCoordinator mergeCoordinator; + private final Optional mergeCoordinator; private final ProtocolContext protocolContext; ExecutionEngineJsonRpcMethods( final MiningCoordinator miningCoordinator, final ProtocolContext protocolContext) { - this.mergeCoordinator = (MergeMiningCoordinator) miningCoordinator; + this.mergeCoordinator = + Optional.ofNullable(miningCoordinator) + .filter(mc -> mc.isCompatibleWithEngineApi()) + .map(MergeMiningCoordinator.class::cast); + this.protocolContext = protocolContext; } @@ -51,10 +56,14 @@ protected String getApiGroup() { @Override protected Map create() { Vertx syncVertx = Vertx.vertx(new VertxOptions().setWorkerPoolSize(1)); - return mapOf( - new EngineGetPayload(syncVertx, protocolContext, blockResultFactory), - new EngineNewPayload(syncVertx, protocolContext, mergeCoordinator), - new EngineForkchoiceUpdated(syncVertx, protocolContext, mergeCoordinator), - new EngineExchangeTransitionConfiguration(syncVertx, protocolContext)); + if (mergeCoordinator.isPresent()) { + return mapOf( + new EngineGetPayload(syncVertx, protocolContext, blockResultFactory), + new EngineNewPayload(syncVertx, protocolContext, mergeCoordinator.get()), + new EngineForkchoiceUpdated(syncVertx, protocolContext, mergeCoordinator.get()), + new EngineExchangeTransitionConfiguration(syncVertx, protocolContext)); + } else { + return mapOf(new EngineExchangeTransitionConfiguration(syncVertx, protocolContext)); + } } } diff --git a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/methods/JsonRpcMethodsFactory.java b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/methods/JsonRpcMethodsFactory.java index e71816ab2c8..59bf78ee886 100644 --- a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/methods/JsonRpcMethodsFactory.java +++ b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/methods/JsonRpcMethodsFactory.java @@ -15,7 +15,6 @@ package org.hyperledger.besu.ethereum.api.jsonrpc.methods; import org.hyperledger.besu.config.GenesisConfigOptions; -import org.hyperledger.besu.config.MergeConfigOptions; import org.hyperledger.besu.ethereum.ProtocolContext; import org.hyperledger.besu.ethereum.api.jsonrpc.JsonRpcConfiguration; import org.hyperledger.besu.ethereum.api.jsonrpc.internal.filter.FilterManager; @@ -95,6 +94,7 @@ public Map methods( blockchainQueries, protocolSchedule, metricsSystem, transactionPool, dataDir), new EeaJsonRpcMethods( blockchainQueries, protocolSchedule, transactionPool, privacyParameters), + new ExecutionEngineJsonRpcMethods(miningCoordinator, protocolContext), new GoQuorumJsonRpcPrivacyMethods( blockchainQueries, protocolSchedule, transactionPool, privacyParameters), new EthJsonRpcMethods( @@ -127,11 +127,6 @@ public Map methods( new TxPoolJsonRpcMethods(transactionPool), new PluginsJsonRpcMethods(namedPlugins)); - if (MergeConfigOptions.isMergeEnabled()) { - enabled.putAll( - new ExecutionEngineJsonRpcMethods(miningCoordinator, protocolContext).create(rpcApis)); - } - for (final JsonRpcMethods apiGroup : availableApiGroups) { enabled.putAll(apiGroup.create(rpcApis)); } diff --git a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineExchangeTransitionConfigurationTest.java b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineExchangeTransitionConfigurationTest.java index 04b54ceaaaf..56382968405 100644 --- a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineExchangeTransitionConfigurationTest.java +++ b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineExchangeTransitionConfigurationTest.java @@ -15,6 +15,7 @@ package org.hyperledger.besu.ethereum.api.jsonrpc.internal.methods.engine; import static org.assertj.core.api.Assertions.assertThat; +import static org.hyperledger.besu.ethereum.api.jsonrpc.internal.methods.engine.EngineExchangeTransitionConfiguration.FALLBACK_TTD_DEFAULT; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.times; @@ -114,6 +115,21 @@ public void shouldReturnZerosOnTerminalPoWBlockHeaderEmpty() { assertThat(result.getTerminalBlockNumber()).isEqualTo(0L); } + @Test + public void shouldReturnDefaultOnNoTerminalTotalDifficultyConfigured() { + when(mergeContext.getTerminalPoWBlock()).thenReturn(Optional.empty()); + + var response = + resp( + new EngineExchangeTransitionConfigurationParameter( + "0", Hash.ZERO.toHexString(), new UnsignedLongParameter(0L))); + + var result = fromSuccessResp(response); + assertThat(result.getTerminalTotalDifficulty()).isEqualTo(FALLBACK_TTD_DEFAULT); + assertThat(result.getTerminalBlockHash()).isEqualTo(Hash.ZERO); + assertThat(result.getTerminalBlockNumber()).isEqualTo(0L); + } + @Test public void shouldReturnConfigurationOnConfigurationMisMatch() { final BlockHeader fakeBlockHeader = createBlockHeader(Hash.fromHexStringLenient("0x01"), 42); diff --git a/ethereum/blockcreation/src/main/java/org/hyperledger/besu/ethereum/blockcreation/MiningCoordinator.java b/ethereum/blockcreation/src/main/java/org/hyperledger/besu/ethereum/blockcreation/MiningCoordinator.java index 642ebd8393e..68353f7ae7e 100644 --- a/ethereum/blockcreation/src/main/java/org/hyperledger/besu/ethereum/blockcreation/MiningCoordinator.java +++ b/ethereum/blockcreation/src/main/java/org/hyperledger/besu/ethereum/blockcreation/MiningCoordinator.java @@ -117,4 +117,8 @@ Optional createBlock( default void addEthHashObserver(final PoWObserver observer) {} void changeTargetGasLimit(final Long targetGasLimit); + + default boolean isCompatibleWithEngineApi() { + return false; + } } diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/ProtocolContext.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/ProtocolContext.java index 750c06a1e66..0b115937053 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/ProtocolContext.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/ProtocolContext.java @@ -18,6 +18,8 @@ import org.hyperledger.besu.ethereum.mainnet.ProtocolSchedule; import org.hyperledger.besu.ethereum.worldstate.WorldStateArchive; +import java.util.Optional; + /** * Holds the mutable state used to track the current context of the protocol. This is primarily the * blockchain and world state archive, but can also hold arbitrary context required by a particular @@ -59,4 +61,10 @@ public WorldStateArchive getWorldStateArchive() { public C getConsensusContext(final Class klass) { return consensusContext.as(klass); } + + public Optional safeConsensusContext(final Class klass) { + return Optional.ofNullable(consensusContext) + .filter(c -> klass.isAssignableFrom(c.getClass())) + .map(klass::cast); + } } From 82fc33e862e22f40302b42d1b9ddff2dc8c17199 Mon Sep 17 00:00:00 2001 From: garyschulte Date: Thu, 28 Jul 2022 15:05:11 -0700 Subject: [PATCH 5/7] add engine-rpc-enabled to besucommand test in order to satisfy expectation Signed-off-by: garyschulte --- besu/src/test/java/org/hyperledger/besu/cli/BesuCommandTest.java | 1 + 1 file changed, 1 insertion(+) diff --git a/besu/src/test/java/org/hyperledger/besu/cli/BesuCommandTest.java b/besu/src/test/java/org/hyperledger/besu/cli/BesuCommandTest.java index 7608c2e6be9..3ab6e7bbc7c 100644 --- a/besu/src/test/java/org/hyperledger/besu/cli/BesuCommandTest.java +++ b/besu/src/test/java/org/hyperledger/besu/cli/BesuCommandTest.java @@ -2760,6 +2760,7 @@ public void rpcHttpTlsWarnIfCipherSuitesSpecifiedWithoutTls() { parseCommand( "--rpc-http-enabled", + "--engine-rpc-enabled", "--rpc-http-host", host, "--rpc-http-port", From 922fc18e003ce1d36726db2445da5eca61f3b46e Mon Sep 17 00:00:00 2001 From: garyschulte Date: Thu, 28 Jul 2022 17:11:43 -0700 Subject: [PATCH 6/7] adjust consensusContext mocks Signed-off-by: garyschulte --- .../engine/EngineExchangeTransitionConfigurationTest.java | 1 + .../internal/methods/engine/EngineForkchoiceUpdatedTest.java | 2 +- .../jsonrpc/internal/methods/engine/EngineGetPayloadTest.java | 2 +- .../jsonrpc/internal/methods/engine/EngineNewPayloadTest.java | 2 +- 4 files changed, 4 insertions(+), 3 deletions(-) diff --git a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineExchangeTransitionConfigurationTest.java b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineExchangeTransitionConfigurationTest.java index 56382968405..88a5dc211b4 100644 --- a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineExchangeTransitionConfigurationTest.java +++ b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineExchangeTransitionConfigurationTest.java @@ -71,6 +71,7 @@ public class EngineExchangeTransitionConfigurationTest { @Before public void setUp() { when(protocolContext.getConsensusContext(Mockito.any())).thenReturn(mergeContext); + when(protocolContext.safeConsensusContext(Mockito.any())).thenReturn(Optional.of(mergeContext)); this.method = new EngineExchangeTransitionConfiguration(vertx, protocolContext); } diff --git a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineForkchoiceUpdatedTest.java b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineForkchoiceUpdatedTest.java index b95724218be..233d1fe9a6e 100644 --- a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineForkchoiceUpdatedTest.java +++ b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineForkchoiceUpdatedTest.java @@ -79,7 +79,7 @@ public class EngineForkchoiceUpdatedTest { @Before public void before() { - when(protocolContext.getConsensusContext(Mockito.any())).thenReturn(mergeContext); + when(protocolContext.safeConsensusContext(Mockito.any())).thenReturn(Optional.of(mergeContext)); when(protocolContext.getBlockchain()).thenReturn(blockchain); this.method = new EngineForkchoiceUpdated(vertx, protocolContext, mergeCoordinator); } 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/EngineGetPayloadTest.java index 3c1ee216f46..0cfb2b62153 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/EngineGetPayloadTest.java @@ -66,7 +66,7 @@ public class EngineGetPayloadTest { @Before public void before() { when(mergeContext.retrieveBlockById(mockPid)).thenReturn(Optional.of(mockBlock)); - when(protocolContext.getConsensusContext(Mockito.any())).thenReturn(mergeContext); + when(protocolContext.safeConsensusContext(Mockito.any())).thenReturn(Optional.of(mergeContext)); this.method = new EngineGetPayload(vertx, protocolContext, factory); } diff --git a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineNewPayloadTest.java b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineNewPayloadTest.java index c98a42e5187..74d48c62d29 100644 --- a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineNewPayloadTest.java +++ b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineNewPayloadTest.java @@ -79,7 +79,7 @@ public class EngineNewPayloadTest { @Before public void before() { - when(protocolContext.getConsensusContext(Mockito.any())).thenReturn(mergeContext); + when(protocolContext.safeConsensusContext(Mockito.any())).thenReturn(Optional.of(mergeContext)); when(protocolContext.getBlockchain()).thenReturn(blockchain); this.method = new EngineNewPayload(vertx, protocolContext, mergeCoordinator); } From fb31ce2900d99f66d1b01303a04fb93e7b516795 Mon Sep 17 00:00:00 2001 From: garyschulte Date: Sat, 30 Jul 2022 20:23:24 -0700 Subject: [PATCH 7/7] use supplier to make mergecontext optional a bit more palatable to read in engine-api Signed-off-by: garyschulte --- .../internal/methods/ExecutionEngineJsonRpcMethod.java | 7 +++++-- .../engine/EngineExchangeTransitionConfiguration.java | 6 ++++-- .../methods/engine/EngineForkchoiceUpdated.java | 10 +++++----- .../internal/methods/engine/EngineGetPayload.java | 2 +- .../internal/methods/engine/EngineNewPayload.java | 4 ++-- 5 files changed, 17 insertions(+), 12 deletions(-) diff --git a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/ExecutionEngineJsonRpcMethod.java b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/ExecutionEngineJsonRpcMethod.java index 65d4a4c4ee9..8f6ad7bcb60 100644 --- a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/ExecutionEngineJsonRpcMethod.java +++ b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/ExecutionEngineJsonRpcMethod.java @@ -24,6 +24,7 @@ import java.util.Optional; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; +import java.util.function.Supplier; import io.vertx.core.Vertx; import org.slf4j.Logger; @@ -41,13 +42,15 @@ public enum EngineStatus { public static final long ENGINE_API_LOGGING_THRESHOLD = 60000L; private final Vertx syncVertx; private static final Logger LOG = LoggerFactory.getLogger(ExecutionEngineJsonRpcMethod.class); - protected final Optional mergeContext; + protected final Optional mergeContextOptional; + protected final Supplier mergeContext; protected final ProtocolContext protocolContext; protected ExecutionEngineJsonRpcMethod(final Vertx vertx, final ProtocolContext protocolContext) { this.syncVertx = vertx; this.protocolContext = protocolContext; - this.mergeContext = protocolContext.safeConsensusContext(MergeContext.class); + this.mergeContextOptional = protocolContext.safeConsensusContext(MergeContext.class); + this.mergeContext = mergeContextOptional::orElseThrow; } @Override diff --git a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineExchangeTransitionConfiguration.java b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineExchangeTransitionConfiguration.java index 20649fcc59c..f42efd4d70f 100644 --- a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineExchangeTransitionConfiguration.java +++ b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineExchangeTransitionConfiguration.java @@ -82,11 +82,13 @@ public JsonRpcResponse syncResponse(final JsonRpcRequestContext requestContext) () -> Json.encodePrettily(remoteTransitionConfiguration)); final Optional maybeTerminalPoWBlockHeader = - mergeContext.flatMap(c -> c.getTerminalPoWBlock()); + mergeContextOptional.get().getTerminalPoWBlock(); final EngineExchangeTransitionConfigurationResult localTransitionConfiguration = new EngineExchangeTransitionConfigurationResult( - mergeContext.map(c -> c.getTerminalTotalDifficulty()).orElse(FALLBACK_TTD_DEFAULT), + mergeContextOptional + .map(c -> c.getTerminalTotalDifficulty()) + .orElse(FALLBACK_TTD_DEFAULT), maybeTerminalPoWBlockHeader.map(BlockHeader::getHash).orElse(Hash.ZERO), maybeTerminalPoWBlockHeader.map(BlockHeader::getNumber).orElse(0L)); diff --git a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineForkchoiceUpdated.java b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineForkchoiceUpdated.java index 93ebd4a6367..2429d8e2790 100644 --- a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineForkchoiceUpdated.java +++ b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineForkchoiceUpdated.java @@ -73,12 +73,12 @@ public JsonRpcResponse syncResponse(final JsonRpcRequestContext requestContext) Optional.ofNullable(forkChoice.getFinalizedBlockHash()) .filter(finalized -> !finalized.isZero()); - mergeContext.ifPresent( - c -> - c.fireNewUnverifiedForkchoiceMessageEvent( - forkChoice.getHeadBlockHash(), maybeFinalizedHash, forkChoice.getSafeBlockHash())); + mergeContext + .get() + .fireNewUnverifiedForkchoiceMessageEvent( + forkChoice.getHeadBlockHash(), maybeFinalizedHash, forkChoice.getSafeBlockHash()); - if (mergeContext.map(c -> c.isSyncing()).orElse(Boolean.TRUE)) { + if (mergeContext.get().isSyncing()) { return syncingResponse(requestId, forkChoice); } 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 93c3a398fde..a2de8d1d433 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 @@ -57,7 +57,7 @@ public String getName() { public JsonRpcResponse syncResponse(final JsonRpcRequestContext request) { final PayloadIdentifier payloadId = request.getRequiredParameter(0, PayloadIdentifier.class); - final Optional block = mergeContext.flatMap(c -> c.retrieveBlockById(payloadId)); + final Optional block = mergeContext.get().retrieveBlockById(payloadId); if (block.isPresent()) { var proposal = block.get(); var proposalHeader = proposal.getHeader(); diff --git a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineNewPayload.java b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineNewPayload.java index 130d8e2150f..73c94f47796 100644 --- a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineNewPayload.java +++ b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineNewPayload.java @@ -166,10 +166,10 @@ public JsonRpcResponse syncResponse(final JsonRpcRequestContext requestContext) final var block = new Block(newBlockHeader, new BlockBody(transactions, Collections.emptyList())); - if (mergeContext.map(c -> c.isSyncing()).orElse(Boolean.TRUE) || parentHeader.isEmpty()) { + if (mergeContext.get().isSyncing() || parentHeader.isEmpty()) { LOG.debug( "isSyncing: {} parentHeaderMissing: {}, adding {} to backwardsync", - mergeContext.map(c -> c.isSyncing()).orElse(null), + mergeContext.get().isSyncing(), parentHeader.isEmpty(), block.getHash()); mergeCoordinator