コード例 #1
0
        public void should_add_bundle_with_correct_timestamps()
        {
            ITimestamper timestamper = new ManualTimestamper(DateTime.UtcNow);
            ulong        timestamp   = timestamper.UnixTime.Seconds;

            TestContext test = new TestContext(timestamper);

            BundleTransaction[] tx1 =
            {
                Build.A.TypedTransaction <BundleTransaction>().SignedAndResolved(TestItem.PrivateKeyD).TestObject
            };
            BundleTransaction[] tx2 =
            {
                Build.A.TypedTransaction <BundleTransaction>().SignedAndResolved(TestItem.PrivateKeyA).TestObject
            };

            MevConfig mevConfig     = new MevConfig();
            UInt256   bundleHorizon = mevConfig.BundleHorizon;

            MevBundle[] bundles = new[]
            {
                new MevBundle(1, tx1, 0, 0), new MevBundle(2, tx1, timestamp + 5, timestamp),        //min > max
                new MevBundle(3, tx1, timestamp - 5, timestamp + 5),
                new MevBundle(4, tx2, timestamp - 10, timestamp - 5),                                //max < curr
                new MevBundle(4, tx2, timestamp + bundleHorizon, timestamp + bundleHorizon + 10),
                new MevBundle(5, tx2, timestamp + bundleHorizon + 1, timestamp + bundleHorizon + 10) //min too large
            };

            bundles.Select(b => test.BundlePool.AddBundle(b))
            .Should().BeEquivalentTo(new bool[] { true, false, true, false, true, false });
        }
コード例 #2
0
 public MergeTestBlockchain(ManualTimestamper timestamper)
 {
     Timestamper         = timestamper;
     GenesisBlockBuilder = Core.Test.Builders.Build.A.Block.Genesis.Genesis
                           .WithTimestamp(UInt256.One);
     Signer = new Eth2Signer(MinerAddress);
 }
コード例 #3
0
 public AssembleBlockHandler(IBlockTree blockTree, IManualBlockProductionTrigger blockProductionTrigger, ManualTimestamper timestamper, ILogManager logManager)
 {
     _blockTree = blockTree;
     _blockProductionTrigger = blockProductionTrigger;
     _timestamper            = timestamper;
     _logger = logManager.GetClassLogger();
 }
コード例 #4
0
        public async Task SetUp()
        {
            _dbProvider = await TestMemDbProvider.InitAsync();

            _timestamper          = new ManualTimestamper();
            _blockTree            = Substitute.For <IBlockTree>();
            _txPool               = Substitute.For <ITxPool>();
            _receiptStorage       = Substitute.For <IReceiptStorage>();
            _filterStore          = Substitute.For <IFilterStore>();
            _filterManager        = Substitute.For <IFilterManager>();
            _transactionProcessor = Substitute.For <ITransactionProcessor>();
            _ethereumEcdsa        = Substitute.For <IEthereumEcdsa>();
            _specProvider         = MainnetSpecProvider.Instance;

            ReadOnlyTxProcessingEnv processingEnv = new ReadOnlyTxProcessingEnv(
                new ReadOnlyDbProvider(_dbProvider, false),
                new TrieStore(_dbProvider.StateDb, LimboLogs.Instance).AsReadOnly(),
                new ReadOnlyBlockTree(_blockTree),
                _specProvider,
                LimboLogs.Instance);

            processingEnv.TransactionProcessor = _transactionProcessor;

            _blockchainBridge = new BlockchainBridge(
                processingEnv,
                _txPool,
                _receiptStorage,
                _filterStore,
                _filterManager,
                _ethereumEcdsa,
                _timestamper,
                Substitute.For <ILogFinder>(),
                false,
                false);
        }
コード例 #5
0
        public void step_is_calculated_correctly(long milliSeconds, int stepDuration)
        {
            var time        = DateTimeOffset.FromUnixTimeMilliseconds(milliSeconds);
            var timestamper = new ManualTimestamper(time.UtcDateTime);
            var calculator  = new AuRaStepCalculator(GetStepDurationsForSingleStep(stepDuration), timestamper, LimboLogs.Instance);

            calculator.CurrentStep.Should().Be(time.ToUnixTimeSeconds() / stepDuration);
        }
