Example #1
0
        public void Regular_trigger_works()
        {
            int triggered = 0;
            BuildBlocksRegularly trigger = new BuildBlocksRegularly(TimeSpan.FromMilliseconds(5));

            trigger.TriggerBlockProduction += (s, e) => triggered++;
            Thread.Sleep(50);

            triggered.Should().BeInRange(1, 20);
        }
        public async Task Regular_trigger_works()
        {
            int triggered = 0;
            BuildBlocksRegularly trigger = new BuildBlocksRegularly(TimeSpan.FromMilliseconds(5));

            trigger.TriggerBlockProduction += (s, e) => triggered++;
            await Task.Delay(50);

            triggered.Should().BeInRange(1, 20);
        }
Example #3
0
        public Task <IBlockProducer> InitBlockProducer(IBlockProductionTrigger?blockProductionTrigger = null, ITxSource?additionalTxSource = null)
        {
            if (_nethermindApi !.SealEngineType != Nethermind.Core.SealEngineType.NethDev)
            {
                return(Task.FromResult((IBlockProducer)null));
            }
            var(getFromApi, setInApi) = _nethermindApi !.ForProducer;

            ReadOnlyDbProvider readOnlyDbProvider = getFromApi.DbProvider.AsReadOnly(false);
            ReadOnlyBlockTree  readOnlyBlockTree  = getFromApi.BlockTree.AsReadOnly();

            ITxFilterPipeline txFilterPipeline = new TxFilterPipelineBuilder(_nethermindApi.LogManager)
                                                 .WithBaseFeeFilter(getFromApi.SpecProvider)
                                                 .WithNullTxFilter()
                                                 .WithMinGasPriceFilter(_nethermindApi.Config <IMiningConfig>().MinGasPrice, getFromApi.SpecProvider)
                                                 .Build;

            TxPoolTxSource txPoolTxSource = new(
                getFromApi.TxPool,
                getFromApi.SpecProvider,
                getFromApi.TransactionComparerProvider !,
                getFromApi.LogManager,
                txFilterPipeline);

            ILogger logger = getFromApi.LogManager.GetClassLogger();

            if (logger.IsWarn)
            {
                logger.Warn("Starting Neth Dev block producer & sealer");
            }


            ReadOnlyTxProcessingEnv producerEnv = new(
                readOnlyDbProvider,
                getFromApi.ReadOnlyTrieStore,
                readOnlyBlockTree,
                getFromApi.SpecProvider,
                getFromApi.LogManager);

            BlockProcessor producerProcessor = new(
                getFromApi !.SpecProvider,
                getFromApi !.BlockValidator,
                NoBlockRewards.Instance,
                new BlockProcessor.BlockProductionTransactionsExecutor(producerEnv, getFromApi !.SpecProvider, getFromApi.LogManager),
                producerEnv.StateProvider,
                producerEnv.StorageProvider,
                NullReceiptStorage.Instance,
                NullWitnessCollector.Instance,
                getFromApi.LogManager);

            IBlockchainProcessor producerChainProcessor = new BlockchainProcessor(
                readOnlyBlockTree,
                producerProcessor,
                getFromApi.BlockPreprocessor,
                getFromApi.LogManager,
                BlockchainProcessor.Options.NoReceipts);

            DefaultBlockProductionTrigger = new BuildBlocksRegularly(TimeSpan.FromMilliseconds(200))
                                            .IfPoolIsNotEmpty(getFromApi.TxPool)
                                            .Or(getFromApi.ManualBlockProductionTrigger);

            IBlockProducer blockProducer = new DevBlockProducer(
                additionalTxSource.Then(txPoolTxSource).ServeTxsOneByOne(),
                producerChainProcessor,
                producerEnv.StateProvider,
                getFromApi.BlockTree,
                blockProductionTrigger ?? DefaultBlockProductionTrigger,
                getFromApi.Timestamper,
                getFromApi.SpecProvider,
                getFromApi.Config <IMiningConfig>(),
                getFromApi.LogManager);

            return(Task.FromResult(blockProducer));
        }