protected BlockProducerContext GetProducerChain() { ReadOnlyDbProvider readOnlyDbProvider = new ReadOnlyDbProvider(_context.DbProvider, false); ReadOnlyBlockTree readOnlyBlockTree = new ReadOnlyBlockTree(_context.BlockTree); ReadOnlyTxProcessingEnv readOnlyTxProcessingEnv = new ReadOnlyTxProcessingEnv(readOnlyDbProvider, readOnlyBlockTree, _context.SpecProvider, _context.LogManager); BlockProcessor blockProcessor = CreateBlockProcessor(readOnlyTxProcessingEnv, readOnlyDbProvider); OneTimeChainProcessor chainProcessor = new OneTimeChainProcessor(readOnlyDbProvider, new BlockchainProcessor(readOnlyBlockTree, blockProcessor, _context.RecoveryStep, _context.LogManager, false)); PendingTxSelector pendingTxSelector = new PendingTxSelector(_context.TxPool, readOnlyTxProcessingEnv.StateProvider, _context.LogManager); return(new BlockProducerContext { ChainProcessor = chainProcessor, ReadOnlyStateProvider = readOnlyTxProcessingEnv.StateProvider, PendingTxSelector = pendingTxSelector }); }
public ReadOnlyChain( ReadOnlyBlockTree readOnlyTree, IBlockValidator blockValidator, IRewardCalculator rewardCalculator, ISpecProvider specProvider, IReadOnlyDbProvider dbProvider, IBlockDataRecoveryStep recoveryStep, ILogManager logManager, ITxPool customTxPool, IReceiptStorage receiptStorage) { ReadOnlyStateProvider = new StateProvider(dbProvider.StateDb, dbProvider.CodeDb, logManager); StorageProvider storageProvider = new StorageProvider(dbProvider.StateDb, ReadOnlyStateProvider, logManager); BlockhashProvider blockhashProvider = new BlockhashProvider(readOnlyTree, logManager); VirtualMachine virtualMachine = new VirtualMachine(ReadOnlyStateProvider, storageProvider, blockhashProvider, specProvider, logManager); ITransactionProcessor transactionProcessor = new TransactionProcessor(specProvider, ReadOnlyStateProvider, storageProvider, virtualMachine, logManager); ITxPool txPool = customTxPool; IBlockProcessor blockProcessor = new BlockProcessor(specProvider, blockValidator, rewardCalculator, transactionProcessor, dbProvider.StateDb, dbProvider.CodeDb, dbProvider.TraceDb, ReadOnlyStateProvider, storageProvider, txPool, receiptStorage, logManager); Processor = new OneTimeChainProcessor(dbProvider, new BlockchainProcessor(readOnlyTree, blockProcessor, recoveryStep, logManager, false, false)); }
protected BlockProducerContext GetProducerChain() { BlockProducerContext Create() { ReadOnlyDbProvider dbProvider = new ReadOnlyDbProvider(_api.DbProvider, false); ReadOnlyBlockTree blockTree = new ReadOnlyBlockTree(_api.BlockTree); ReadOnlyTxProcessingEnv txProcessingEnv = new ReadOnlyTxProcessingEnv(dbProvider, blockTree, _api.SpecProvider, _api.LogManager); ReadOnlyTxProcessorSource txProcessorSource = new ReadOnlyTxProcessorSource(txProcessingEnv); BlockProcessor blockProcessor = CreateBlockProcessor(txProcessingEnv, txProcessorSource, dbProvider); IBlockchainProcessor blockchainProcessor = new BlockchainProcessor( blockTree, blockProcessor, _api.RecoveryStep, _api.LogManager, BlockchainProcessor.Options.NoReceipts); OneTimeChainProcessor chainProcessor = new OneTimeChainProcessor( dbProvider, blockchainProcessor); return(new BlockProducerContext { ChainProcessor = chainProcessor, ReadOnlyStateProvider = txProcessingEnv.StateProvider, TxSource = CreateTxSourceForProducer(txProcessingEnv, txProcessorSource), ReadOnlyTxProcessingEnv = txProcessingEnv, ReadOnlyTxProcessorSource = txProcessorSource }); } return(_blockProducerContext ??= Create()); }
protected BlockProducerContext GetProducerChain() { BlockProducerContext Create() { ReadOnlyDbProvider readOnlyDbProvider = new ReadOnlyDbProvider(_context.DbProvider, false); ReadOnlyBlockTree readOnlyBlockTree = new ReadOnlyBlockTree(_context.BlockTree); ReadOnlyTxProcessingEnv readOnlyTxProcessingEnv = new ReadOnlyTxProcessingEnv(readOnlyDbProvider, readOnlyBlockTree, _context.SpecProvider, _context.LogManager); var readOnlyTransactionProcessorSource = new ReadOnlyTransactionProcessorSource(readOnlyTxProcessingEnv); BlockProcessor blockProcessor = CreateBlockProcessor(readOnlyTxProcessingEnv, readOnlyTransactionProcessorSource, readOnlyDbProvider); OneTimeChainProcessor chainProcessor = new OneTimeChainProcessor(readOnlyDbProvider, new BlockchainProcessor(readOnlyBlockTree, blockProcessor, _context.RecoveryStep, _context.LogManager, BlockchainProcessor.Options.NoReceipts)); return(new BlockProducerContext { ChainProcessor = chainProcessor, ReadOnlyStateProvider = readOnlyTxProcessingEnv.StateProvider, TxSource = CreateTxSourceForProducer(readOnlyTxProcessingEnv, readOnlyTransactionProcessorSource), ReadOnlyTxProcessingEnv = readOnlyTxProcessingEnv, ReadOnlyTransactionProcessorSource = readOnlyTransactionProcessorSource }); } return(_blockProducerContext ??= Create()); }
private BlockProducerContext GetProducerChain() { BlockProducerContext Create() { ReadOnlyDbProvider dbProvider = _api.DbProvider.AsReadOnly(false); ReadOnlyBlockTree blockTree = _api.BlockTree.AsReadOnly(); ReadOnlyTxProcessingEnv txProcessingEnv = new ReadOnlyTxProcessingEnv(dbProvider, _api.ReadOnlyTrieStore, blockTree, _api.SpecProvider, _api.LogManager); BlockProcessor blockProcessor = CreateBlockProcessor(txProcessingEnv, txProcessingEnv, dbProvider); IBlockchainProcessor blockchainProcessor = new BlockchainProcessor( blockTree, blockProcessor, _api.BlockPreprocessor, _api.LogManager, BlockchainProcessor.Options.NoReceipts); OneTimeChainProcessor chainProcessor = new OneTimeChainProcessor( dbProvider, blockchainProcessor); return(new BlockProducerContext { ChainProcessor = chainProcessor, ReadOnlyStateProvider = txProcessingEnv.StateProvider, TxSource = CreateTxSourceForProducer(txProcessingEnv, txProcessingEnv), ReadOnlyTxProcessingEnv = txProcessingEnv }); } return(_blockProducerContext ??= Create()); }
public Task InitBlockProducer() { if (_nethermindApi !.SealEngineType != SealEngineType.Clique) { return(Task.CompletedTask); } var(getFromApi, setInApi) = _nethermindApi !.ForProducer; _miningConfig = getFromApi.Config <IMiningConfig>(); if (!_miningConfig.Enabled) { throw new InvalidOperationException("Request to start block producer while mining disabled."); } setInApi.Sealer = new CliqueSealer( getFromApi.EngineSigner !, _cliqueConfig !, _snapshotManager !, getFromApi.LogManager); ReadOnlyDbProvider readOnlyDbProvider = getFromApi.DbProvider.AsReadOnly(false); ReadOnlyBlockTree readOnlyBlockTree = getFromApi.BlockTree.AsReadOnly(); ReadOnlyTxProcessingEnv producerEnv = new ReadOnlyTxProcessingEnv( readOnlyDbProvider, getFromApi.ReadOnlyTrieStore, readOnlyBlockTree, getFromApi.SpecProvider, getFromApi.LogManager); BlockProcessor producerProcessor = new BlockProcessor( getFromApi !.SpecProvider, getFromApi !.BlockValidator, NoBlockRewards.Instance, producerEnv.TransactionProcessor, producerEnv.StateProvider, producerEnv.StorageProvider, NullTxPool.Instance, // do not remove transactions from the pool when preprocessing NullReceiptStorage.Instance, NullWitnessCollector.Instance, getFromApi.LogManager); IBlockchainProcessor producerChainProcessor = new BlockchainProcessor( readOnlyBlockTree, producerProcessor, getFromApi.BlockPreprocessor, getFromApi.LogManager, BlockchainProcessor.Options.NoReceipts); OneTimeChainProcessor chainProcessor = new OneTimeChainProcessor( readOnlyDbProvider, producerChainProcessor); ITxFilter txFilter = new MinGasPriceTxFilter(_miningConfig !.MinGasPrice); ITxSource txSource = new TxPoolTxSource( getFromApi.TxPool, getFromApi.StateReader, getFromApi.LogManager, txFilter); var gasLimitCalculator = new TargetAdjustedGasLimitCalculator(getFromApi.SpecProvider, _miningConfig); setInApi.BlockProducer = new CliqueBlockProducer( txSource, chainProcessor, producerEnv.StateProvider, getFromApi.BlockTree !, getFromApi.Timestamper, getFromApi.CryptoRandom, _snapshotManager !, getFromApi.Sealer !, gasLimitCalculator, getFromApi.SpecProvider, _cliqueConfig !, getFromApi.LogManager); return(Task.CompletedTask); }
public Task <IBlockProducer> InitBlockProducer(IBlockProductionTrigger?blockProductionTrigger = null, ITxSource?additionalTxSource = null) { if (_nethermindApi !.SealEngineType != Nethermind.Core.SealEngineType.Clique) { return(Task.FromResult((IBlockProducer)null)); } var(getFromApi, setInApi) = _nethermindApi !.ForProducer; _miningConfig = getFromApi.Config <IMiningConfig>(); if (!_miningConfig.Enabled) { throw new InvalidOperationException("Request to start block producer while mining disabled."); } setInApi.Sealer = new CliqueSealer( getFromApi.EngineSigner !, _cliqueConfig !, _snapshotManager !, getFromApi.LogManager); ReadOnlyDbProvider readOnlyDbProvider = getFromApi.DbProvider.AsReadOnly(false); ReadOnlyBlockTree readOnlyBlockTree = getFromApi.BlockTree.AsReadOnly(); ITransactionComparerProvider transactionComparerProvider = getFromApi.TransactionComparerProvider; ReadOnlyTxProcessingEnv producerEnv = new ReadOnlyTxProcessingEnv( readOnlyDbProvider, getFromApi.ReadOnlyTrieStore, readOnlyBlockTree, getFromApi.SpecProvider, getFromApi.LogManager); BlockProcessor producerProcessor = new BlockProcessor( getFromApi !.SpecProvider, getFromApi !.BlockValidator, NoBlockRewards.Instance, getFromApi.BlockProducerEnvFactory.TransactionsExecutorFactory.Create(producerEnv), producerEnv.StateProvider, producerEnv.StorageProvider, // do not remove transactions from the pool when preprocessing NullReceiptStorage.Instance, NullWitnessCollector.Instance, getFromApi.LogManager); IBlockchainProcessor producerChainProcessor = new BlockchainProcessor( readOnlyBlockTree, producerProcessor, getFromApi.BlockPreprocessor, getFromApi.LogManager, BlockchainProcessor.Options.NoReceipts); OneTimeChainProcessor chainProcessor = new OneTimeChainProcessor( readOnlyDbProvider, producerChainProcessor); ITxFilterPipeline txFilterPipeline = TxFilterPipelineBuilder.CreateStandardFilteringPipeline( _nethermindApi.LogManager, getFromApi.SpecProvider, _miningConfig); TxPoolTxSource txPoolTxSource = new( getFromApi.TxPool, getFromApi.SpecProvider, transactionComparerProvider, getFromApi.LogManager, txFilterPipeline); IGasLimitCalculator gasLimitCalculator = setInApi.GasLimitCalculator = new TargetAdjustedGasLimitCalculator(getFromApi.SpecProvider, _miningConfig); IBlockProducer blockProducer = new CliqueBlockProducer( additionalTxSource.Then(txPoolTxSource), chainProcessor, producerEnv.StateProvider, getFromApi.BlockTree !, getFromApi.Timestamper, getFromApi.CryptoRandom, _snapshotManager !, getFromApi.Sealer !, gasLimitCalculator, getFromApi.SpecProvider, _cliqueConfig !, getFromApi.LogManager); return(Task.FromResult(blockProducer)); }