예제 #1
0
 public ForkchoiceUpdatedV1Handler(
     IBlockTree blockTree,
     IManualBlockFinalizationManager manualBlockFinalizationManager,
     IPoSSwitcher poSSwitcher,
     IPayloadPreparationService payloadPreparationService,
     IBlockProcessingQueue processingQueue,
     IBlockCacheService blockCacheService,
     IInvalidChainTracker invalidChainTracker,
     IMergeSyncController mergeSyncController,
     IBeaconPivot beaconPivot,
     IPeerRefresher peerRefresher,
     ILogManager logManager)
 {
     _blockTree = blockTree ?? throw new ArgumentNullException(nameof(blockTree));
     _manualBlockFinalizationManager = manualBlockFinalizationManager ?? throw new ArgumentNullException(nameof(manualBlockFinalizationManager));
     _poSSwitcher = poSSwitcher ?? throw new ArgumentNullException(nameof(poSSwitcher));
     _payloadPreparationService = payloadPreparationService;
     _processingQueue           = processingQueue;
     _blockCacheService         = blockCacheService;
     _invalidChainTracker       = invalidChainTracker;
     _mergeSyncController       = mergeSyncController;
     _beaconPivot   = beaconPivot;
     _peerRefresher = peerRefresher;
     _logger        = logManager.GetClassLogger();
 }
예제 #2
0
    public void Beacon_pivot_defaults_to_sync_config_values_when_there_is_no_pivot()
    {
        IPeerRefresher peerRefresher = Substitute.For <IPeerRefresher>();
        IBeaconPivot   pivot         = new BeaconPivot(_syncConfig, new MemDb(), Substitute.For <IBlockTree>(), LimboLogs.Instance);

        pivot.PivotHash.Should().Be(_syncConfig.PivotHashParsed);
        pivot.PivotNumber.Should().Be(_syncConfig.PivotNumberParsed);
        pivot.PivotDestinationNumber.Should().Be(0);
    }
예제 #3
0
        public Task InitSynchronization()
        {
            if (MergeEnabled)
            {
                if (_api.SpecProvider is null)
                {
                    throw new ArgumentNullException(nameof(_api.SpecProvider));
                }
                if (_api.SyncPeerPool is null)
                {
                    throw new ArgumentNullException(nameof(_api.SyncPeerPool));
                }
                if (_api.BlockTree is null)
                {
                    throw new ArgumentNullException(nameof(_api.BlockTree));
                }
                if (_api.DbProvider is null)
                {
                    throw new ArgumentNullException(nameof(_api.DbProvider));
                }
                if (_api.SyncProgressResolver is null)
                {
                    throw new ArgumentNullException(nameof(_api.SyncProgressResolver));
                }
                if (_api.BlockProcessingQueue is null)
                {
                    throw new ArgumentNullException(nameof(_api.BlockProcessingQueue));
                }
                if (_blockCacheService is null)
                {
                    throw new ArgumentNullException(nameof(_blockCacheService));
                }
                if (_api.BetterPeerStrategy is null)
                {
                    throw new ArgumentNullException(nameof(_api.BetterPeerStrategy));
                }
                if (_api.SealValidator is null)
                {
                    throw new ArgumentNullException(nameof(_api.SealValidator));
                }
                if (_api.UnclesValidator is null)
                {
                    throw new ArgumentNullException(nameof(_api.UnclesValidator));
                }
                if (_api.NodeStatsManager is null)
                {
                    throw new ArgumentNullException(nameof(_api.NodeStatsManager));
                }
                if (_api.HeaderValidator is null)
                {
                    throw new ArgumentNullException(nameof(_api.HeaderValidator));
                }
                if (_api.PeerDifficultyRefreshPool is null)
                {
                    throw new ArgumentNullException(nameof(_api.PeerDifficultyRefreshPool));
                }

                // ToDo strange place for validators initialization
                PeerRefresher peerRefresher = new(_api.PeerDifficultyRefreshPool, _api.TimerFactory, _api.LogManager);
                _peerRefresher = peerRefresher;
                _api.DisposeStack.Push(peerRefresher);
                _beaconPivot = new BeaconPivot(_syncConfig, _api.DbProvider.MetadataDb, _api.BlockTree, _api.LogManager);

                MergeHeaderValidator headerValidator = new(
                    _poSSwitcher,
                    _api.HeaderValidator,
                    _api.BlockTree,
                    _api.SpecProvider,
                    _api.SealValidator,
                    _api.LogManager);

                _api.HeaderValidator = new InvalidHeaderInterceptor(
                    headerValidator,
                    _invalidChainTracker,
                    _api.LogManager);

                _api.UnclesValidator = new MergeUnclesValidator(_poSSwitcher, _api.UnclesValidator);
                _api.BlockValidator  = new InvalidBlockInterceptor(
                    new BlockValidator(
                        _api.TxValidator,
                        _api.HeaderValidator,
                        _api.UnclesValidator,
                        _api.SpecProvider,
                        _api.LogManager),
                    _invalidChainTracker,
                    _api.LogManager);
                _beaconSync = new BeaconSync(_beaconPivot, _api.BlockTree, _syncConfig, _blockCacheService, _api.LogManager);

                _api.BetterPeerStrategy = new MergeBetterPeerStrategy(_api.BetterPeerStrategy, _poSSwitcher, _beaconPivot, _api.LogManager);

                _api.SyncModeSelector = new MultiSyncModeSelector(
                    _api.SyncProgressResolver,
                    _api.SyncPeerPool,
                    _syncConfig,
                    _beaconSync,
                    _api.BetterPeerStrategy !,
                    _api.LogManager);
                _api.Pivot = _beaconPivot;

                SyncReport syncReport = new(_api.SyncPeerPool, _api.NodeStatsManager, _api.SyncModeSelector, _syncConfig, _beaconPivot, _api.LogManager);

                _api.BlockDownloaderFactory = new MergeBlockDownloaderFactory(
                    _poSSwitcher,
                    _beaconPivot,
                    _api.SpecProvider,
                    _api.BlockTree,
                    _blockCacheService,
                    _api.ReceiptStorage !,
                    _api.BlockValidator !,
                    _api.SealValidator !,
                    _api.SyncPeerPool,
                    _syncConfig,
                    _api.BetterPeerStrategy !,
                    syncReport,
                    _api.SyncProgressResolver,
                    _api.LogManager);
                _api.Synchronizer = new MergeSynchronizer(
                    _api.DbProvider,
                    _api.SpecProvider !,
                    _api.BlockTree !,
                    _api.ReceiptStorage !,
                    _api.SyncPeerPool,
                    _api.NodeStatsManager !,
                    _api.SyncModeSelector,
                    _syncConfig,
                    _api.SnapProvider,
                    _api.BlockDownloaderFactory,
                    _api.Pivot,
                    _poSSwitcher,
                    _mergeConfig,
                    _invalidChainTracker,
                    _api.LogManager,
                    syncReport);
            }

            return(Task.CompletedTask);
        }