public MergeBlockDownloaderFactory(IPoSSwitcher poSSwitcher,
                                    IBeaconPivot beaconPivot,
                                    ISpecProvider specProvider,
                                    IBlockTree blockTree,
                                    IBlockCacheService blockCacheService,
                                    IReceiptStorage receiptStorage,
                                    IBlockValidator blockValidator,
                                    ISealValidator sealValidator,
                                    ISyncPeerPool peerPool,
                                    ISyncConfig syncConfig,
                                    IBetterPeerStrategy betterPeerStrategy,
                                    ISyncReport syncReport,
                                    ISyncProgressResolver syncProgressResolver,
                                    ILogManager logManager)
 {
     _poSSwitcher          = poSSwitcher ?? throw new ArgumentNullException(nameof(poSSwitcher));
     _beaconPivot          = beaconPivot ?? throw new ArgumentNullException(nameof(beaconPivot));
     _specProvider         = specProvider ?? throw new ArgumentNullException(nameof(specProvider));
     _blockTree            = blockTree ?? throw new ArgumentNullException(nameof(blockTree));
     _receiptStorage       = receiptStorage ?? throw new ArgumentNullException(nameof(receiptStorage));
     _blockValidator       = blockValidator ?? throw new ArgumentNullException(nameof(blockValidator));
     _sealValidator        = sealValidator ?? throw new ArgumentNullException(nameof(sealValidator));
     _syncPeerPool         = peerPool ?? throw new ArgumentNullException(nameof(peerPool));
     _betterPeerStrategy   = betterPeerStrategy ?? throw new ArgumentNullException(nameof(betterPeerStrategy));
     _logManager           = logManager ?? throw new ArgumentNullException(nameof(logManager));
     _syncReport           = syncReport ?? throw new ArgumentNullException(nameof(syncReport));
     _chainLevelHelper     = new ChainLevelHelper(_blockTree, _beaconPivot, syncConfig, _logManager);
     _syncProgressResolver = syncProgressResolver ?? throw new ArgumentNullException(nameof(syncProgressResolver));;
 }
Example #2
0
        public FastHeadersSyncFeed(IBlockTree blockTree, ISyncPeerPool syncPeerPool, ISyncConfig syncConfig, ISyncReport syncReport, ILogManager logManager)
            : base(logManager)
        {
            _syncPeerPool = syncPeerPool ?? throw new ArgumentNullException(nameof(syncPeerPool));
            _syncReport   = syncReport ?? throw new ArgumentNullException(nameof(syncReport));
            _blockTree    = blockTree ?? throw new ArgumentNullException(nameof(blockTree));
            _syncConfig   = syncConfig ?? throw new ArgumentNullException(nameof(syncConfig));
            _logger       = logManager?.GetClassLogger <FastHeadersSyncFeed>() ?? throw new ArgumentNullException(nameof(FastHeadersSyncFeed));

            if (!_syncConfig.UseGethLimitsInFastBlocks)
            {
                _headersRequestSize = NethermindSyncLimits.MaxHeaderFetch;
            }

            if (!_syncConfig.FastBlocks)
            {
                throw new InvalidOperationException("Entered fast blocks mode without fast blocks enabled in configuration.");
            }

            _pivotNumber = _syncConfig.PivotNumberParsed;

            BlockHeader lowestInserted       = _blockTree.LowestInsertedHeader;
            long        startNumber          = lowestInserted?.Number ?? _pivotNumber;
            Keccak      startHeaderHash      = lowestInserted?.Hash ?? _syncConfig.PivotHashParsed;
            UInt256     startTotalDifficulty = lowestInserted?.TotalDifficulty ?? _syncConfig.PivotTotalDifficultyParsed;

            _nextHeaderHash = startHeaderHash;
            _nextHeaderDiff = startTotalDifficulty;

            _lowestRequestedHeaderNumber = startNumber + 1;

            Activate();
        }
        public void Setup()
        {
            _receiptStorage = Substitute.For <IReceiptStorage>();
            _blockTree      = Substitute.For <IBlockTree>();

            _syncConfig = new SyncConfig {
                FastBlocks = true
            };
            _syncConfig.PivotNumber = _pivotNumber.ToString();
            _syncConfig.PivotHash   = Keccak.Zero.ToString();

            _syncPeerPool = Substitute.For <ISyncPeerPool>();
            _syncReport   = Substitute.For <ISyncReport>();

            _measuredProgress      = new MeasuredProgress();
            _measuredProgressQueue = new MeasuredProgress();
            _syncReport.FastBlocksReceipts.Returns(_measuredProgress);
            _syncReport.ReceiptsInQueue.Returns(_measuredProgressQueue);

            _selector = Substitute.For <ISyncModeSelector>();

            _feed = new FastReceiptsSyncFeed(
                _selector,
                _specProvider,
                _blockTree,
                _receiptStorage,
                _syncPeerPool,
                _syncConfig,
                _syncReport,
                LimboLogs.Instance);
        }