コード例 #6
0
        public void after_waiting_for_next_step_timeToNextStep_should_be_close_to_stepDuration_in_seconds(int stepDuration)
        {
            var manualTimestamper = new ManualTimestamper(DateTime.Now);
            var calculator        = new AuRaStepCalculator(GetStepDurationsForSingleStep(stepDuration), manualTimestamper, LimboLogs.Instance);

            manualTimestamper.Add(calculator.TimeToNextStep);
            calculator.TimeToNextStep.Should().BeCloseTo(TimeSpan.FromSeconds(stepDuration), TimeSpan.FromMilliseconds(200));
        }
コード例 #7
0
        public void step_increases_after_timeToNextStep(int stepDuration)
        {
            var manualTimestamper = new ManualTimestamper(DateTime.Now);
            var calculator        = new AuRaStepCalculator(GetStepDurationsForSingleStep(stepDuration), manualTimestamper, LimboLogs.Instance);
            var step = calculator.CurrentStep;

            manualTimestamper.Add(calculator.TimeToNextStep);
            calculator.CurrentStep.Should().Be(step + 1, calculator.TimeToNextStep.ToString());
        }
コード例 #8
0
        public void Current_starting_from_non_zero()
        {
            ManualTimestamper manualTimestamper = new ManualTimestamper();
            MeasuredProgress  measuredProgress  = new MeasuredProgress(manualTimestamper);

            measuredProgress.Update(10L);
            measuredProgress.SetMeasuringPoint();
            manualTimestamper.Add(TimeSpan.FromMilliseconds(100));
            measuredProgress.Update(20L);
            Assert.LessOrEqual(measuredProgress.CurrentPerSecond, 105M);
        }
コード例 #9
0
        public void Update_twice_current_per_second()
        {
            ManualTimestamper manualTimestamper = new ManualTimestamper();
            MeasuredProgress  measuredProgress  = new MeasuredProgress(manualTimestamper);

            measuredProgress.Update(0L);
            measuredProgress.SetMeasuringPoint();
            manualTimestamper.Add(TimeSpan.FromMilliseconds(100));
            measuredProgress.Update(1L);
            Assert.LessOrEqual(measuredProgress.CurrentPerSecond, 10M);
            Assert.GreaterOrEqual(measuredProgress.CurrentPerSecond, 4M);
        }
コード例 #10
0
        public void time_to_step_is_calculated_correctly(long milliSeconds, int stepDuration, int checkedStep)
        {
            const long currentStep    = 50000030;
            TimeSpan   timeToNextStep = TimeSpan.FromMilliseconds(1995);
            var        time           = DateTimeOffset.FromUnixTimeMilliseconds(milliSeconds);
            var        timestamper    = new ManualTimestamper(time.UtcDateTime);
            var        calculator     = new AuRaStepCalculator(GetStepDurationsForSingleStep(stepDuration), timestamper, LimboLogs.Instance);
            TimeSpan   expected       = checkedStep <= currentStep?TimeSpan.FromMilliseconds(0) : TimeSpan.FromSeconds((checkedStep - currentStep - 1) * stepDuration) + timeToNextStep;

            TestContext.Out.WriteLine($"Expected time to step {checkedStep} is {expected}");
            calculator.TimeToStep(checkedStep).Should().Be(expected);
        }
コード例 #11
0
        public async Task Update_thrice_result_per_second()
        {
            ManualTimestamper manualTimestamper = new ManualTimestamper();
            MeasuredProgress  measuredProgress  = new MeasuredProgress(manualTimestamper);

            measuredProgress.Update(0L);
            measuredProgress.SetMeasuringPoint();
            manualTimestamper.Add(TimeSpan.FromMilliseconds(100));
            measuredProgress.Update(1L);
            measuredProgress.SetMeasuringPoint();
            manualTimestamper.Add(TimeSpan.FromMilliseconds(100));
            measuredProgress.Update(3L);
            Assert.GreaterOrEqual(measuredProgress.TotalPerSecond, 6M);
            Assert.LessOrEqual(measuredProgress.TotalPerSecond, 15M);
            Assert.GreaterOrEqual(measuredProgress.CurrentPerSecond, 6M);
            Assert.LessOrEqual(measuredProgress.CurrentPerSecond, 30M);
        }
