From a211769d140f4979b0db4326bb4758b1a7af16c8 Mon Sep 17 00:00:00 2001 From: Fabio Di Fabio Date: Mon, 14 Aug 2023 03:14:54 +0200 Subject: [PATCH] Uniform the way fee market is used in ProtocolSpecBuilder (#5746) Signed-off-by: Fabio Di Fabio Co-authored-by: Sally MacFarlane --- .../mainnet/ClassicProtocolSpecs.java | 20 ++--- .../mainnet/MainnetProtocolSpecs.java | 89 ++++++++++--------- .../ethereum/mainnet/ProtocolSpecBuilder.java | 27 +++--- 3 files changed, 73 insertions(+), 63 deletions(-) diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/ClassicProtocolSpecs.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/ClassicProtocolSpecs.java index f217e73e7dd..bc460811ae0 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/ClassicProtocolSpecs.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/ClassicProtocolSpecs.java @@ -21,7 +21,6 @@ import org.hyperledger.besu.datatypes.Wei; import org.hyperledger.besu.ethereum.core.TransactionReceipt; import org.hyperledger.besu.ethereum.core.feemarket.CoinbaseFeePriceCalculator; -import org.hyperledger.besu.ethereum.mainnet.feemarket.FeeMarket; import org.hyperledger.besu.ethereum.processing.TransactionProcessingResult; import org.hyperledger.besu.evm.MainnetEVMs; import org.hyperledger.besu.evm.contractvalidation.MaxCodeSizeRule; @@ -74,8 +73,8 @@ public static ProtocolSpecBuilder tangerineWhistleDefinition( contractSizeLimit, configStackSizeLimit, evmConfiguration) .isReplayProtectionSupported(true) .gasCalculator(TangerineWhistleGasCalculator::new) - .transactionValidatorBuilder( - (gasCalculator, gasLimitCalculator) -> + .transactionValidatorFactoryBuilder( + (gasCalculator, gasLimitCalculator, feeMarket) -> new TransactionValidatorFactory(gasCalculator, gasLimitCalculator, true, chainId)) .name("ClassicTangerineWhistle"); } @@ -128,8 +127,8 @@ public static ProtocolSpecBuilder defuseDifficultyBombDefinition( return gothamDefinition( chainId, contractSizeLimit, configStackSizeLimit, ecip1017EraRounds, evmConfiguration) .difficultyCalculator(ClassicDifficultyCalculators.DIFFICULTY_BOMB_REMOVED) - .transactionValidatorBuilder( - (gasCalculator, gasLimitCalculator) -> + .transactionValidatorFactoryBuilder( + (gasCalculator, gasLimitCalculator, feeMarket) -> new TransactionValidatorFactory(gasCalculator, gasLimitCalculator, true, chainId)) .name("DefuseDifficultyBomb"); } @@ -171,18 +170,19 @@ public static ProtocolSpecBuilder atlantisDefinition( 1)) .transactionProcessorBuilder( (gasCalculator, - transactionValidator, + feeMarket, + transactionValidatorFactory, contractCreationProcessor, messageCallProcessor) -> new MainnetTransactionProcessor( gasCalculator, - transactionValidator, + transactionValidatorFactory, contractCreationProcessor, messageCallProcessor, true, false, stackSizeLimit, - FeeMarket.legacy(), + feeMarket, CoinbaseFeePriceCalculator.frontier())) .name("Atlantis"); } @@ -291,8 +291,8 @@ public static ProtocolSpecBuilder magnetoDefinition( ecip1017EraRounds, evmConfiguration) .gasCalculator(BerlinGasCalculator::new) - .transactionValidatorBuilder( - (gasCalculator, gasLimitCalculator) -> + .transactionValidatorFactoryBuilder( + (gasCalculator, gasLimitCalculator, feeMarket) -> new TransactionValidatorFactory( gasCalculator, gasLimitCalculator, diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/MainnetProtocolSpecs.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/MainnetProtocolSpecs.java index bbdfc385664..1299dc9d01d 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/MainnetProtocolSpecs.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/MainnetProtocolSpecs.java @@ -20,7 +20,6 @@ import org.hyperledger.besu.datatypes.TransactionType; import org.hyperledger.besu.datatypes.Wei; import org.hyperledger.besu.ethereum.BlockProcessingResult; -import org.hyperledger.besu.ethereum.GasLimitCalculator; import org.hyperledger.besu.ethereum.MainnetBlockValidator; import org.hyperledger.besu.ethereum.chain.Blockchain; import org.hyperledger.besu.ethereum.core.BlockHeader; @@ -110,7 +109,7 @@ public static ProtocolSpecBuilder frontierDefinition( final int stackSizeLimit = configStackSizeLimit.orElse(MessageFrame.DEFAULT_MAX_STACK_SIZE); return new ProtocolSpecBuilder() .gasCalculator(FrontierGasCalculator::new) - .gasLimitCalculator(new FrontierTargetingGasLimitCalculator()) + .gasLimitCalculatorBuilder(feeMarket -> new FrontierTargetingGasLimitCalculator()) .evmBuilder(MainnetEVMs::frontier) .precompileContractRegistryBuilder(MainnetPrecompiledContractRegistries::frontier) .messageCallProcessorBuilder(MessageCallProcessor::new) @@ -122,12 +121,13 @@ public static ProtocolSpecBuilder frontierDefinition( false, Collections.singletonList(MaxCodeSizeRule.of(contractSizeLimit)), 0)) - .transactionValidatorBuilder( - (gasCalculator, gasLimitCalculator) -> + .transactionValidatorFactoryBuilder( + (gasCalculator, gasLimitCalculator, feeMarket) -> new TransactionValidatorFactory( gasCalculator, gasLimitCalculator, false, Optional.empty())) .transactionProcessorBuilder( (gasCalculator, + feeMarket, transactionValidatorFactory, contractCreationProcessor, messageCallProcessor) -> @@ -197,8 +197,8 @@ public static ProtocolSpecBuilder homesteadDefinition( true, Collections.singletonList(MaxCodeSizeRule.of(contractSizeLimit)), 0)) - .transactionValidatorBuilder( - (gasCalculator, gasLimitCalculator) -> + .transactionValidatorFactoryBuilder( + (gasCalculator, gasLimitCalculator, feeMarket) -> new TransactionValidatorFactory( gasCalculator, gasLimitCalculator, true, Optional.empty())) .difficultyCalculator(MainnetDifficultyCalculators.HOMESTEAD) @@ -275,11 +275,12 @@ public static ProtocolSpecBuilder spuriousDragonDefinition( Collections.singletonList(MaxCodeSizeRule.of(contractSizeLimit)), 1, SPURIOUS_DRAGON_FORCE_DELETE_WHEN_EMPTY_ADDRESSES)) - .transactionValidatorBuilder( - (gasCalculator, gasLimitCalculator) -> + .transactionValidatorFactoryBuilder( + (gasCalculator, gasLimitCalculator, feeMarket) -> new TransactionValidatorFactory(gasCalculator, gasLimitCalculator, true, chainId)) .transactionProcessorBuilder( (gasCalculator, + feeMarket, transactionValidator, contractCreationProcessor, messageCallProcessor) -> @@ -291,7 +292,7 @@ public static ProtocolSpecBuilder spuriousDragonDefinition( true, false, stackSizeLimit, - FeeMarket.legacy(), + feeMarket, CoinbaseFeePriceCalculator.frontier())) .name("SpuriousDragon"); } @@ -316,12 +317,12 @@ public static ProtocolSpecBuilder byzantiumDefinition( .blockReward(BYZANTIUM_BLOCK_REWARD) .privateTransactionValidatorBuilder(() -> new PrivateTransactionValidator(chainId)) .privateTransactionProcessorBuilder( - (transactionValidator, + (transactionValidatorFactory, contractCreationProcessor, messageCallProcessor, privateTransactionValidator) -> new PrivateTransactionProcessor( - transactionValidator, + transactionValidatorFactory, contractCreationProcessor, messageCallProcessor, false, @@ -410,8 +411,8 @@ static ProtocolSpecBuilder berlinDefinition( return muirGlacierDefinition( chainId, contractSizeLimit, configStackSizeLimit, enableRevertReason, evmConfiguration) .gasCalculator(BerlinGasCalculator::new) - .transactionValidatorBuilder( - (gasCalculator, gasLimitCalculator) -> + .transactionValidatorFactoryBuilder( + (gasCalculator, gasLimitCalculator, feeMarket) -> new TransactionValidatorFactory( gasCalculator, gasLimitCalculator, @@ -447,15 +448,18 @@ static ProtocolSpecBuilder londonDefinition( configStackSizeLimit, enableRevertReason, evmConfiguration) + .feeMarket(londonFeeMarket) .gasCalculator(LondonGasCalculator::new) - .gasLimitCalculator( - new LondonTargetingGasLimitCalculator(londonForkBlockNumber, londonFeeMarket)) - .transactionValidatorBuilder( - (gasCalculator, gasLimitCalculator) -> + .gasLimitCalculatorBuilder( + feeMarket -> + new LondonTargetingGasLimitCalculator( + londonForkBlockNumber, (BaseFeeMarket) feeMarket)) + .transactionValidatorFactoryBuilder( + (gasCalculator, gasLimitCalculator, feeMarket) -> new TransactionValidatorFactory( gasCalculator, gasLimitCalculator, - londonFeeMarket, + feeMarket, true, chainId, Set.of( @@ -465,18 +469,19 @@ static ProtocolSpecBuilder londonDefinition( Integer.MAX_VALUE)) .transactionProcessorBuilder( (gasCalculator, - transactionValidator, + feeMarket, + transactionValidatorFactory, contractCreationProcessor, messageCallProcessor) -> new MainnetTransactionProcessor( gasCalculator, - transactionValidator, + transactionValidatorFactory, contractCreationProcessor, messageCallProcessor, true, false, stackSizeLimit, - londonFeeMarket, + feeMarket, CoinbaseFeePriceCalculator.eip1559())) .contractCreationProcessorBuilder( (gasCalculator, evm) -> @@ -491,13 +496,14 @@ static ProtocolSpecBuilder londonDefinition( (gasCalculator, jdCacheConfig) -> MainnetEVMs.london( gasCalculator, chainId.orElse(BigInteger.ZERO), evmConfiguration)) - .feeMarket(londonFeeMarket) .difficultyCalculator(MainnetDifficultyCalculators.LONDON) .blockHeaderValidatorBuilder( - feeMarket -> MainnetBlockHeaderValidator.createBaseFeeMarketValidator(londonFeeMarket)) + feeMarket -> + MainnetBlockHeaderValidator.createBaseFeeMarketValidator((BaseFeeMarket) feeMarket)) .ommerHeaderValidatorBuilder( feeMarket -> - MainnetBlockHeaderValidator.createBaseFeeMarketOmmerValidator(londonFeeMarket)) + MainnetBlockHeaderValidator.createBaseFeeMarketOmmerValidator( + (BaseFeeMarket) feeMarket)) .blockBodyValidatorBuilder(BaseFeeBlockBodyValidator::new) .name("London"); } @@ -574,11 +580,6 @@ static ProtocolSpecBuilder shanghaiDefinition( // extra variables need to support flipping the warm coinbase flag. final int stackSizeLimit = configStackSizeLimit.orElse(MessageFrame.DEFAULT_MAX_STACK_SIZE); - final long londonForkBlockNumber = genesisConfigOptions.getLondonBlockNumber().orElse(0L); - final BaseFeeMarket londonFeeMarket = - genesisConfigOptions.isZeroBaseFee() - ? FeeMarket.zeroBaseFee(londonForkBlockNumber) - : FeeMarket.london(londonForkBlockNumber, genesisConfigOptions.getBaseFeePerGas()); return parisDefinition( chainId, @@ -597,26 +598,27 @@ static ProtocolSpecBuilder shanghaiDefinition( // we need to flip the Warm Coinbase flag for EIP-3651 warm coinbase .transactionProcessorBuilder( (gasCalculator, - transactionValidator, + feeMarket, + transactionValidatorFactory, contractCreationProcessor, messageCallProcessor) -> new MainnetTransactionProcessor( gasCalculator, - transactionValidator, + transactionValidatorFactory, contractCreationProcessor, messageCallProcessor, true, true, stackSizeLimit, - londonFeeMarket, + feeMarket, CoinbaseFeePriceCalculator.eip1559())) // Contract creation rules for EIP-3860 Limit and meter intitcode - .transactionValidatorBuilder( - (gasCalculator, gasLimitCalculator) -> + .transactionValidatorFactoryBuilder( + (gasCalculator, gasLimitCalculator, feeMarket) -> new TransactionValidatorFactory( gasCalculator, gasLimitCalculator, - londonFeeMarket, + feeMarket, true, chainId, Set.of( @@ -646,9 +648,6 @@ static ProtocolSpecBuilder cancunDefinition( ? FeeMarket.zeroBaseFee(londonForkBlockNumber) : FeeMarket.cancun(londonForkBlockNumber, genesisConfigOptions.getBaseFeePerGas()); - final GasLimitCalculator cancunGasLimitCalculator = - new CancunTargetingGasLimitCalculator(londonForkBlockNumber, cancunFeeMarket); - return shanghaiDefinition( chainId, configContractSizeLimit, @@ -660,7 +659,10 @@ static ProtocolSpecBuilder cancunDefinition( // gas calculator for EIP-4844 data gas .gasCalculator(CancunGasCalculator::new) // gas limit with EIP-4844 max data gas per block - .gasLimitCalculator(cancunGasLimitCalculator) + .gasLimitCalculatorBuilder( + feeMarket -> + new CancunTargetingGasLimitCalculator( + londonForkBlockNumber, (BaseFeeMarket) feeMarket)) // EVM changes to support EOF EIPs (3670, 4200, 4750, 5450) .evmBuilder( (gasCalculator, jdCacheConfig) -> @@ -680,6 +682,7 @@ static ProtocolSpecBuilder cancunDefinition( // use Cancun fee market .transactionProcessorBuilder( (gasCalculator, + feeMarket, transactionValidator, contractCreationProcessor, messageCallProcessor) -> @@ -691,15 +694,15 @@ static ProtocolSpecBuilder cancunDefinition( true, true, stackSizeLimit, - cancunFeeMarket, + feeMarket, CoinbaseFeePriceCalculator.eip1559())) // change to check for max data gas per block for EIP-4844 - .transactionValidatorBuilder( - (gasCalculator, gasLimitCalculator) -> + .transactionValidatorFactoryBuilder( + (gasCalculator, gasLimitCalculator, feeMarket) -> new TransactionValidatorFactory( gasCalculator, gasLimitCalculator, - cancunFeeMarket, + feeMarket, true, chainId, Set.of( diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/ProtocolSpecBuilder.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/ProtocolSpecBuilder.java index 697f1112d2b..7b39ebe2f5f 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/ProtocolSpecBuilder.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/ProtocolSpecBuilder.java @@ -45,7 +45,7 @@ public class ProtocolSpecBuilder { private Supplier gasCalculatorBuilder; - private GasLimitCalculator gasLimitCalculator; + private Function gasLimitCalculatorBuilder; private Wei blockReward; private boolean skipZeroBlockRewards; private BlockHeaderFunctions blockHeaderFunctions; @@ -53,8 +53,7 @@ public class ProtocolSpecBuilder { private DifficultyCalculator difficultyCalculator; private EvmConfiguration evmConfiguration; private BiFunction evmBuilder; - private BiFunction - transactionValidatorFactoryBuilder; + private TransactionValidatorFactoryBuilder transactionValidatorFactoryBuilder; private Function blockHeaderValidatorBuilder; private Function ommerHeaderValidatorBuilder; private Function blockBodyValidatorBuilder; @@ -88,8 +87,9 @@ public ProtocolSpecBuilder gasCalculator(final Supplier gasCalcul return this; } - public ProtocolSpecBuilder gasLimitCalculator(final GasLimitCalculator gasLimitCalculator) { - this.gasLimitCalculator = gasLimitCalculator; + public ProtocolSpecBuilder gasLimitCalculatorBuilder( + final Function gasLimitCalculatorBuilder) { + this.gasLimitCalculatorBuilder = gasLimitCalculatorBuilder; return this; } @@ -125,9 +125,8 @@ public ProtocolSpecBuilder evmBuilder( return this; } - public ProtocolSpecBuilder transactionValidatorBuilder( - final BiFunction - transactionValidatorFactoryBuilder) { + public ProtocolSpecBuilder transactionValidatorFactoryBuilder( + final TransactionValidatorFactoryBuilder transactionValidatorFactoryBuilder) { this.transactionValidatorFactoryBuilder = transactionValidatorFactoryBuilder; return this; } @@ -279,7 +278,7 @@ public ProtocolSpecBuilder isReplayProtectionSupported( public ProtocolSpec build(final ProtocolSchedule protocolSchedule) { checkNotNull(gasCalculatorBuilder, "Missing gasCalculator"); - checkNotNull(gasLimitCalculator, "Missing gasLimitCalculator"); + checkNotNull(gasLimitCalculatorBuilder, "Missing gasLimitCalculatorBuilder"); checkNotNull(evmBuilder, "Missing operation registry"); checkNotNull(evmConfiguration, "Missing evm configuration"); checkNotNull(transactionValidatorFactoryBuilder, "Missing transaction validator"); @@ -306,11 +305,12 @@ public ProtocolSpec build(final ProtocolSchedule protocolSchedule) { checkNotNull(badBlockManager, "Missing bad blocks manager"); final GasCalculator gasCalculator = gasCalculatorBuilder.get(); + final GasLimitCalculator gasLimitCalculator = gasLimitCalculatorBuilder.apply(feeMarket); final EVM evm = evmBuilder.apply(gasCalculator, evmConfiguration); final PrecompiledContractConfiguration precompiledContractConfiguration = new PrecompiledContractConfiguration(gasCalculator, privacyParameters); final TransactionValidatorFactory transactionValidatorFactory = - transactionValidatorFactoryBuilder.apply(gasCalculator, gasLimitCalculator); + transactionValidatorFactoryBuilder.apply(gasCalculator, gasLimitCalculator, feeMarket); final AbstractMessageProcessor contractCreationProcessor = contractCreationProcessorBuilder.apply(gasCalculator, evm); final PrecompileContractRegistry precompileContractRegistry = @@ -320,6 +320,7 @@ public ProtocolSpec build(final ProtocolSchedule protocolSchedule) { final MainnetTransactionProcessor transactionProcessor = transactionProcessorBuilder.apply( gasCalculator, + feeMarket, transactionValidatorFactory, contractCreationProcessor, messageCallProcessor); @@ -446,6 +447,7 @@ private BlockHeaderValidator createBlockHeaderValidator( public interface TransactionProcessorBuilder { MainnetTransactionProcessor apply( GasCalculator gasCalculator, + FeeMarket feeMarket, TransactionValidatorFactory transactionValidatorFactory, AbstractMessageProcessor contractCreationProcessor, AbstractMessageProcessor messageCallProcessor); @@ -484,4 +486,9 @@ BlockValidator apply( public interface BlockImporterBuilder { BlockImporter apply(BlockValidator blockValidator); } + + public interface TransactionValidatorFactoryBuilder { + TransactionValidatorFactory apply( + GasCalculator gasCalculator, GasLimitCalculator gasLimitCalculator, FeeMarket feeMarket); + } }