Example #4
0
        public ReceiptsSyncFeed(
            ISyncModeSelector syncModeSelector,
            ISpecProvider specProvider,
            IBlockTree blockTree,
            IReceiptStorage receiptStorage,
            ISyncPeerPool syncPeerPool,
            ISyncConfig syncConfig,
            ISyncReport syncReport,
            ILogManager logManager)
            : base(syncModeSelector)
        {
            _logger         = logManager?.GetClassLogger() ?? throw new ArgumentNullException(nameof(logManager));
            _receiptStorage = receiptStorage ?? throw new ArgumentNullException(nameof(receiptStorage));
            _specProvider   = specProvider ?? throw new ArgumentNullException(nameof(specProvider));
            _syncPeerPool   = syncPeerPool ?? throw new ArgumentNullException(nameof(syncPeerPool));
            _syncConfig     = syncConfig ?? throw new ArgumentNullException(nameof(syncConfig));
            _syncReport     = syncReport ?? throw new ArgumentNullException(nameof(syncReport));
            _blockTree      = blockTree ?? throw new ArgumentNullException(nameof(blockTree));

            if (!_syncConfig.FastBlocks)
            {
                throw new InvalidOperationException("Entered fast blocks mode without fast blocks enabled in configuration.");
            }

            _pivotNumber    = _syncConfig.PivotNumberParsed;
            _syncStatusList = new SyncStatusList(
                _blockTree,
                _pivotNumber,
                _receiptStorage.LowestInsertedReceiptBlockNumber);
        }
Example #5
0
        public SyncServer(
            ISnapshotableDb stateDb,
            ISnapshotableDb codeDb,
            IBlockTree blockTree,
            IReceiptFinder receiptFinder,
            IBlockValidator blockValidator,
            ISealValidator sealValidator,
            ISyncPeerPool pool,
            ISyncModeSelector syncModeSelector,
            ISyncConfig syncConfig,
            ILogManager logManager,
            CanonicalHashTrie cht = null)
        {
            _syncConfig       = syncConfig ?? throw new ArgumentNullException(nameof(syncConfig));
            _pool             = pool ?? throw new ArgumentNullException(nameof(pool));
            _syncModeSelector = syncModeSelector ?? throw new ArgumentNullException(nameof(syncModeSelector));
            _sealValidator    = sealValidator ?? throw new ArgumentNullException(nameof(sealValidator));
            _stateDb          = stateDb ?? throw new ArgumentNullException(nameof(stateDb));
            _codeDb           = codeDb ?? throw new ArgumentNullException(nameof(codeDb));
            _blockTree        = blockTree ?? throw new ArgumentNullException(nameof(blockTree));
            _receiptFinder    = receiptFinder ?? throw new ArgumentNullException(nameof(receiptFinder));
            _blockValidator   = blockValidator ?? throw new ArgumentNullException(nameof(blockValidator));
            _logger           = logManager.GetClassLogger() ?? throw new ArgumentNullException(nameof(logManager));
            _cht         = cht;
            _pivotNumber = _syncConfig.PivotNumberParsed;

            _blockTree.NewHeadBlock += OnNewHeadBlock;
            _pivotHash = new Keccak(_syncConfig.PivotHash ?? Keccak.Zero.ToString());
        }
Example #6
0
        public BodiesSyncFeed(
            ISyncModeSelector syncModeSelector,
            IBlockTree blockTree,
            ISyncPeerPool syncPeerPool,
            ISyncConfig syncConfig,
            ISyncReport syncReport,
            ISpecProvider specProvider,
            ILogManager logManager) : base(syncModeSelector)
        {
            _logger       = logManager?.GetClassLogger() ?? throw new ArgumentNullException(nameof(logManager));
            _blockTree    = blockTree ?? throw new ArgumentNullException(nameof(blockTree));
            _syncPeerPool = syncPeerPool ?? throw new ArgumentNullException(nameof(syncPeerPool));
            _syncConfig   = syncConfig ?? throw new ArgumentNullException(nameof(syncConfig));
            _syncReport   = syncReport ?? throw new ArgumentNullException(nameof(syncReport));
            _specProvider = specProvider ?? throw new ArgumentNullException(nameof(specProvider));

            if (!_syncConfig.FastBlocks)
            {
                throw new InvalidOperationException(
                          "Entered fast blocks mode without fast blocks enabled in configuration.");
            }

            _pivotNumber = _syncConfig.PivotNumberParsed;
            _barrier     = _barrier = _syncConfig.AncientBodiesBarrierCalc;
            if (_logger.IsInfo)
            {
                _logger.Info($"Using pivot {_pivotNumber} and barrier {_barrier} in bodies sync");
            }

            _syncStatusList = new SyncStatusList(
                _blockTree,
                _pivotNumber,
                _blockTree.LowestInsertedBodyNumber);
        }