コード例 #12
0
        public void GetBlockProcessorAndProducerIntervalHint_returns_expected_result(
            [ValueSource(nameof(BlockProcessorIntervalHintTestCases))]
            BlockProcessorIntervalHint test)
        {
            ManualTimestamper  manualTimestamper = new ManualTimestamper(DateTime.Now);
            AuRaStepCalculator stepCalculator    = new AuRaStepCalculator(new Dictionary <long, long>()
            {
                { 0, test.StepDuration }
            }, manualTimestamper, LimboLogs.Instance);
            IValidatorStore validatorStore = Substitute.For <IValidatorStore>();

            validatorStore.GetValidators().Returns(new Address[test.ValidatorsCount]);
            IHealthHintService healthHintService = new AuraHealthHintService(stepCalculator, validatorStore);
            ulong?actualProcessing = healthHintService.MaxSecondsIntervalForProcessingBlocksHint();
            ulong?actualProducing  = healthHintService.MaxSecondsIntervalForProducingBlocksHint();

            Assert.AreEqual(test.ExpectedProcessingHint, actualProcessing);
            Assert.AreEqual(test.ExpectedProducingHint, actualProducing);
        }
コード例 #13
0
        public void After_ending_does_not_update_total_or_current()
        {
            ManualTimestamper manualTimestamper = new ManualTimestamper();
            MeasuredProgress  measuredProgress  = new MeasuredProgress(manualTimestamper);

            measuredProgress.Update(0L);
            measuredProgress.SetMeasuringPoint();
            manualTimestamper.Add(TimeSpan.FromMilliseconds(100));
            measuredProgress.Update(1L);
            measuredProgress.SetMeasuringPoint();
            manualTimestamper.Add(TimeSpan.FromMilliseconds(100));
            measuredProgress.Update(3L);
            measuredProgress.MarkEnd();
            manualTimestamper.Add(TimeSpan.FromMilliseconds(100));
            measuredProgress.SetMeasuringPoint();
            manualTimestamper.Add(TimeSpan.FromMilliseconds(100));
            measuredProgress.SetMeasuringPoint();
            manualTimestamper.Add(TimeSpan.FromMilliseconds(100));
            measuredProgress.SetMeasuringPoint();
            Assert.GreaterOrEqual(measuredProgress.TotalPerSecond, 6M);
            Assert.LessOrEqual(measuredProgress.TotalPerSecond, 15M);
            Assert.AreEqual(0M, measuredProgress.CurrentPerSecond);
        }
コード例 #14
0
        public void SetUp()
        {
            _dbProvider = new MemDbProvider();

            _stateReader     = new StateReader(_dbProvider.StateDb, _dbProvider.CodeDb, LimboLogs.Instance);
            _stateProvider   = new StateProvider(_dbProvider.StateDb, _dbProvider.CodeDb, LimboLogs.Instance);
            _storageProvider = new StorageProvider(_dbProvider.StateDb, _stateProvider, LimboLogs.Instance);

            _timestamper          = new ManualTimestamper();
            _blockTree            = Substitute.For <IBlockTree>();
            _txPool               = Substitute.For <ITxPool>();
            _receiptStorage       = Substitute.For <IReceiptStorage>();
            _filterStore          = Substitute.For <IFilterStore>();
            _filterManager        = Substitute.For <IFilterManager>();
            _wallet               = Substitute.For <IWallet>();
            _transactionProcessor = Substitute.For <ITransactionProcessor>();
            _ethereumEcdsa        = Substitute.For <IEthereumEcdsa>();
            _bloomStorage         = Substitute.For <IBloomStorage>();
            _specProvider         = MainnetSpecProvider.Instance;
            _blockchainBridge     = new BlockchainBridge(
                _stateReader,
                _stateProvider,
                _storageProvider,
                _blockTree,
                _txPool,
                _receiptStorage,
                _filterStore,
                _filterManager,
                _wallet,
                _transactionProcessor,
                _ethereumEcdsa,
                _bloomStorage,
                _timestamper,
                LimboLogs.Instance,
                false);
        }
