Example #1
0
        public void Can_keep_changing_in_fast_sync()
        {
            IEthSyncPeerPool syncPeerPool = Substitute.For <IEthSyncPeerPool>();
            ISyncPeer        syncPeer     = Substitute.For <ISyncPeer>();

            syncPeer.TotalDifficultyOnSessionStart.Returns((UInt256)(1024 * 1024));

            PeerInfo peerInfo1 = new PeerInfo(syncPeer)
            {
                HeadNumber = 0, IsInitialized = true
            };

            syncPeerPool.AllPeers.Returns(new[] { peerInfo1 });
            syncPeerPool.UsefulPeers.Returns(new[] { peerInfo1 });
            syncPeerPool.PeerCount.Returns(1);

            SyncConfig syncConfig = new SyncConfig();

            syncConfig.FastSync    = true;
            syncConfig.PivotNumber = null;
            syncConfig.PivotHash   = null;

            ISyncProgressResolver syncProgressResolver = Substitute.For <ISyncProgressResolver>();

            SyncModeSelector selector = new SyncModeSelector(syncProgressResolver, syncPeerPool, syncConfig, LimboLogs.Instance);

            Assert.AreEqual(SyncMode.NotStarted, selector.Current);

            (long BestRemote, long BestLocalHeader, long BestLocalFullBlock, long BestLocalState, SyncMode ExpectedState, string Description)[] states =
        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();
        }
 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));;
 }
 public MergeBlockDownloader(
     IPoSSwitcher posSwitcher,
     IBeaconPivot beaconPivot,
     ISyncFeed <BlocksRequest?>?feed,
     ISyncPeerPool?syncPeerPool,
     IBlockTree?blockTree,
     IBlockValidator?blockValidator,
     ISealValidator?sealValidator,
     ISyncReport?syncReport,
     IReceiptStorage?receiptStorage,
     ISpecProvider specProvider,
     IBetterPeerStrategy betterPeerStrategy,
     IChainLevelHelper chainLevelHelper,
     ISyncProgressResolver syncProgressResolver,
     ILogManager logManager)
     : base(feed, syncPeerPool, blockTree, blockValidator, sealValidator, syncReport, receiptStorage,
            specProvider, new MergeBlocksSyncPeerAllocationStrategyFactory(posSwitcher, beaconPivot, logManager),
            betterPeerStrategy, logManager)
 {
     _blockTree            = blockTree ?? throw new ArgumentNullException(nameof(blockTree));
     _specProvider         = specProvider ?? throw new ArgumentNullException(nameof(specProvider));
     _chainLevelHelper     = chainLevelHelper ?? throw new ArgumentNullException(nameof(chainLevelHelper));
     _poSSwitcher          = posSwitcher ?? throw new ArgumentNullException(nameof(posSwitcher));
     _blockValidator       = blockValidator ?? throw new ArgumentNullException(nameof(blockValidator));
     _syncReport           = syncReport ?? throw new ArgumentNullException(nameof(syncReport));
     _receiptStorage       = receiptStorage ?? throw new ArgumentNullException(nameof(receiptStorage));
     _beaconPivot          = beaconPivot;
     _receiptsRecovery     = new ReceiptsRecovery(new EthereumEcdsa(specProvider.ChainId, logManager), specProvider);
     _syncProgressResolver = syncProgressResolver ?? throw new ArgumentNullException(nameof(syncProgressResolver));
     _logger = logManager.GetClassLogger();
 }
Example #5
0
        public SyncModeSelector(ISyncProgressResolver syncProgressResolver, IEthSyncPeerPool syncPeerPool, ISyncConfig syncConfig, ILogManager logManager)
        {
            _syncProgressResolver = syncProgressResolver ?? throw new ArgumentNullException(nameof(syncProgressResolver));
            _syncPeerPool         = syncPeerPool ?? throw new ArgumentNullException(nameof(syncPeerPool));
            _syncConfig           = syncConfig ?? throw new ArgumentNullException(nameof(syncConfig));
            _logger = logManager.GetClassLogger() ?? throw new ArgumentNullException(nameof(logManager));

            Current = SyncMode.NotStarted;
        }
Example #6
0
        public SyncModeSelector(ISyncProgressResolver syncProgressResolver, IEthSyncPeerPool syncPeerPool, ISyncConfig syncConfig, ILogManager logManager)
        {
            _syncProgressResolver = syncProgressResolver ?? throw new ArgumentNullException(nameof(syncProgressResolver));
            _syncPeerPool         = syncPeerPool ?? throw new ArgumentNullException(nameof(syncPeerPool));
            _logger = logManager.GetClassLogger() ?? throw new ArgumentNullException(nameof(logManager));

            _fastSyncEnabled = syncConfig?.FastSync ?? false;
            Current          = _fastSyncEnabled ? SyncMode.Headers : SyncMode.Full;
        }
Example #7
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);
        }
Example #8
0
        public SyncModeSelector(ISyncProgressResolver syncProgressResolver, IEthSyncPeerPool syncPeerPool, ISyncConfig syncConfig, ILogManager logManager)
        {
            _syncProgressResolver = syncProgressResolver ?? throw new ArgumentNullException(nameof(syncProgressResolver));
            _syncPeerPool         = syncPeerPool ?? throw new ArgumentNullException(nameof(syncPeerPool));
            _syncConfig           = syncConfig ?? throw new ArgumentNullException(nameof(syncConfig));
            _logger = logManager.GetClassLogger() ?? throw new ArgumentNullException(nameof(logManager));

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

            Current = SyncMode.NotStarted;
        }
Example #9
0
 public FastBlocksFinishedState(ISyncProgressResolver syncProgressResolver)
 {
     _syncProgressResolver = syncProgressResolver;
 }
Example #10
0
 public static FastBlocksFinishedState IsFastBlocksFinished(this ISyncProgressResolver syncProgressResolver)
 {
     return(new FastBlocksFinishedState(syncProgressResolver));
 }
Example #11
0
 public AuRaMultiSyncModeSelector(ISyncProgressResolver syncProgressResolver, ISyncPeerPool syncPeerPool, ISyncConfig syncConfig, ILogManager logManager)
     : base(syncProgressResolver, syncPeerPool, syncConfig, logManager)
 {
 }