Example #7
0
        public async Task Smoke(bool fastSync, bool fastBlocks)
        {
            ISyncModeSelector selector = Substitute.For <ISyncModeSelector>();
            ISyncPeerPool     pool     = Substitute.For <ISyncPeerPool>();

            pool.InitializedPeersCount.Returns(1);

            Queue <SyncMode> _syncModes = new();

            _syncModes.Enqueue(SyncMode.WaitingForBlock);
            _syncModes.Enqueue(SyncMode.FastSync);
            _syncModes.Enqueue(SyncMode.Full);
            _syncModes.Enqueue(SyncMode.FastBlocks);
            _syncModes.Enqueue(SyncMode.StateNodes);
            _syncModes.Enqueue(SyncMode.Disconnected);

            SyncConfig syncConfig = new();

            syncConfig.FastBlocks = fastBlocks;
            syncConfig.FastSync   = fastSync;

            SyncReport syncReport = new (pool, Substitute.For <INodeStatsManager>(), selector, syncConfig, Substitute.For <IPivot>(), LimboLogs.Instance, 10);

            selector.Current.Returns((ci) => _syncModes.Count > 0 ? _syncModes.Dequeue() : SyncMode.Full);
            await Task.Delay(200);

            syncReport.FastBlocksHeaders.MarkEnd();
            syncReport.FastBlocksBodies.MarkEnd();
            syncReport.FastBlocksReceipts.MarkEnd();
            await Task.Delay(20);
        }
Example #8
0
        public ProtocolsManager(
            ISyncPeerPool syncPeerPool,
            ISyncServer syncServer,
            ITxPool txPool,
            IDiscoveryApp discoveryApp,
            IMessageSerializationService serializationService,
            IRlpxPeer localPeer,
            INodeStatsManager nodeStatsManager,
            IProtocolValidator protocolValidator,
            INetworkStorage peerStorage,
            ISpecProvider specProvider,
            ILogManager logManager)
        {
            _syncPool          = syncPeerPool ?? throw new ArgumentNullException(nameof(syncPeerPool));
            _syncServer        = syncServer ?? throw new ArgumentNullException(nameof(syncServer));
            _txPool            = txPool ?? throw new ArgumentNullException(nameof(txPool));
            _discoveryApp      = discoveryApp ?? throw new ArgumentNullException(nameof(discoveryApp));
            _serializer        = serializationService ?? throw new ArgumentNullException(nameof(serializationService));
            _localPeer         = localPeer ?? throw new ArgumentNullException(nameof(localPeer));
            _stats             = nodeStatsManager ?? throw new ArgumentNullException(nameof(nodeStatsManager));
            _protocolValidator = protocolValidator ?? throw new ArgumentNullException(nameof(protocolValidator));
            _peerStorage       = peerStorage ?? throw new ArgumentNullException(nameof(peerStorage));
            _specProvider      = specProvider ?? throw new ArgumentNullException(nameof(specProvider));
            _logManager        = logManager ?? throw new ArgumentNullException(nameof(logManager));
            _logger            = _logManager?.GetClassLogger() ?? throw new ArgumentNullException(nameof(logManager));

            _protocolFactories        = GetProtocolFactories();
            localPeer.SessionCreated += SessionCreated;
        }
        public MultiSyncModeSelector(
            ISyncProgressResolver syncProgressResolver,
            ISyncPeerPool syncPeerPool,
            ISyncConfig syncConfig,
            ILogManager logManager,
            bool needToWaitForHeaders = false)
        {
            _logger               = logManager.GetClassLogger() ?? throw new ArgumentNullException(nameof(logManager));
            _syncConfig           = syncConfig ?? throw new ArgumentNullException(nameof(syncConfig));
            _syncPeerPool         = syncPeerPool ?? throw new ArgumentNullException(nameof(syncPeerPool));
            _syncProgressResolver = syncProgressResolver ?? throw new ArgumentNullException(nameof(syncProgressResolver));
            _needToWaitForHeaders = needToWaitForHeaders;

            if (syncConfig.FastSyncCatchUpHeightDelta <= FastSyncLag)
            {
                if (_logger.IsWarn)
                {
                    _logger.Warn($"'FastSyncCatchUpHeightDelta' parameter is less or equal to {FastSyncLag}, which is a threshold of blocks always downloaded in full sync. 'FastSyncCatchUpHeightDelta' will have no effect.");
                }
            }

            PivotNumber = _syncConfig.PivotNumberParsed;

            _timer = StartUpdateTimer();
        }
Example #10
0
        public void Smoke(bool fastSync, bool fastBlocks)
        {
            ISyncModeSelector selector = Substitute.For <ISyncModeSelector>();
            ISyncPeerPool     pool     = Substitute.For <ISyncPeerPool>();

            pool.InitializedPeersCount.Returns(1);

            Queue <SyncMode> _syncModes = new Queue <SyncMode>();

            _syncModes.Enqueue(SyncMode.None);
            _syncModes.Enqueue(SyncMode.FastSync);
            _syncModes.Enqueue(SyncMode.Full);
            _syncModes.Enqueue(SyncMode.FastBlocks);
            _syncModes.Enqueue(SyncMode.StateNodes);

            SyncConfig syncConfig = new SyncConfig();

            syncConfig.FastBlocks = fastBlocks;
            syncConfig.FastSync   = fastSync;

            SyncReport syncReport = new SyncReport(pool, Substitute.For <INodeStatsManager>(), selector, syncConfig, LimboLogs.Instance, 10);

            selector.Current.Returns((ci) => _syncModes.Count > 0 ? _syncModes.Dequeue() : SyncMode.Full);
            Thread.Sleep(200);
            syncReport.FastBlocksHeaders.MarkEnd();
            syncReport.FastBlocksBodies.MarkEnd();
            syncReport.FastBlocksReceipts.MarkEnd();
            Thread.Sleep(20);
        }