コード例 #15
0
        public void Test()
        {
            ISpecProvider specProvider = MainnetSpecProvider.Instance;
            DbProvider    dbProvider   = new(DbModeHint.Mem);

            dbProvider.RegisterDb(DbNames.BlockInfos, new MemDb());
            dbProvider.RegisterDb(DbNames.Blocks, new MemDb());
            dbProvider.RegisterDb(DbNames.Headers, new MemDb());
            dbProvider.RegisterDb(DbNames.State, new MemDb());
            dbProvider.RegisterDb(DbNames.Code, new MemDb());
            dbProvider.RegisterDb(DbNames.Metadata, new MemDb());

            BlockTree blockTree = new(
                dbProvider,
                new ChainLevelInfoRepository(dbProvider),
                specProvider,
                NullBloomStorage.Instance,
                LimboLogs.Instance);
            TrieStore trieStore = new(
                dbProvider.RegisteredDbs[DbNames.State],
                NoPruning.Instance,
                Archive.Instance,
                LimboLogs.Instance);
            StateProvider stateProvider = new(
                trieStore,
                dbProvider.RegisteredDbs[DbNames.Code],
                LimboLogs.Instance);
            StateReader       stateReader       = new(trieStore, dbProvider.GetDb <IDb>(DbNames.State), LimboLogs.Instance);
            StorageProvider   storageProvider   = new(trieStore, stateProvider, LimboLogs.Instance);
            BlockhashProvider blockhashProvider = new(blockTree, LimboLogs.Instance);
            VirtualMachine    virtualMachine    = new(
                blockhashProvider,
                specProvider,
                LimboLogs.Instance);
            TransactionProcessor txProcessor = new(
                specProvider,
                stateProvider,
                storageProvider,
                virtualMachine,
                LimboLogs.Instance);
            BlockProcessor blockProcessor = new(
                specProvider,
                Always.Valid,
                NoBlockRewards.Instance,
                new BlockProcessor.BlockValidationTransactionsExecutor(txProcessor, stateProvider),
                stateProvider,
                storageProvider,
                NullReceiptStorage.Instance,
                NullWitnessCollector.Instance,
                LimboLogs.Instance);
            BlockchainProcessor blockchainProcessor = new(
                blockTree,
                blockProcessor,
                NullRecoveryStep.Instance,
                stateReader,
                LimboLogs.Instance,
                BlockchainProcessor.Options.Default);
            BuildBlocksWhenRequested trigger          = new();
            ManualTimestamper        timestamper      = new ManualTimestamper();
            DevBlockProducer         devBlockProducer = new(
                EmptyTxSource.Instance,
                blockchainProcessor,
                stateProvider,
                blockTree,
                trigger,
                timestamper,
                specProvider,
                new MiningConfig {
                Enabled = true
            },
                LimboLogs.Instance);

            blockchainProcessor.Start();
            devBlockProducer.Start();
            ProducedBlockSuggester suggester = new ProducedBlockSuggester(blockTree, devBlockProducer);

            AutoResetEvent autoResetEvent = new(false);

            blockTree.NewHeadBlock += (s, e) => autoResetEvent.Set();
            blockTree.SuggestBlock(Build.A.Block.Genesis.TestObject);

            autoResetEvent.WaitOne(1000).Should().BeTrue("genesis");

            trigger.BuildBlock();
            autoResetEvent.WaitOne(1000).Should().BeTrue("1");
            blockTree.Head.Number.Should().Be(1);
        }
