From b892b690771697e34f815974798ee19155f823ca Mon Sep 17 00:00:00 2001 From: Jorge Mederos Date: Sat, 9 Apr 2022 17:34:06 -0400 Subject: [PATCH] Use BlockProducerEnvFactory in AuRa --- .../AuRaBlockProducerEnvFactory.cs | 91 ++--- .../StartBlockProducerAuRa.cs | 319 +----------------- 2 files changed, 56 insertions(+), 354 deletions(-) diff --git a/src/Nethermind/Nethermind.Consensus.AuRa/InitializationSteps/AuRaBlockProducerEnvFactory.cs b/src/Nethermind/Nethermind.Consensus.AuRa/InitializationSteps/AuRaBlockProducerEnvFactory.cs index d60fecd66a9..574ea236cb1 100644 --- a/src/Nethermind/Nethermind.Consensus.AuRa/InitializationSteps/AuRaBlockProducerEnvFactory.cs +++ b/src/Nethermind/Nethermind.Consensus.AuRa/InitializationSteps/AuRaBlockProducerEnvFactory.cs @@ -1,7 +1,6 @@ using System; using System.Collections.Generic; using System.Linq; -using System.Threading.Tasks; using Nethermind.Abi; using Nethermind.Api; using Nethermind.Blockchain; @@ -20,7 +19,6 @@ using Nethermind.Db; using Nethermind.Evm.TransactionProcessing; using Nethermind.Init.Steps; -using Nethermind.Logging; using Nethermind.Specs.ChainSpecStyle; using Nethermind.TxPool; @@ -30,13 +28,17 @@ public class AuRaBlockProducerEnvFactory : IBlockProducerEnvFactory { private readonly AuRaNethermindApi _api; private IAuraConfig _auraConfig; - private IAuRaValidator _validator; - private TxPriorityContract? _txPriorityContract; - private TxPriorityContract.LocalDataSource? _localDataSource; private DictionaryContractDataStore? _minGasPricesContractDataStore; - public IBlockTransactionsExecutorFactory TransactionsExecutorFactory { get; set; } + private IAuRaValidator _validator; + public AuRaBlockProducerEnvFactory(AuRaNethermindApi api, IAuraConfig auraConfig) + { + _api = api ?? throw new ArgumentNullException(nameof(api)); + _auraConfig = auraConfig ?? throw new ArgumentNullException(nameof(auraConfig)); + } + + public IBlockTransactionsExecutorFactory TransactionsExecutorFactory { get; set; } public virtual BlockProducerEnv Create(ITxSource? additionalTxSource = null) { @@ -45,8 +47,10 @@ public virtual BlockProducerEnv Create(ITxSource? additionalTxSource = null) ReadOnlyTxProcessingEnv txProcessingEnv = CreateReadonlyTxProcessingEnv(dbProvider, readOnlyBlockTree); ReadOnlyTxProcessingEnv constantContractsProcessingEnv = CreateReadonlyTxProcessingEnv(dbProvider, readOnlyBlockTree); - BlockProcessor blockProcessor = CreateBlockProcessor(txProcessingEnv, constantContractsProcessingEnv); + IGasLimitCalculator gasLimitCalculator = CreateGasLimitCalculator(constantContractsProcessingEnv); + + BlockProcessor blockProcessor = CreateBlockProcessor(txProcessingEnv, constantContractsProcessingEnv, gasLimitCalculator as AuRaContractGasLimitOverride); IBlockchainProcessor blockchainProcessor = new BlockchainProcessor( readOnlyBlockTree, @@ -61,17 +65,18 @@ public virtual BlockProducerEnv Create(ITxSource? additionalTxSource = null) var txSource = CreateTxSourceForProducer(txProcessingEnv, constantContractsProcessingEnv, additionalTxSource); - return new BlockProducerEnv() + return new AuRaBlockProducerEnv() { BlockTree = readOnlyBlockTree, ChainProcessor = chainProcessor, ReadOnlyStateProvider = txProcessingEnv.StateProvider, TxSource = txSource, - ReadOnlyTxProcessingEnv = constantContractsProcessingEnv + ReadOnlyTxProcessingEnv = constantContractsProcessingEnv, + GasLimitCalculator = gasLimitCalculator, }; } - private BlockProcessor CreateBlockProcessor(ReadOnlyTxProcessingEnv changeableTxProcessingEnv, ReadOnlyTxProcessingEnv constantContractTxProcessingEnv) + private BlockProcessor CreateBlockProcessor(ReadOnlyTxProcessingEnv changeableTxProcessingEnv, ReadOnlyTxProcessingEnv constantContractTxProcessingEnv, AuRaContractGasLimitOverride? gasLimitOverride) { if (_api.RewardCalculatorSource == null) throw new StepDependencyException(nameof(_api.RewardCalculatorSource)); if (_api.ValidatorStore == null) throw new StepDependencyException(nameof(_api.ValidatorStore)); @@ -100,7 +105,7 @@ private BlockProcessor CreateBlockProcessor(ReadOnlyTxProcessingEnv changeableTx _api.LogManager, changeableTxProcessingEnv.BlockTree, auRaTxFilter, - CreateGasLimitCalculator(constantContractTxProcessingEnv) as AuRaContractGasLimitOverride); + gasLimitOverride); _validator = new AuRaValidatorFactory(_api.AbiEncoder, changeableTxProcessingEnv.StateProvider, @@ -129,33 +134,6 @@ private BlockProcessor CreateBlockProcessor(ReadOnlyTxProcessingEnv changeableTx return processor; } - private IGasLimitCalculator CreateGasLimitCalculator(IReadOnlyTxProcessorSource readOnlyTxProcessorSource) - { - if (_api.ChainSpec == null) throw new StepDependencyException(nameof(_api.ChainSpec)); - var blockGasLimitContractTransitions = _api.ChainSpec.AuRa.BlockGasLimitContractTransitions; - - IGasLimitCalculator gasLimitCalculator = - new TargetAdjustedGasLimitCalculator(_api.SpecProvider, _api.Config()); - if (blockGasLimitContractTransitions?.Any() == true) - { - AuRaContractGasLimitOverride auRaContractGasLimitOverride = new( - blockGasLimitContractTransitions.Select(blockGasLimitContractTransition => - new BlockGasLimitContract( - _api.AbiEncoder, - blockGasLimitContractTransition.Value, - blockGasLimitContractTransition.Key, - readOnlyTxProcessorSource)) - .ToArray(), - _api.GasLimitCalculatorCache, - _auraConfig?.Minimum2MlnGasPerBlockWhenUsingBlockGasLimitContract == true, - gasLimitCalculator, - _api.LogManager); - - gasLimitCalculator = auRaContractGasLimitOverride; - } - - return gasLimitCalculator; - } protected ReadOnlyTxProcessingEnv CreateReadonlyTxProcessingEnv(ReadOnlyDbProvider dbProvider, ReadOnlyBlockTree blockTree) { @@ -250,7 +228,7 @@ private TxPoolTxSource CreateTxPoolTxSource(ReadOnlyTxProcessingEnv processingEn IReadOnlyTxProcessorSource readOnlyTxProcessorSourceForTxPriority = new ReadOnlyTxProcessingEnv(_api.DbProvider, _api.ReadOnlyTrieStore, _api.BlockTree, _api.SpecProvider, _api.LogManager); - (_txPriorityContract, _localDataSource) = TxAuRaFilterBuilders.CreateTxPrioritySources(_auraConfig, _api, readOnlyTxProcessorSourceForTxPriority); + (TxPriorityContract _txPriorityContract,TxPriorityContract.LocalDataSource _localDataSource) = TxAuRaFilterBuilders.CreateTxPrioritySources(_auraConfig, _api, readOnlyTxProcessorSourceForTxPriority); if (_txPriorityContract != null || _localDataSource != null) { @@ -304,7 +282,7 @@ private TxPoolTxSource CreateTxPoolTxSource(ReadOnlyTxProcessingEnv processingEn private TxPoolTxSource CreateStandardTxPoolTxSource(ReadOnlyTxProcessingEnv processingEnv, IReadOnlyTxProcessorSource readOnlyTxProcessorSource) { - ITxFilter txSourceFilter = CreateAuraTxFilterForProducer(readOnlyTxProcessorSource,_api.SpecProvider); + ITxFilter txSourceFilter = CreateAuraTxFilterForProducer(readOnlyTxProcessorSource, _api.SpecProvider); ITxFilterPipeline txFilterPipeline = new TxFilterPipelineBuilder(_api.LogManager) .WithCustomTxFilter(txSourceFilter) .WithBaseFeeFilter(_api.SpecProvider) @@ -320,5 +298,38 @@ private ITxFilter CreateAuraTxFilterForProducer(IReadOnlyTxProcessorSource readO _minGasPricesContractDataStore, specProvider); + private IGasLimitCalculator CreateGasLimitCalculator(IReadOnlyTxProcessorSource readOnlyTxProcessorSource) + { + if (_api.ChainSpec == null) throw new StepDependencyException(nameof(_api.ChainSpec)); + var blockGasLimitContractTransitions = _api.ChainSpec.AuRa.BlockGasLimitContractTransitions; + + IGasLimitCalculator gasLimitCalculator = + new TargetAdjustedGasLimitCalculator(_api.SpecProvider, _api.Config()); + if (blockGasLimitContractTransitions?.Any() == true) + { + AuRaContractGasLimitOverride auRaContractGasLimitOverride = new( + blockGasLimitContractTransitions.Select(blockGasLimitContractTransition => + new BlockGasLimitContract( + _api.AbiEncoder, + blockGasLimitContractTransition.Value, + blockGasLimitContractTransition.Key, + readOnlyTxProcessorSource)) + .ToArray(), + _api.GasLimitCalculatorCache, + _auraConfig?.Minimum2MlnGasPerBlockWhenUsingBlockGasLimitContract == true, + gasLimitCalculator, + _api.LogManager); + + gasLimitCalculator = auRaContractGasLimitOverride; + } + + return gasLimitCalculator; + } + + } + + public class AuRaBlockProducerEnv : BlockProducerEnv + { + public IGasLimitCalculator GasLimitCalculator { get; set; } } } diff --git a/src/Nethermind/Nethermind.Consensus.AuRa/InitializationSteps/StartBlockProducerAuRa.cs b/src/Nethermind/Nethermind.Consensus.AuRa/InitializationSteps/StartBlockProducerAuRa.cs index e89b3f679ef..b4e68cf9f10 100644 --- a/src/Nethermind/Nethermind.Consensus.AuRa/InitializationSteps/StartBlockProducerAuRa.cs +++ b/src/Nethermind/Nethermind.Consensus.AuRa/InitializationSteps/StartBlockProducerAuRa.cs @@ -15,30 +15,13 @@ // along with the Nethermind. If not, see . using System; -using System.Collections.Generic; -using System.Linq; using System.Threading.Tasks; -using Nethermind.Abi; using Nethermind.Api; -using Nethermind.Blockchain; -using Nethermind.Blockchain.Data; using Nethermind.Consensus.AuRa.Config; -using Nethermind.Consensus.AuRa.Contracts; -using Nethermind.Consensus.AuRa.Contracts.DataStore; -using Nethermind.Consensus.AuRa.Transactions; -using Nethermind.Consensus.AuRa.Validators; -using Nethermind.Consensus.Processing; using Nethermind.Consensus.Producers; using Nethermind.Consensus.Transactions; -using Nethermind.Core; -using Nethermind.Core.Specs; -using Nethermind.Crypto; -using Nethermind.Db; -using Nethermind.Evm.TransactionProcessing; using Nethermind.Init.Steps; using Nethermind.Logging; -using Nethermind.Specs.ChainSpecStyle; -using Nethermind.TxPool; namespace Nethermind.Consensus.AuRa.InitializationSteps { @@ -50,10 +33,6 @@ public class StartBlockProducerAuRa private INethermindApi NethermindApi => _api; private readonly IAuraConfig _auraConfig; - private IAuRaValidator? _validator; - private DictionaryContractDataStore? _minGasPricesContractDataStore; - private TxPriorityContract? _txPriorityContract; - private TxPriorityContract.LocalDataSource? _localDataSource; private IAuRaStepCalculator? _stepCalculator; public StartBlockProducerAuRa(AuRaNethermindApi api) @@ -92,10 +71,11 @@ public Task BuildProducer(IBlockProductionTrigger blockProductio ILogger logger = _api.LogManager.GetClassLogger(); if (logger.IsWarn) logger.Warn("Starting AuRa block producer & sealer"); - - BlockProducerEnv producerEnv = GetProducerChain(additionalTxSource); - IGasLimitCalculator gasLimitCalculator = _api.GasLimitCalculator = CreateGasLimitCalculator(producerEnv.ReadOnlyTxProcessingEnv); + _api.BlockProducerEnvFactory = new AuRaBlockProducerEnvFactory(_api, _auraConfig); + BlockProducerEnv producerEnv = _api.BlockProducerEnvFactory.Create(additionalTxSource); + + _api.GasLimitCalculator = (producerEnv as AuRaBlockProducerEnv).GasLimitCalculator; IBlockProducer blockProducer = new AuRaBlockProducer( producerEnv.TxSource, @@ -108,300 +88,11 @@ public Task BuildProducer(IBlockProductionTrigger blockProductio StepCalculator, _api.ReportingValidator, _auraConfig, - gasLimitCalculator, + _api.GasLimitCalculator, _api.SpecProvider, _api.LogManager); return Task.FromResult(blockProducer); } - - private BlockProcessor CreateBlockProcessor(ReadOnlyTxProcessingEnv changeableTxProcessingEnv, ReadOnlyTxProcessingEnv constantContractTxProcessingEnv) - { - if (_api.RewardCalculatorSource == null) throw new StepDependencyException(nameof(_api.RewardCalculatorSource)); - if (_api.ValidatorStore == null) throw new StepDependencyException(nameof(_api.ValidatorStore)); - if (_api.ChainSpec == null) throw new StepDependencyException(nameof(_api.ChainSpec)); - if (_api.BlockTree == null) throw new StepDependencyException(nameof(_api.BlockTree)); - if (_api.EngineSigner == null) throw new StepDependencyException(nameof(_api.EngineSigner)); - if (_api.SpecProvider == null) throw new StepDependencyException(nameof(_api.SpecProvider)); - if (_api.GasPriceOracle == null) throw new StepDependencyException(nameof(_api.GasPriceOracle)); - - var chainSpecAuRa = _api.ChainSpec.AuRa; - - ITxFilter auRaTxFilter = TxAuRaFilterBuilders.CreateAuRaTxFilter( - _api, - constantContractTxProcessingEnv, - _api.SpecProvider, - new LocalTxFilter(_api.EngineSigner)); - - AuRaBlockProcessor processor = new ( - _api.SpecProvider, - _api.BlockValidator, - _api.RewardCalculatorSource.Get(changeableTxProcessingEnv.TransactionProcessor), - _api.BlockProducerEnvFactory.TransactionsExecutorFactory.Create(changeableTxProcessingEnv), - changeableTxProcessingEnv.StateProvider, - changeableTxProcessingEnv.StorageProvider, - _api.ReceiptStorage, - _api.LogManager, - changeableTxProcessingEnv.BlockTree, - auRaTxFilter, - CreateGasLimitCalculator(constantContractTxProcessingEnv) as AuRaContractGasLimitOverride); - - _validator = new AuRaValidatorFactory(_api.AbiEncoder, - changeableTxProcessingEnv.StateProvider, - changeableTxProcessingEnv.TransactionProcessor, - changeableTxProcessingEnv.BlockTree, - constantContractTxProcessingEnv, - _api.ReceiptStorage, - _api.ValidatorStore, - _api.FinalizationManager, - NullTxSender.Instance, - NullTxPool.Instance, - NethermindApi.Config(), - _api.LogManager, - _api.EngineSigner, - _api.SpecProvider, - _api.GasPriceOracle, - _api.ReportingContractValidatorCache, chainSpecAuRa.PosdaoTransition, true) - .CreateValidatorProcessor(chainSpecAuRa.Validators, _api.BlockTree.Head?.Header); - - if (_validator is IDisposable disposableValidator) - { - _api.DisposeStack.Push(disposableValidator); - } - - processor.AuRaValidator = _validator; - return processor; - } - - private TxPoolTxSource CreateTxPoolTxSource(ReadOnlyTxProcessingEnv processingEnv, IReadOnlyTxProcessorSource readOnlyTxProcessorSource) - { - // We need special one for TxPriority as its following Head separately with events and we want rules from Head, not produced block - IReadOnlyTxProcessorSource readOnlyTxProcessorSourceForTxPriority = - new ReadOnlyTxProcessingEnv(_api.DbProvider, _api.ReadOnlyTrieStore, _api.BlockTree, _api.SpecProvider, _api.LogManager); - - (_txPriorityContract, _localDataSource) = TxAuRaFilterBuilders.CreateTxPrioritySources(_auraConfig, _api, readOnlyTxProcessorSourceForTxPriority); - - if (_txPriorityContract != null || _localDataSource != null) - { - _minGasPricesContractDataStore = TxAuRaFilterBuilders.CreateMinGasPricesDataStore(_api, _txPriorityContract, _localDataSource)!; - _api.DisposeStack.Push(_minGasPricesContractDataStore); - - ContractDataStore
whitelistContractDataStore = new ContractDataStoreWithLocalData
( - new HashSetContractDataStoreCollection
(), - _txPriorityContract?.SendersWhitelist, - _api.BlockTree, - _api.ReceiptFinder, - _api.LogManager, - _localDataSource?.GetWhitelistLocalDataSource() ?? new EmptyLocalDataSource>()); - - DictionaryContractDataStore prioritiesContractDataStore = - new DictionaryContractDataStore( - new TxPriorityContract.DestinationSortedListContractDataStoreCollection(), - _txPriorityContract?.Priorities, - _api.BlockTree, - _api.ReceiptFinder, - _api.LogManager, - _localDataSource?.GetPrioritiesLocalDataSource()); - - _api.DisposeStack.Push(whitelistContractDataStore); - _api.DisposeStack.Push(prioritiesContractDataStore); - - ITxFilter auraTxFilter = - CreateAuraTxFilterForProducer(readOnlyTxProcessorSource, _api.SpecProvider); - ITxFilterPipeline txFilterPipeline = new TxFilterPipelineBuilder(_api.LogManager) - .WithCustomTxFilter(auraTxFilter) - .WithBaseFeeFilter(_api.SpecProvider) - .WithNullTxFilter() - .Build; - - - return new TxPriorityTxSource( - _api.TxPool, - processingEnv.StateReader, - _api.LogManager, - txFilterPipeline, - whitelistContractDataStore, - prioritiesContractDataStore, - _api.SpecProvider, - _api.TransactionComparerProvider); - } - else - { - return CreateStandardTxPoolTxSource(processingEnv, readOnlyTxProcessorSource); - } - } - - // TODO: Use BlockProducerEnvFactory - private BlockProducerEnv GetProducerChain(ITxSource? additionalTxSource) - { - ReadOnlyTxProcessingEnv CreateReadonlyTxProcessingEnv(ReadOnlyDbProvider dbProvider, ReadOnlyBlockTree blockTree) - { - return new(dbProvider, _api.ReadOnlyTrieStore, blockTree, _api.SpecProvider, _api.LogManager); - } - - BlockProducerEnv Create() - { - ReadOnlyDbProvider dbProvider = _api.DbProvider.AsReadOnly(false); - ReadOnlyBlockTree readOnlyBlockTree = _api.BlockTree.AsReadOnly(); - - ReadOnlyTxProcessingEnv txProcessingEnv = CreateReadonlyTxProcessingEnv(dbProvider, readOnlyBlockTree); - ReadOnlyTxProcessingEnv constantContractsProcessingEnv = CreateReadonlyTxProcessingEnv(dbProvider, readOnlyBlockTree); - BlockProcessor blockProcessor = CreateBlockProcessor(txProcessingEnv, constantContractsProcessingEnv); - - IBlockchainProcessor blockchainProcessor = - new BlockchainProcessor( - readOnlyBlockTree, - blockProcessor, - _api.BlockPreprocessor, - _api.LogManager, - BlockchainProcessor.Options.NoReceipts); - - OneTimeChainProcessor chainProcessor = new( - dbProvider, - blockchainProcessor); - - return new BlockProducerEnv() - { - BlockTree = readOnlyBlockTree, - ChainProcessor = chainProcessor, - ReadOnlyStateProvider = txProcessingEnv.StateProvider, - TxSource = CreateTxSourceForProducer(txProcessingEnv, constantContractsProcessingEnv, additionalTxSource), - ReadOnlyTxProcessingEnv = constantContractsProcessingEnv - }; - } - - return _blockProducerContext ??= Create(); - } - - private ITxSource CreateStandardTxSourceForProducer( - ReadOnlyTxProcessingEnv processingEnv, - IReadOnlyTxProcessorSource readOnlyTxProcessorSource) => - CreateTxPoolTxSource(processingEnv, readOnlyTxProcessorSource); - - private TxPoolTxSource CreateStandardTxPoolTxSource(ReadOnlyTxProcessingEnv processingEnv, IReadOnlyTxProcessorSource readOnlyTxProcessorSource) - { - ITxFilter txSourceFilter = CreateAuraTxFilterForProducer(readOnlyTxProcessorSource,_api.SpecProvider); - ITxFilterPipeline txFilterPipeline = new TxFilterPipelineBuilder(_api.LogManager) - .WithCustomTxFilter(txSourceFilter) - .WithBaseFeeFilter(_api.SpecProvider) - .Build; - return new TxPoolTxSource(_api.TxPool, _api.SpecProvider, _api.TransactionComparerProvider, _api.LogManager, txFilterPipeline); - } - - private ITxFilter CreateAuraTxFilterForProducer(IReadOnlyTxProcessorSource readOnlyTxProcessorSource, ISpecProvider specProvider) => - TxAuRaFilterBuilders.CreateAuRaTxFilterForProducer( - NethermindApi.Config(), - _api, - readOnlyTxProcessorSource, - _minGasPricesContractDataStore, - specProvider); - - private ITxSource CreateTxSourceForProducer(ReadOnlyTxProcessingEnv processingEnv, IReadOnlyTxProcessorSource readOnlyTxProcessorSource, ITxSource? additionalTxSource) - { - bool CheckAddPosdaoTransactions(IList list, long auRaPosdaoTransition) - { - if (auRaPosdaoTransition < AuRaParameters.TransitionDisabled && _validator is ITxSource validatorSource) - { - list.Insert(0, validatorSource); - return true; - } - - return false; - } - - bool CheckAddRandomnessTransactions(IList list, IDictionary? randomnessContractAddress, ISigner signer) - { - IList GetRandomContracts( - IDictionary randomnessContractAddressPerBlock, - IAbiEncoder abiEncoder, - IReadOnlyTxProcessorSource txProcessorSource, - ISigner signerLocal) => - randomnessContractAddressPerBlock - .Select(kvp => new RandomContract( - abiEncoder, - kvp.Value, - txProcessorSource, - kvp.Key, - signerLocal)) - .ToArray(); - - if (randomnessContractAddress?.Any() == true) - { - RandomContractTxSource randomContractTxSource = new RandomContractTxSource( - GetRandomContracts(randomnessContractAddress, _api.AbiEncoder, - readOnlyTxProcessorSource, - signer), - new EciesCipher(_api.CryptoRandom), - signer, - _api.NodeKey, - _api.CryptoRandom, - _api.LogManager); - - list.Insert(0, randomContractTxSource); - return true; - } - - return false; - } - - if (_api.ChainSpec == null) throw new StepDependencyException(nameof(_api.ChainSpec)); - if (_api.BlockTree == null) throw new StepDependencyException(nameof(_api.BlockTree)); - if (_api.EngineSigner == null) throw new StepDependencyException(nameof(_api.EngineSigner)); - - IList txSources = new List {CreateStandardTxSourceForProducer(processingEnv, readOnlyTxProcessorSource)}; - bool needSigner = false; - - if (additionalTxSource is not null) - { - txSources.Insert(0, additionalTxSource); - } - needSigner |= CheckAddPosdaoTransactions(txSources, _api.ChainSpec.AuRa.PosdaoTransition); - needSigner |= CheckAddRandomnessTransactions(txSources, _api.ChainSpec.AuRa.RandomnessContractAddress, _api.EngineSigner); - - ITxSource txSource = txSources.Count > 1 ? new CompositeTxSource(txSources.ToArray()) : txSources[0]; - - if (needSigner) - { - TxSealer transactionSealer = new TxSealer(_api.EngineSigner, _api.Timestamper); - txSource = new GeneratedTxSource(txSource, transactionSealer, processingEnv.StateReader, _api.LogManager); - } - - ITxFilter? txPermissionFilter = TxAuRaFilterBuilders.CreateTxPermissionFilter(_api, readOnlyTxProcessorSource); - if (txPermissionFilter != null) - { - // we now only need to filter generated transactions here, as regular ones are filtered on TxPoolTxSource filter based on CreateTxSourceFilter method - txSource = new FilteredTxSource(txSource, txPermissionFilter, _api.LogManager); - } - - return txSource; - } - - private IGasLimitCalculator CreateGasLimitCalculator(IReadOnlyTxProcessorSource readOnlyTxProcessorSource) - { - if (_api.ChainSpec == null) throw new StepDependencyException(nameof(_api.ChainSpec)); - var blockGasLimitContractTransitions = _api.ChainSpec.AuRa.BlockGasLimitContractTransitions; - - IGasLimitCalculator gasLimitCalculator = - new TargetAdjustedGasLimitCalculator(_api.SpecProvider, NethermindApi.Config()); - if (blockGasLimitContractTransitions?.Any() == true) - { - AuRaContractGasLimitOverride auRaContractGasLimitOverride = new( - blockGasLimitContractTransitions.Select(blockGasLimitContractTransition => - new BlockGasLimitContract( - _api.AbiEncoder, - blockGasLimitContractTransition.Value, - blockGasLimitContractTransition.Key, - readOnlyTxProcessorSource)) - .ToArray(), - _api.GasLimitCalculatorCache, - _auraConfig?.Minimum2MlnGasPerBlockWhenUsingBlockGasLimitContract == true, - gasLimitCalculator, - _api.LogManager); - - gasLimitCalculator = auRaContractGasLimitOverride; - } - - return gasLimitCalculator; - } } }