Example #11
0
        public FastBodiesSyncFeed(IBlockTree blockTree, ISyncPeerPool syncPeerPool, ISyncConfig syncConfig, ISyncReport syncReport, ILogManager logManager)
            : base(logManager)
        {
            _logger       = logManager?.GetClassLogger() ?? throw new ArgumentNullException(nameof(logManager));
            _blockTree    = blockTree ?? throw new ArgumentNullException(nameof(blockTree));
            _syncPeerPool = syncPeerPool ?? throw new ArgumentNullException(nameof(syncPeerPool));
            _syncConfig   = syncConfig ?? throw new ArgumentNullException(nameof(syncConfig));
            _syncReport   = syncReport ?? throw new ArgumentNullException(nameof(syncReport));

            if (!_syncConfig.UseGethLimitsInFastBlocks)
            {
                _bodiesRequestSize = NethermindSyncLimits.MaxBodyFetch;
            }

            if (!_syncConfig.FastBlocks)
            {
                throw new InvalidOperationException("Entered fast blocks mode without fast blocks enabled in configuration.");
            }

            _pivotNumber = _syncConfig.PivotNumberParsed;
            _pivotHash   = _syncConfig.PivotHashParsed;

            Block  lowestInsertedBody = _blockTree.LowestInsertedBody;
            Keccak startBodyHash      = lowestInsertedBody?.Hash ?? _pivotHash;

            _lowestRequestedBodyHash = startBodyHash;

            Activate();
        }
Example #12
0
        public Synchronizer(
            IDbProvider dbProvider,
            ISpecProvider specProvider,
            IBlockTree blockTree,
            IReceiptStorage receiptStorage,
            IBlockValidator blockValidator,
            ISealValidator sealValidator,
            ISyncPeerPool peerPool,
            INodeStatsManager nodeStatsManager,
            ISyncModeSelector syncModeSelector,
            ISyncConfig syncConfig,
            ILogManager logManager)
        {
            _dbProvider       = dbProvider ?? throw new ArgumentNullException(nameof(dbProvider));
            _syncMode         = syncModeSelector ?? throw new ArgumentNullException(nameof(syncModeSelector));
            _logger           = logManager?.GetClassLogger() ?? throw new ArgumentNullException(nameof(logManager));
            _specProvider     = specProvider ?? throw new ArgumentNullException(nameof(specProvider));
            _blockTree        = blockTree ?? throw new ArgumentNullException(nameof(blockTree));
            _receiptStorage   = receiptStorage ?? throw new ArgumentNullException(nameof(receiptStorage));
            _blockValidator   = blockValidator ?? throw new ArgumentNullException(nameof(blockValidator));
            _sealValidator    = sealValidator ?? throw new ArgumentNullException(nameof(sealValidator));
            _syncConfig       = syncConfig ?? throw new ArgumentNullException(nameof(syncConfig));
            _syncPeerPool     = peerPool ?? throw new ArgumentNullException(nameof(peerPool));
            _nodeStatsManager = nodeStatsManager ?? throw new ArgumentNullException(nameof(nodeStatsManager));
            _logManager       = logManager;

            _syncReport = new SyncReport(_syncPeerPool, _nodeStatsManager, _syncMode, syncConfig, logManager);
        }
Example #13
0
 public HeadersSyncDispatcher(
     ISyncFeed <HeadersSyncBatch> syncFeed,
     ISyncPeerPool syncPeerPool,
     IPeerAllocationStrategyFactory <FastBlocksBatch> peerAllocationStrategy,
     ILogManager logManager)
     : base(syncFeed, syncPeerPool, peerAllocationStrategy, logManager)
 {
 }
Example #14
0
 public ReceiptsSyncDispatcher(
     ISyncFeed <ReceiptsSyncBatch> syncFeed,
     ISyncPeerPool syncPeerPool,
     IPeerAllocationStrategyFactory <ReceiptsSyncBatch> peerAllocationStrategy,
     ILogManager logManager)
     : base(syncFeed, syncPeerPool, peerAllocationStrategy, logManager)
 {
 }
Example #15
0
        public void Can_write_no_peers()
        {
            ISyncPeerPool   syncPeerPool = Substitute.For <ISyncPeerPool>();
            SyncPeersReport report       = new(syncPeerPool, Substitute.For <INodeStatsManager>(), NoErrorLimboLogs.Instance);

            report.WriteShortReport();
            report.WriteFullReport();
        }