コード例 #16
0
        protected virtual async Task <TestBlockchain> Build(ISpecProvider specProvider = null)
        {
            Timestamper    = new ManualTimestamper(new DateTime(2020, 2, 15, 12, 50, 30, DateTimeKind.Utc));
            JsonSerializer = new EthereumJsonSerializer();
            SpecProvider   = specProvider ?? MainnetSpecProvider.Instance;
            EthereumEcdsa  = new EthereumEcdsa(ChainId.Mainnet, LimboLogs.Instance);
            ITxStorage txStorage = new InMemoryTxStorage();

            DbProvider = new MemDbProvider();
            State      = new StateProvider(StateDb, CodeDb, LimboLogs.Instance);
            State.CreateAccount(TestItem.AddressA, 1000.Ether());
            State.CreateAccount(TestItem.AddressB, 1000.Ether());
            State.CreateAccount(TestItem.AddressC, 1000.Ether());
            byte[] code     = Bytes.FromHexString("0xabcd");
            Keccak codeHash = Keccak.Compute(code);

            State.UpdateCode(code);
            State.UpdateCodeHash(TestItem.AddressA, codeHash, SpecProvider.GenesisSpec);

            Storage = new StorageProvider(StateDb, State, LimboLogs.Instance);
            Storage.Set(new StorageCell(TestItem.AddressA, UInt256.One), Bytes.FromHexString("0xabcdef"));
            Storage.Commit();

            State.Commit(SpecProvider.GenesisSpec);
            State.CommitTree();

            TxPool = new TxPool.TxPool(txStorage, Timestamper, EthereumEcdsa, SpecProvider, new TxPoolConfig(), State, LimboLogs.Instance);

            IDb blockDb     = new MemDb();
            IDb headerDb    = new MemDb();
            IDb blockInfoDb = new MemDb();

            BlockTree = new BlockTree(blockDb, headerDb, blockInfoDb, new ChainLevelInfoRepository(blockDb), SpecProvider, TxPool, NullBloomStorage.Instance, LimboLogs.Instance);

            ReceiptStorage = new InMemoryReceiptStorage();
            VirtualMachine virtualMachine = new VirtualMachine(State, Storage, new BlockhashProvider(BlockTree, LimboLogs.Instance), SpecProvider, LimboLogs.Instance);

            TxProcessor    = new TransactionProcessor(SpecProvider, State, Storage, virtualMachine, LimboLogs.Instance);
            BlockProcessor = CreateBlockProcessor();

            BlockchainProcessor chainProcessor = new BlockchainProcessor(BlockTree, BlockProcessor, new TxSignaturesRecoveryStep(EthereumEcdsa, TxPool, LimboLogs.Instance), LimboLogs.Instance, BlockchainProcessor.Options.Default);

            chainProcessor.Start();

            StateReader = new StateReader(StateDb, CodeDb, LimboLogs.Instance);
            TxPoolTxSource txPoolTxSource = new TxPoolTxSource(TxPool, StateReader, LimboLogs.Instance);
            ISealer        sealer         = new FakeSealer(TimeSpan.Zero);

            BlockProducer = new TestBlockProducer(txPoolTxSource, chainProcessor, State, sealer, BlockTree, chainProcessor, Timestamper, LimboLogs.Instance);
            BlockProducer.Start();

            _resetEvent             = new AutoResetEvent(false);
            BlockTree.NewHeadBlock += (s, e) =>
            {
                Console.WriteLine(e.Block.Header.Hash);
                _resetEvent.Set();
            };

            var genesis = GetGenesisBlock();

            BlockTree.SuggestBlock(genesis);
            await _resetEvent.WaitOneAsync(CancellationToken.None);

            await AddBlocksOnStart();

            return(this);
        }