Example #16
0
 public MissingReceiptsFixVisitor(long startLevel, long endLevel, IReceiptStorage receiptStorage, ILogManager logManager, ISyncPeerPool syncPeerPool, CancellationToken cancellationToken)
     : base(startLevel, endLevel, receiptStorage, logManager)
 {
     _receiptStorage    = receiptStorage;
     _syncPeerPool      = syncPeerPool;
     _cancellationToken = cancellationToken;
     _delay             = TimeSpan.FromSeconds(5);
 }
            public SyncingContext(SynchronizerType synchronizerType)
            {
                _logger = _logManager.GetClassLogger();
                ISyncConfig syncConfig  = synchronizerType == SynchronizerType.Fast ? SyncConfig.WithFastSync : SyncConfig.WithFullSyncOnly;
                IDbProvider dbProvider  = TestMemDbProvider.Init();
                IDb         stateDb     = new MemDb();
                IDb         codeDb      = dbProvider.CodeDb;
                MemDb       blockInfoDb = new MemDb();

                BlockTree = new BlockTree(new MemDb(), new MemDb(), blockInfoDb, new ChainLevelInfoRepository(blockInfoDb), new SingleReleaseSpecProvider(Constantinople.Instance, 1), NullBloomStorage.Instance, _logManager);
                ITimerFactory    timerFactory = Substitute.For <ITimerFactory>();
                NodeStatsManager stats        = new NodeStatsManager(timerFactory, _logManager);

                SyncPeerPool = new SyncPeerPool(BlockTree, stats, 25, _logManager);

                SyncProgressResolver syncProgressResolver = new SyncProgressResolver(
                    BlockTree,
                    NullReceiptStorage.Instance,
                    stateDb,
                    new MemDb(),
                    new TrieStore(stateDb, LimboLogs.Instance),
                    syncConfig,
                    _logManager);
                MultiSyncModeSelector syncModeSelector = new MultiSyncModeSelector(syncProgressResolver, SyncPeerPool, syncConfig, _logManager);

                Synchronizer = new Synchronizer(
                    dbProvider,
                    MainnetSpecProvider.Instance,
                    BlockTree,
                    NullReceiptStorage.Instance,
                    Always.Valid,
                    Always.Valid,
                    SyncPeerPool,
                    stats,
                    syncModeSelector,
                    syncConfig,
                    _logManager);

                SyncServer = new SyncServer(
                    stateDb,
                    codeDb,
                    BlockTree,
                    NullReceiptStorage.Instance,
                    Always.Valid,
                    Always.Valid,
                    SyncPeerPool,
                    syncModeSelector,
                    syncConfig,
                    new WitnessCollector(new MemDb(), LimboLogs.Instance),
                    _logManager);

                SyncPeerPool.Start();

                Synchronizer.Start();
                Synchronizer.SyncEvent += SynchronizerOnSyncEvent;

                AllInstances.Add(this);
            }
Example #18
0
        protected SyncDispatcher(ISyncFeed <T> syncFeed, ISyncPeerPool syncPeerPool, IPeerAllocationStrategyFactory <T> peerAllocationStrategy, ILogManager logManager)
        {
            Logger                 = logManager?.GetClassLogger <SyncDispatcher <T> >() ?? throw new ArgumentNullException(nameof(logManager));
            Feed                   = syncFeed ?? throw new ArgumentNullException(nameof(syncFeed));
            SyncPeerPool           = syncPeerPool ?? throw new ArgumentNullException(nameof(syncPeerPool));
            PeerAllocationStrategy = peerAllocationStrategy ?? throw new ArgumentNullException(nameof(peerAllocationStrategy));

            syncFeed.StateChanged += SyncFeedOnStateChanged;
        }
Example #19
0
 public SyncPeersReport(ISyncPeerPool peerPool, INodeStatsManager statsManager, ILogManager logManager)
 {
     lock (_writeLock)
     {
         _peerPool = peerPool ?? throw new ArgumentNullException(nameof(peerPool));
         _stats    = statsManager ?? throw new ArgumentNullException(nameof(statsManager));
         _logger   = logManager?.GetClassLogger() ?? throw new ArgumentNullException(nameof(logManager));
     }
 }
Example #20
0
        public void Switch_correctly_from_full_sync_to_state_nodes_catch_up()
        {
            ISyncProgressResolver syncProgressResolver = Substitute.For <ISyncProgressResolver>();

            syncProgressResolver.FindBestHeader().Returns(Scenario.ChainHead.Number);
            syncProgressResolver.FindBestFullBlock().Returns(Scenario.ChainHead.Number);
            syncProgressResolver.FindBestFullState().Returns(Scenario.ChainHead.Number - MultiSyncModeSelector.FastSyncLag);
            syncProgressResolver.FindBestProcessedBlock().Returns(0);
            syncProgressResolver.IsFastBlocksFinished().Returns(FastBlocksState.FinishedReceipts);
            syncProgressResolver.ChainDifficulty.Returns(UInt256.Zero);

            List <ISyncPeer> syncPeers = new();

            BlockHeader header   = Scenario.ChainHead;
            ISyncPeer   syncPeer = Substitute.For <ISyncPeer>();

            syncPeer.HeadHash.Returns(header.Hash);
            syncPeer.HeadNumber.Returns(header.Number);
            syncPeer.TotalDifficulty.Returns(header.TotalDifficulty ?? 0);
            syncPeer.IsInitialized.Returns(true);
            syncPeer.ClientId.Returns("nethermind");

            syncPeers.Add(syncPeer);
            ISyncPeerPool          syncPeerPool = Substitute.For <ISyncPeerPool>();
            IEnumerable <PeerInfo> peerInfos    = syncPeers.Select(p => new PeerInfo(p));

            syncPeerPool.InitializedPeers.Returns(peerInfos);
            syncPeerPool.AllPeers.Returns(peerInfos);

            ISyncConfig syncConfig = new SyncConfig()
            {
                FastSyncCatchUpHeightDelta = 2
            };

            syncConfig.FastSync = true;

            TotalDifficultyBetterPeerStrategy bestPeerStrategy = new(LimboLogs.Instance);
            MultiSyncModeSelector             selector         = new(syncProgressResolver, syncPeerPool, syncConfig, No.BeaconSync, bestPeerStrategy, LimboLogs.Instance);

            selector.Stop();
            syncProgressResolver.FindBestProcessedBlock().Returns(Scenario.ChainHead.Number);
            selector.Update();
            selector.Current.Should().Be(SyncMode.Full);

            for (uint i = 0; i < syncConfig.FastSyncCatchUpHeightDelta + 1; i++)
            {
                long number = header.Number + i;
                syncPeer.HeadNumber.Returns(number);
                syncPeer.TotalDifficulty.Returns(header.TotalDifficulty.Value + i);
                syncProgressResolver.FindBestHeader().Returns(number);
                syncProgressResolver.FindBestFullBlock().Returns(number);
                selector.Update();
            }

            selector.Current.Should().Be(SyncMode.StateNodes);
        }
        public async Task Can_read_dependent_items_from_state_db_while_waiting_for_dependencies()
        {
            StateDb codeDb  = new StateDb();
            StateDb stateDB = new StateDb();
            MemDb   tempDb  = new MemDb();

            SyncConfig syncConfig = new SyncConfig();

            syncConfig.FastSync = true;

            IBlockTree    blockTree = Substitute.For <IBlockTree>();
            ISyncPeerPool pool      = Substitute.For <ISyncPeerPool>();

            SyncProgressResolver syncProgressResolver = new SyncProgressResolver(blockTree, NullReceiptStorage.Instance, stateDB, new MemDb(), syncConfig, LimboLogs.Instance);
            ISyncModeSelector    syncModeSelector     = new MultiSyncModeSelector(syncProgressResolver, pool, syncConfig, LimboLogs.Instance);
            StateSyncFeed        stateSyncFeed        = new StateSyncFeed(codeDb, stateDB, tempDb, syncModeSelector, blockTree, LimboLogs.Instance);

            // so we want to setup a trie in a structure of -> branch into two leaves
            // so we can respond with the branch node and with leaves missing
            // and we can prove that we can read the branch from the temp DB while it is still missing from the State DB

            AccountDecoder accountDecoder = new AccountDecoder();

            TrieNode leaf   = TrieNodeFactory.CreateLeaf(new HexPrefix(true, new byte[] { 1, 2, 3 }), accountDecoder.Encode(Account.TotallyEmpty).Bytes);
            TrieNode branch = TrieNodeFactory.CreateBranch();

            branch.SetChild(1, leaf);
            branch.ResolveKey(true);

            // PatriciaTree tree = new PatriciaTree();
            // tree = new PatriciaTree();
            // tree.Set(branch.Keccak.Bytes, branch.Value);

            stateSyncFeed.ResetStateRoot(0, branch.Keccak);

            var request = await stateSyncFeed.PrepareRequest();

            BuildRequestAndHandleResponse(branch, request, stateSyncFeed);

            byte[] value = tempDb.Get(branch.Keccak);
            value.Should().BeEquivalentTo(branch.FullRlp);

            byte[] valueFromState = stateDB.Get(branch.Keccak);
            valueFromState.Should().BeNull();

            request = await stateSyncFeed.PrepareRequest();

            BuildRequestAndHandleResponse(leaf, request, stateSyncFeed);

            value = tempDb.Get(branch.Keccak);
            value.Should().BeNull();

            valueFromState = stateDB.Get(branch.Keccak);
            valueFromState.Should().BeEquivalentTo(branch.FullRlp);
        }
Example #22
0
        public void Setup()
        {
            _nodeWhoSentTheBlock = Substitute.For <ISyncPeer>();
            _nodeWhoSentTheBlock.Node.Returns(new Node(TestItem.PublicKeyA, "127.0.0.1", 30303));
            _peerPool = Substitute.For <ISyncPeerPool>();

            _blockTree    = Substitute.For <IBlockTree>();
            _synchronizer = Substitute.For <ISynchronizer>();
            var selector = StaticSelector.Full;

            _syncServer = new SyncServer(new StateDb(), new StateDb(), _blockTree, NullReceiptStorage.Instance, Always.Valid, Always.Valid, _peerPool, selector, new SyncConfig(), LimboLogs.Instance);
        }