コード例 #17
0
        protected virtual async Task <TestBlockchain> Build(ISpecProvider specProvider = null, UInt256?initialValues = null)
        {
            Timestamper    = new ManualTimestamper(new DateTime(2020, 2, 15, 12, 50, 30, DateTimeKind.Utc));
            JsonSerializer = new EthereumJsonSerializer();
            SpecProvider   = specProvider ?? MainnetSpecProvider.Instance;
            EthereumEcdsa  = new EthereumEcdsa(ChainId.Mainnet, LimboLogs.Instance);
            ITxStorage txStorage = new InMemoryTxStorage();

            DbProvider = await TestMemDbProvider.InitAsync();

            State = new StateProvider(StateDb, CodeDb, LimboLogs.Instance);
            State.CreateAccount(TestItem.AddressA, (initialValues ?? 1000.Ether()));
            State.CreateAccount(TestItem.AddressB, (initialValues ?? 1000.Ether()));
            State.CreateAccount(TestItem.AddressC, (initialValues ?? 1000.Ether()));
            byte[] code     = Bytes.FromHexString("0xabcd");
            Keccak codeHash = Keccak.Compute(code);

            State.UpdateCode(code);
            State.UpdateCodeHash(TestItem.AddressA, codeHash, SpecProvider.GenesisSpec);

            Storage = new StorageProvider(StateDb, State, LimboLogs.Instance);
            Storage.Set(new StorageCell(TestItem.AddressA, UInt256.One), Bytes.FromHexString("0xabcdef"));
            Storage.Commit();

            State.Commit(SpecProvider.GenesisSpec);
            State.CommitTree();

            TxPool = new TxPool.TxPool(
                txStorage,
                EthereumEcdsa,
                SpecProvider,
                new TxPoolConfig(),
                new StateProvider(StateDb, CodeDb, LimboLogs.Instance),
                LimboLogs.Instance);

            IDb blockDb     = new MemDb();
            IDb headerDb    = new MemDb();
            IDb blockInfoDb = new MemDb();

            BlockTree = new BlockTree(blockDb, headerDb, blockInfoDb, new ChainLevelInfoRepository(blockDb), SpecProvider, NullBloomStorage.Instance, LimboLogs.Instance);
            new OnChainTxWatcher(BlockTree, TxPool, SpecProvider, LimboLogs.Instance);

            ReceiptStorage = new InMemoryReceiptStorage();
            VirtualMachine virtualMachine = new VirtualMachine(State, Storage, new BlockhashProvider(BlockTree, LimboLogs.Instance), SpecProvider, LimboLogs.Instance);

            TxProcessor    = new TransactionProcessor(SpecProvider, State, Storage, virtualMachine, LimboLogs.Instance);
            BlockProcessor = CreateBlockProcessor();

            BlockchainProcessor chainProcessor = new BlockchainProcessor(BlockTree, BlockProcessor, new RecoverSignatures(EthereumEcdsa, TxPool, SpecProvider, LimboLogs.Instance), LimboLogs.Instance, Nethermind.Blockchain.Processing.BlockchainProcessor.Options.Default);

            BlockchainProcessor = chainProcessor;
            chainProcessor.Start();

            StateReader = new StateReader(StateDb, CodeDb, LimboLogs.Instance);
            TxPoolTxSource txPoolTxSource = CreateTxPoolTxSource();
            ISealer        sealer         = new NethDevSealEngine(TestItem.AddressD);

            BlockProducer = new TestBlockProducer(txPoolTxSource, chainProcessor, State, sealer, BlockTree, chainProcessor, Timestamper, LimboLogs.Instance);
            BlockProducer.Start();

            _resetEvent = new SemaphoreSlim(0);
            _suggestedBlockResetEvent = new ManualResetEvent(true);
            BlockTree.NewHeadBlock   += (s, e) =>
            {
                _resetEvent.Release(1);
            };
            BlockProducer.LastProducedBlockChanged += (s, e) =>
            {
                _suggestedBlockResetEvent.Set();
            };

            var genesis = GetGenesisBlock();

            BlockTree.SuggestBlock(genesis);
            await _resetEvent.WaitAsync();

            //if (!await _resetEvent.WaitAsync(1000))
            // {
            //     throw new InvalidOperationException("Failed to process genesis in 1s.");
            // }

            await AddBlocksOnStart();

            return(this);
        }
コード例 #18
0
 public void Setup()
 {
     _manualTimestamper = new ManualTimestamper(_startTime);
     _testLogger        = new TestLogger();
     _logManager        = new OneLoggerLogManager(_testLogger);
 }