Example #23
0
        public Context(
            IBlockTree?blockTree     = null,
            ISyncConfig?syncConfig   = null,
            IBeaconPivot?beaconPivot = null,
            IDb?metadataDb           = null,
            IMergeConfig?mergeConfig = null)
        {
            if (blockTree == null)
            {
                IDb   blockInfoDb = new MemDb();
                Block genesis     = Build.A.Block.Genesis.TestObject;
                BlockTree = new BlockTree(new MemDb(), new MemDb(), blockInfoDb, new ChainLevelInfoRepository(blockInfoDb), MainnetSpecProvider.Instance, NullBloomStorage.Instance, LimboLogs.Instance);
                BlockTree.SuggestBlock(genesis);
            }
            else
            {
                BlockTree = blockTree;
            }

            ISyncPeerPool    peerPool         = Substitute.For <ISyncPeerPool>();
            ISyncReport      report           = Substitute.For <ISyncReport>();
            MeasuredProgress measuredProgress = new MeasuredProgress();

            report.BeaconHeaders.Returns(measuredProgress);
            report.HeadersInQueue.Returns(measuredProgress);

            MemDb stateDb = new();

            _syncConfig  = syncConfig ?? new SyncConfig();
            _mergeConfig = mergeConfig ?? new MergeConfig();
            _metadataDb  = metadataDb ?? new MemDb();
            PoSSwitcher poSSwitcher = new(_mergeConfig, _syncConfig, _metadataDb, blockTree !,
                                          MainnetSpecProvider.Instance, LimboLogs.Instance);

            ProgressTracker progressTracker = new(BlockTree, stateDb, LimboLogs.Instance);

            SyncProgressResolver syncProgressResolver = new(
                BlockTree,
                NullReceiptStorage.Instance,
                stateDb,
                new TrieStore(stateDb, LimboLogs.Instance),
                progressTracker,
                _syncConfig,
                LimboLogs.Instance);
            TotalDifficultyBetterPeerStrategy bestPeerStrategy = new (LimboLogs.Instance);

            BeaconPivot = beaconPivot ?? new BeaconPivot(_syncConfig, _metadataDb, BlockTree, LimboLogs.Instance);
            BeaconSync  = new(BeaconPivot, BlockTree, _syncConfig, new BlockCacheService(), LimboLogs.Instance);
            ISyncModeSelector selector = new MultiSyncModeSelector(syncProgressResolver, peerPool, _syncConfig, BeaconSync, bestPeerStrategy, LimboLogs.Instance);

            Feed = new BeaconHeadersSyncFeed(poSSwitcher, selector, blockTree, peerPool, _syncConfig, report, BeaconPivot, _mergeConfig,
                                             new NoopInvalidChainTracker(), LimboLogs.Instance);
        }
            public Context()
            {
                _channel = Substitute.For <IChannel>();
                _channelHandlerContext = Substitute.For <IChannelHandlerContext>();
                _pipeline = Substitute.For <IChannelPipeline>();
                _channelHandlerContext.Channel.Returns(_channel);
                _channel.Pipeline.Returns(_pipeline);
                _pipeline.Get <ZeroPacketSplitter>().Returns(new ZeroPacketSplitter(LimboLogs.Instance));
                _packetSender = Substitute.For <IPacketSender>();
                _syncServer   = Substitute.For <ISyncServer>();
                _syncServer   = Substitute.For <ISyncServer>();
                _syncServer.Genesis.Returns(Build.A.Block.Genesis.TestObject.Header);
                _syncServer.Head.Returns(Build.A.BlockHeader.TestObject);
                _txPool             = Substitute.For <ITxPool>();
                _pooledTxsRequestor = Substitute.For <IPooledTxsRequestor>();
                _discoveryApp       = Substitute.For <IDiscoveryApp>();
                _serializer         = new MessageSerializationService();
                _rlpxHost           = Substitute.For <IRlpxHost>();
                _rlpxHost.LocalPort.Returns(_localPort);
                _rlpxHost.LocalNodeId.Returns(TestItem.PublicKeyA);
                ITimerFactory timerFactory = Substitute.For <ITimerFactory>();

                _nodeStatsManager = new NodeStatsManager(timerFactory, LimboLogs.Instance);
                _blockTree        = Substitute.For <IBlockTree>();
                _blockTree.ChainId.Returns(1ul);
                _blockTree.Genesis.Returns(Build.A.Block.Genesis.TestObject.Header);
                _protocolValidator = new ProtocolValidator(_nodeStatsManager, _blockTree, LimboLogs.Instance);
                _peerStorage       = Substitute.For <INetworkStorage>();
                _syncPeerPool      = Substitute.For <ISyncPeerPool>();
                _gossipPolicy      = Substitute.For <IGossipPolicy>();
                _manager           = new ProtocolsManager(
                    _syncPeerPool,
                    _syncServer,
                    _txPool,
                    _pooledTxsRequestor,
                    _discoveryApp,
                    _serializer,
                    _rlpxHost,
                    _nodeStatsManager,
                    _protocolValidator,
                    _peerStorage,
                    MainnetSpecProvider.Instance,
                    _gossipPolicy,
                    LimboLogs.Instance);

                _serializer.Register(new HelloMessageSerializer());
                _serializer.Register(new StatusMessageSerializer());
                _serializer.Register(new DisconnectMessageSerializer());
            }
Example #25
0
        public void Can_write_one_uninitialized_one_initialized()
        {
            ISyncPeerPool syncPeerPool = Substitute.For <ISyncPeerPool>();
            var           syncPeer     = BuildPeer(false);
            var           syncPeer2    = BuildPeer(true);

            var peers = new[] { syncPeer, syncPeer2 };

            syncPeerPool.PeerCount.Returns(peers.Length);

            SyncPeersReport report = new(syncPeerPool, Substitute.For <INodeStatsManager>(), NoErrorLimboLogs.Instance);

            report.WriteShortReport();
            report.WriteFullReport();
        }
        private void PrepareDownloader(ISyncPeer syncPeer)
        {
            DbContext dbContext = new DbContext(_logger);
            BlockTree blockTree = Build.A.BlockTree().OfChainLength((int)BlockTree.BestSuggestedHeader.Number).TestObject;

            _pool = new SyncPeerPool(blockTree, new NodeStatsManager(new StatsConfig(), LimboLogs.Instance), 25, LimboLogs.Instance);
            _pool.Start();
            _pool.AddPeer(syncPeer);

            SyncConfig syncConfig = new SyncConfig();

            syncConfig.FastSync = true;
            _syncModeSelector   = StaticSelector.StateNodesWithFastBlocks;
            _feed = new StateSyncFeed(dbContext.LocalCodeDb, dbContext.LocalStateDb, new MemDb(), _syncModeSelector, blockTree, _logManager);
            _stateSyncDispatcher = new StateSyncDispatcher(_feed, _pool, new StateSyncAllocationStrategyFactory(), _logManager);
        }
Example #27
0
        public void Can_write_report_update_with_allocations()
        {
            ISyncPeerPool syncPeerPool = Substitute.For <ISyncPeerPool>();
            var           syncPeer     = BuildPeer(false);
            var           syncPeer2    = BuildPeer(true);

            var peers = new[] { syncPeer, syncPeer2 };

            syncPeerPool.PeerCount.Returns(peers.Length);

            syncPeerPool.AllPeers.Returns(peers);

            SyncPeersReport report = new(syncPeerPool, Substitute.For <INodeStatsManager>(), NoErrorLimboLogs.Instance);

            report.WriteShortReport();
            report.WriteFullReport();

            syncPeer.IsInitialized.Returns(true);
            report.WriteShortReport();
            report.WriteFullReport();
        }
Example #28
0
 public BlockDownloaderFactory(
     ISpecProvider specProvider,
     IBlockTree blockTree,
     IReceiptStorage receiptStorage,
     IBlockValidator blockValidator,
     ISealValidator sealValidator,
     ISyncPeerPool peerPool,
     IBetterPeerStrategy betterPeerStrategy,
     ISyncReport syncReport,
     ILogManager logManager)
 {
     _specProvider       = specProvider ?? throw new ArgumentNullException(nameof(specProvider));
     _blockTree          = blockTree ?? throw new ArgumentNullException(nameof(blockTree));
     _receiptStorage     = receiptStorage ?? throw new ArgumentNullException(nameof(receiptStorage));
     _blockValidator     = blockValidator ?? throw new ArgumentNullException(nameof(blockValidator));
     _sealValidator      = sealValidator ?? throw new ArgumentNullException(nameof(sealValidator));
     _syncPeerPool       = peerPool ?? throw new ArgumentNullException(nameof(peerPool));
     _betterPeerStrategy = betterPeerStrategy ?? throw new ArgumentNullException(nameof(betterPeerStrategy));
     _syncReport         = syncReport ?? throw new ArgumentNullException(nameof(syncReport));
     _logManager         = logManager ?? throw new ArgumentNullException(nameof(logManager));
 }
        public BlockDownloader(
            ISyncFeed <BlocksRequest> feed,
            ISyncPeerPool syncPeerPool,
            IBlockTree blockTree,
            IBlockValidator blockValidator,
            ISealValidator sealValidator,
            ISyncReport syncReport,
            IReceiptStorage receiptStorage,
            ISpecProvider specProvider,
            ILogManager logManager)
            : base(feed, syncPeerPool, new BlocksSyncPeerAllocationStrategyFactory(), logManager)
        {
            _blockTree      = blockTree ?? throw new ArgumentNullException(nameof(blockTree));
            _blockValidator = blockValidator ?? throw new ArgumentNullException(nameof(blockValidator));
            _sealValidator  = sealValidator ?? throw new ArgumentNullException(nameof(sealValidator));
            _syncReport     = syncReport ?? throw new ArgumentNullException(nameof(syncReport));
            _receiptStorage = receiptStorage ?? throw new ArgumentNullException(nameof(receiptStorage));
            _specProvider   = specProvider ?? throw new ArgumentNullException(nameof(specProvider));
            _logger         = logManager.GetClassLogger() ?? throw new ArgumentNullException(nameof(logManager));

            _syncBatchSize           = new SyncBatchSize(logManager);
            _blockTree.NewHeadBlock += BlockTreeOnNewHeadBlock;
        }
 public MergeSynchronizer(
     IDbProvider dbProvider,
     ISpecProvider specProvider,
     IBlockTree blockTree,
     IReceiptStorage receiptStorage,
     ISyncPeerPool peerPool,
     INodeStatsManager nodeStatsManager,
     ISyncModeSelector syncModeSelector,
     ISyncConfig syncConfig,
     ISnapProvider snapProvider,
     IBlockDownloaderFactory blockDownloaderFactory,
     IPivot pivot,
     IPoSSwitcher poSSwitcher,
     IMergeConfig mergeConfig,
     IInvalidChainTracker invalidChainTracker,
     ILogManager logManager,
     ISyncReport syncReport)
     : base(
         dbProvider,
         specProvider,
         blockTree,
         receiptStorage,
         peerPool,
         nodeStatsManager,
         syncModeSelector,
         syncConfig,
         snapProvider,
         blockDownloaderFactory,
         pivot,
         syncReport,
         logManager)
 {
     _invalidChainTracker = invalidChainTracker;
     _poSSwitcher         = poSSwitcher;
     _mergeConfig         = mergeConfig;
 }