示例#1
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);
        }
示例#2
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());
        }
示例#3
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);
        }
        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);
        }
示例#5
0
        public async Task Can_enqueue_previously_shelved()
        {
            ISyncModeSelector syncModeSelector = Substitute.For <ISyncModeSelector>();

            SetupBeamProcessor(syncModeSelector);

            EthereumEcdsa ethereumEcdsa = new EthereumEcdsa(ChainId.Mainnet, LimboLogs.Instance);
            Block         newBlock0     = Build.A.Block.WithParent(_blockTree.Head).WithReceiptsRoot(new Keccak("0xeb82c315eaf2c2a5dfc1766b075263d80e8b3ab9cb690d5304cdf114fff26939")).WithTransactions(Build.A.Transaction.SignedAndResolved(ethereumEcdsa, TestItem.PrivateKeyA).TestObject, Build.A.Transaction.SignedAndResolved(ethereumEcdsa, TestItem.PrivateKeyB).TestObject).WithGasUsed(42000).WithTotalDifficulty(_blockTree.Head.TotalDifficulty + 1).TestObject;
            Block         newBlock1     = Build.A.Block.WithParent(newBlock0.Header).WithReceiptsRoot(new Keccak("0xeb82c315eaf2c2a5dfc1766b075263d80e8b3ab9cb690d5304cdf114fff26939")).WithTransactions(Build.A.Transaction.SignedAndResolved(ethereumEcdsa, TestItem.PrivateKeyA).TestObject, Build.A.Transaction.SignedAndResolved(ethereumEcdsa, TestItem.PrivateKeyB).TestObject).WithGasUsed(42000).WithTotalDifficulty(_blockTree.Head.TotalDifficulty + 2).TestObject;
            Block         newBlock2     = Build.A.Block.WithParent(newBlock1.Header).WithReceiptsRoot(new Keccak("0xeb82c315eaf2c2a5dfc1766b075263d80e8b3ab9cb690d5304cdf114fff26939")).WithTransactions(Build.A.Transaction.SignedAndResolved(ethereumEcdsa, TestItem.PrivateKeyA).TestObject, Build.A.Transaction.SignedAndResolved(ethereumEcdsa, TestItem.PrivateKeyB).TestObject).WithGasUsed(42000).WithTotalDifficulty(_blockTree.Head.TotalDifficulty + 3).TestObject;
            Block         newBlock3     = Build.A.Block.WithParent(newBlock2.Header).WithReceiptsRoot(new Keccak("0xeb82c315eaf2c2a5dfc1766b075263d80e8b3ab9cb690d5304cdf114fff26939")).WithTransactions(Build.A.Transaction.SignedAndResolved(ethereumEcdsa, TestItem.PrivateKeyA).TestObject, Build.A.Transaction.SignedAndResolved(ethereumEcdsa, TestItem.PrivateKeyB).TestObject).WithGasUsed(42000).WithTotalDifficulty(_blockTree.Head.TotalDifficulty + 4).TestObject;
            Block         newBlock4     = Build.A.Block.WithParent(newBlock3.Header).WithReceiptsRoot(new Keccak("0xeb82c315eaf2c2a5dfc1766b075263d80e8b3ab9cb690d5304cdf114fff26939")).WithTransactions(Build.A.Transaction.SignedAndResolved(ethereumEcdsa, TestItem.PrivateKeyA).TestObject, Build.A.Transaction.SignedAndResolved(ethereumEcdsa, TestItem.PrivateKeyB).TestObject).WithGasUsed(42000).WithTotalDifficulty(_blockTree.Head.TotalDifficulty + 5).TestObject;

            var args = new SyncModeChangedEventArgs(SyncMode.Beam, SyncMode.Full);

            _blockTree.SuggestBlock(newBlock0);
            syncModeSelector.Preparing += Raise.EventWith(args);
            _blockTree.SuggestBlock(newBlock1);
            syncModeSelector.Changing += Raise.EventWith(args);
            _blockTree.SuggestBlock(newBlock2);
            syncModeSelector.Changed += Raise.EventWith(args);
            _blockTree.SuggestBlock(newBlock3);
            syncModeSelector.Preparing += Raise.EventWith(new SyncModeChangedEventArgs(SyncMode.Beam, SyncMode.Full));
            _blockTree.SuggestBlock(newBlock4);

            await Task.Delay(1000);

            // _blockchainProcessor.Received().Process(newBlock0, ProcessingOptions.Beam, NullBlockTracer.Instance);
            _blockchainProcessingQueue.Received().Enqueue(newBlock1, ProcessingOptions.StoreReceipts);
            _blockchainProcessingQueue.Received().Enqueue(newBlock2, ProcessingOptions.StoreReceipts);
            _blockchainProcessingQueue.Received().Enqueue(newBlock3, ProcessingOptions.StoreReceipts);
            _blockchainProcessingQueue.Received().Enqueue(newBlock4, ProcessingOptions.StoreReceipts);
        }
示例#6
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);
        }
示例#7
0
        public void Test03()
        {
            PeerInfo peer1 = new(null !);
            PeerInfo peer2 = new(null !);

            ISyncModeSelector selector     = Substitute.For <ISyncModeSelector>();
            ISnapProvider     snapProvider = Substitute.For <ISnapProvider>();

            Synchronization.SnapSync.SnapSyncFeed feed = new(selector, snapProvider, null !, LimboLogs.Instance);

            feed.AnalyzeResponsePerPeer(AddRangeResult.OK, peer2);
            feed.AnalyzeResponsePerPeer(AddRangeResult.OK, peer1);
            feed.AnalyzeResponsePerPeer(AddRangeResult.ExpiredRootHash, peer1);
            feed.AnalyzeResponsePerPeer(AddRangeResult.ExpiredRootHash, peer2);
            feed.AnalyzeResponsePerPeer(AddRangeResult.ExpiredRootHash, peer1);
            feed.AnalyzeResponsePerPeer(AddRangeResult.DifferentRootHash, peer2);
            feed.AnalyzeResponsePerPeer(AddRangeResult.ExpiredRootHash, peer1);
            feed.AnalyzeResponsePerPeer(AddRangeResult.ExpiredRootHash, peer1);
            feed.AnalyzeResponsePerPeer(AddRangeResult.ExpiredRootHash, peer1);
            var result = feed.AnalyzeResponsePerPeer(AddRangeResult.DifferentRootHash, peer1);

            Assert.AreEqual(SyncResponseHandlingResult.OK, result);

            snapProvider.Received(1).UpdatePivot();
        }
        public BeamBlockchainProcessor(
            IReadOnlyDbProvider readOnlyDbProvider,
            IBlockTree blockTree,
            ISpecProvider specProvider,
            ILogManager logManager,
            IBlockValidator blockValidator,
            IBlockPreprocessorStep recoveryStep,
            IRewardCalculatorSource rewardCalculatorSource,
            IBlockProcessingQueue processingQueue,
            ISyncModeSelector syncModeSelector)
        {
            _readOnlyDbProvider              = readOnlyDbProvider ?? throw new ArgumentNullException(nameof(readOnlyDbProvider));
            _blockValidator                  = blockValidator ?? throw new ArgumentNullException(nameof(blockValidator));
            _recoveryStep                    = recoveryStep ?? throw new ArgumentNullException(nameof(recoveryStep));
            _rewardCalculatorSource          = rewardCalculatorSource ?? throw new ArgumentNullException(nameof(rewardCalculatorSource));
            _standardProcessorQueue          = processingQueue ?? throw new ArgumentNullException(nameof(processingQueue));
            _syncModeSelector                = syncModeSelector ?? throw new ArgumentNullException(nameof(syncModeSelector));
            _specProvider                    = specProvider ?? throw new ArgumentNullException(nameof(specProvider));
            _logManager                      = logManager ?? throw new ArgumentNullException(nameof(logManager));
            _readOnlyBlockTree               = new ReadOnlyBlockTree(blockTree);
            blockTree.NewBestSuggestedBlock += OnNewBlock;
            _logger      = logManager.GetClassLogger();
            _blockAction = BeamProcess;

            _syncModeSelector.Preparing += SyncModeSelectorOnPreparing;
            _syncModeSelector.Changing  += SyncModeSelectorOnChanging;
            _syncModeSelector.Changed   += SyncModeSelectorOnChanged;
        }
示例#9
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);
        }
示例#10
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);
        }
示例#11
0
        public void Will_ignore_transitions_other_than_full()
        {
            ISyncModeSelector syncModeSelector = Substitute.For <ISyncModeSelector>();

            SetupBeamProcessor(syncModeSelector);

            EthereumEcdsa ethereumEcdsa = new EthereumEcdsa(MainnetSpecProvider.Instance, LimboLogs.Instance);
            Block         newBlock0     = Build.A.Block.WithParent(_blockTree.Head).WithReceiptsRoot(new Keccak("0xeb82c315eaf2c2a5dfc1766b075263d80e8b3ab9cb690d5304cdf114fff26939")).WithTransactions(Build.A.Transaction.SignedAndResolved(ethereumEcdsa, TestItem.PrivateKeyA, 10000000).TestObject, Build.A.Transaction.SignedAndResolved(ethereumEcdsa, TestItem.PrivateKeyB, 10000000).TestObject).WithGasUsed(42000).WithTotalDifficulty(_blockTree.Head.TotalDifficulty + 1).TestObject;
            Block         newBlock1     = Build.A.Block.WithParent(newBlock0.Header).WithReceiptsRoot(new Keccak("0xeb82c315eaf2c2a5dfc1766b075263d80e8b3ab9cb690d5304cdf114fff26939")).WithTransactions(Build.A.Transaction.SignedAndResolved(ethereumEcdsa, TestItem.PrivateKeyA, 10000000).TestObject, Build.A.Transaction.SignedAndResolved(ethereumEcdsa, TestItem.PrivateKeyB, 10000000).TestObject).WithGasUsed(42000).WithTotalDifficulty(_blockTree.Head.TotalDifficulty + 2).TestObject;
            Block         newBlock2     = Build.A.Block.WithParent(newBlock1.Header).WithReceiptsRoot(new Keccak("0xeb82c315eaf2c2a5dfc1766b075263d80e8b3ab9cb690d5304cdf114fff26939")).WithTransactions(Build.A.Transaction.SignedAndResolved(ethereumEcdsa, TestItem.PrivateKeyA, 10000000).TestObject, Build.A.Transaction.SignedAndResolved(ethereumEcdsa, TestItem.PrivateKeyB, 10000000).TestObject).WithGasUsed(42000).WithTotalDifficulty(_blockTree.Head.TotalDifficulty + 3).TestObject;
            Block         newBlock3     = Build.A.Block.WithParent(newBlock2.Header).WithReceiptsRoot(new Keccak("0xeb82c315eaf2c2a5dfc1766b075263d80e8b3ab9cb690d5304cdf114fff26939")).WithTransactions(Build.A.Transaction.SignedAndResolved(ethereumEcdsa, TestItem.PrivateKeyA, 10000000).TestObject, Build.A.Transaction.SignedAndResolved(ethereumEcdsa, TestItem.PrivateKeyB, 10000000).TestObject).WithGasUsed(42000).WithTotalDifficulty(_blockTree.Head.TotalDifficulty + 4).TestObject;

            var args = new SyncModeChangedEventArgs(SyncMode.Beam, SyncMode.None);

            _blockTree.SuggestBlock(newBlock0);
            syncModeSelector.Preparing += Raise.EventWith(args);
            _blockTree.SuggestBlock(newBlock1);
            syncModeSelector.Changing += Raise.EventWith(args);
            _blockTree.SuggestBlock(newBlock2);
            syncModeSelector.Changed += Raise.EventWith(args);
            _blockTree.SuggestBlock(newBlock3);

            Thread.Sleep(1000);
            // _blockchainProcessor.Received().Process(newBlock0, ProcessingOptions.Beam, NullBlockTracer.Instance);
            // _blockchainProcessor.Received().Process(newBlock1, ProcessingOptions.Beam, NullBlockTracer.Instance);
            // _blockchainProcessor.Received().Process(newBlock2, ProcessingOptions.Beam, NullBlockTracer.Instance);
            // _blockchainProcessor.Received().Process(newBlock3, ProcessingOptions.Beam, NullBlockTracer.Instance);
            _blockchainProcessingQueue.DidNotReceiveWithAnyArgs().Enqueue(newBlock1, ProcessingOptions.StoreReceipts);
        }
 public void SetActual(ISyncModeSelector syncModeSelector)
 {
     _syncModeSelector            = syncModeSelector ?? throw new ArgumentNullException(nameof(syncModeSelector));
     _syncModeSelector.Preparing += SyncModeSelectorOnPreparing;
     _syncModeSelector.Changing  += SyncModeSelectorOnChanging;
     _syncModeSelector.Changed   += SyncModeSelectorOnChanged;
 }
        public async Task Will_finish_when_fastsync_and_state_sync_finish(SyncMode mode, bool finished)
        {
            ISyncModeSelector syncModeSelector = Substitute.For <ISyncModeSelector>();

            await SetupBeamProcessor(syncModeSelector);

            EthereumEcdsa ethereumEcdsa = new EthereumEcdsa(ChainId.Mainnet, LimboLogs.Instance);
            Block         newBlock0     = Build.A.Block.WithParent(_blockTree.Head).WithReceiptsRoot(new Keccak("0xeb82c315eaf2c2a5dfc1766b075263d80e8b3ab9cb690d5304cdf114fff26939")).WithTransactions(MuirGlacier.Instance, Build.A.Transaction.SignedAndResolved(ethereumEcdsa, TestItem.PrivateKeyA).TestObject, Build.A.Transaction.SignedAndResolved(ethereumEcdsa, TestItem.PrivateKeyB).TestObject).WithGasUsed(42000).WithTotalDifficulty(_blockTree.Head.TotalDifficulty + 1).TestObject;
            Block         newBlock1     = Build.A.Block.WithParent(newBlock0.Header).WithReceiptsRoot(new Keccak("0xeb82c315eaf2c2a5dfc1766b075263d80e8b3ab9cb690d5304cdf114fff26939")).WithTransactions(MuirGlacier.Instance, Build.A.Transaction.SignedAndResolved(ethereumEcdsa, TestItem.PrivateKeyA).TestObject, Build.A.Transaction.SignedAndResolved(ethereumEcdsa, TestItem.PrivateKeyB).TestObject).WithGasUsed(42000).WithTotalDifficulty(_blockTree.Head.TotalDifficulty + 2).TestObject;
            Block         newBlock2     = Build.A.Block.WithParent(newBlock1.Header).WithReceiptsRoot(new Keccak("0xeb82c315eaf2c2a5dfc1766b075263d80e8b3ab9cb690d5304cdf114fff26939")).WithTransactions(MuirGlacier.Instance, Build.A.Transaction.SignedAndResolved(ethereumEcdsa, TestItem.PrivateKeyA).TestObject, Build.A.Transaction.SignedAndResolved(ethereumEcdsa, TestItem.PrivateKeyB).TestObject).WithGasUsed(42000).WithTotalDifficulty(_blockTree.Head.TotalDifficulty + 3).TestObject;
            Block         newBlock3     = Build.A.Block.WithParent(newBlock2.Header).WithReceiptsRoot(new Keccak("0xeb82c315eaf2c2a5dfc1766b075263d80e8b3ab9cb690d5304cdf114fff26939")).WithTransactions(MuirGlacier.Instance, Build.A.Transaction.SignedAndResolved(ethereumEcdsa, TestItem.PrivateKeyA).TestObject, Build.A.Transaction.SignedAndResolved(ethereumEcdsa, TestItem.PrivateKeyB).TestObject).WithGasUsed(42000).WithTotalDifficulty(_blockTree.Head.TotalDifficulty + 4).TestObject;

            var args = new SyncModeChangedEventArgs(SyncMode.Beam, mode);

            _blockTree.SuggestBlock(newBlock0);
            syncModeSelector.Preparing += Raise.EventWith(args);
            _blockTree.SuggestBlock(newBlock1);
            syncModeSelector.Changing += Raise.EventWith(args);
            _blockTree.SuggestBlock(newBlock2);
            syncModeSelector.Changed += Raise.EventWith(args);
            _blockTree.SuggestBlock(newBlock3);

            await Task.Delay(1000);

            if (finished)
            {
                _blockchainProcessingQueue.Received().Enqueue(newBlock1, ProcessingOptions.StoreReceipts);
                _blockchainProcessingQueue.Received().Enqueue(newBlock2, ProcessingOptions.StoreReceipts);
                _blockchainProcessingQueue.Received().Enqueue(newBlock3, ProcessingOptions.StoreReceipts);
            }
            else
            {
                _blockchainProcessingQueue.DidNotReceiveWithAnyArgs().Enqueue(newBlock1, ProcessingOptions.StoreReceipts);
            }
        }
示例#14
0
        public Synchronizer(
            ISpecProvider specProvider,
            IBlockTree blockTree,
            IReceiptStorage receiptStorage,
            IBlockValidator blockValidator,
            ISealValidator sealValidator,
            IEthSyncPeerPool peerPool,
            ISyncConfig syncConfig,
            INodeDataDownloader nodeDataDownloader,
            INodeStatsManager nodeStatsManager,
            ILogManager logManager)
        {
            _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));
            _syncConfig         = syncConfig ?? throw new ArgumentNullException(nameof(syncConfig));
            _syncPeerPool       = peerPool ?? throw new ArgumentNullException(nameof(peerPool));
            _nodeDataDownloader = nodeDataDownloader ?? throw new ArgumentNullException(nameof(nodeDataDownloader));
            _nodeStatsManager   = nodeStatsManager ?? throw new ArgumentNullException(nameof(nodeStatsManager));

            SyncProgressResolver syncProgressResolver = new SyncProgressResolver(_blockTree, receiptStorage, _nodeDataDownloader, syncConfig, logManager);

            _syncMode        = new SyncModeSelector(syncProgressResolver, _syncPeerPool, _syncConfig, logManager);
            _syncReport      = new SyncReport(_syncPeerPool, _nodeStatsManager, syncConfig, syncProgressResolver, _syncMode, logManager);
            _blockDownloader = new BlockDownloader(_blockTree, blockValidator, sealValidator, _syncReport, receiptStorage, specProvider, logManager);
            if (syncConfig.FastBlocks)
            {
                FastBlocksFeed feed = new FastBlocksFeed(_specProvider, _blockTree, _receiptStorage, _syncPeerPool, syncConfig, _syncReport, logManager);
                _fastBlockDownloader = new FastBlocksDownloader(_syncPeerPool, feed, blockValidator, sealValidator, logManager);
            }
        }
示例#15
0
 public WitnessBlockSyncFeed(IBlockTree blockTree, IWitnessStateSyncFeed witnessStateSyncFeed, ISyncModeSelector syncModeSelector, ILogManager logManager)
 {
     _blockTree            = blockTree ?? throw new ArgumentNullException(nameof(blockTree));
     _witnessStateSyncFeed = witnessStateSyncFeed ?? throw new ArgumentNullException(nameof(witnessStateSyncFeed));
     _syncModeSelector     = syncModeSelector ?? throw new ArgumentNullException(nameof(syncModeSelector));
     _logger = logManager?.GetClassLogger() ?? throw new ArgumentNullException(nameof(logManager));
     blockTree.NewSuggestedBlock += OnNewSuggestedBlock;
 }
示例#16
0
 public BeamSyncDbProvider(ISyncModeSelector syncModeSelector, IDbProvider otherProvider, ISyncConfig syncConfig, ILogManager logManager)
 {
     _otherProvider = otherProvider ?? throw new ArgumentNullException(nameof(otherProvider));
     _codeDb        = new BeamSyncDb(otherProvider.CodeDb.Innermost, otherProvider.BeamStateDb, syncModeSelector, logManager, syncConfig.BeamSyncContextTimeout, syncConfig.BeamSyncPreProcessorTimeout);
     _stateDb       = new BeamSyncDb(otherProvider.StateDb.Innermost, otherProvider.BeamStateDb, syncModeSelector, logManager, syncConfig.BeamSyncContextTimeout, syncConfig.BeamSyncPreProcessorTimeout);
     BeamSyncFeed   = new CompositeStateSyncFeed <StateSyncBatch?>(logManager, _codeDb, _stateDb);
     StateDb        = new StateDb(_stateDb);
     CodeDb         = new StateDb(_codeDb);
 }
        public BeamSyncDbProvider(ISyncModeSelector syncModeSelector, IDbProvider otherProvider, ILogManager logManager)
        {
            _otherProvider = otherProvider ?? throw new ArgumentNullException(nameof(otherProvider));
            BeamSyncDb codeDb  = new BeamSyncDb(otherProvider.CodeDb.Innermost, otherProvider.BeamStateDb, syncModeSelector, logManager);
            BeamSyncDb stateDb = new BeamSyncDb(otherProvider.StateDb.Innermost, otherProvider.BeamStateDb, syncModeSelector, logManager);

            BeamSyncFeed = new CompositeStateSyncFeed <StateSyncBatch>(logManager, codeDb, stateDb);
            StateDb      = new StateDb(stateDb);
            CodeDb       = new StateDb(codeDb);
        }
示例#18
0
        public FullSyncFeed(ISyncModeSelector syncModeSelector, ILogManager logManager)
            : base(logManager)
        {
            _syncModeSelector = syncModeSelector ?? throw new ArgumentNullException(nameof(syncModeSelector));

            DownloaderOptions options = BuildOptions();

            _blocksRequest = new BlocksRequest(options);

            _syncModeSelector.Changed += SyncModeSelectorOnChanged;
        }
示例#19
0
        public BeamSyncDb(IDb stateDb, IDb tempDb, ISyncModeSelector syncModeSelector, ILogManager logManager)
            : base(logManager)
        {
            _logger                      = logManager.GetClassLogger <BeamSyncDb>();
            _stateDb                     = stateDb ?? throw new ArgumentNullException(nameof(stateDb));
            _tempDb                      = tempDb ?? throw new ArgumentNullException(nameof(tempDb));
            _syncModeSelector            = syncModeSelector ?? throw new ArgumentNullException(nameof(syncModeSelector));
            _syncModeSelector.Preparing += SyncModeSelectorOnPreparing;
            _syncModeSelector.Changing  += SyncModeSelectorOnChanging;
            _syncModeSelector.Changed   += SyncModeSelectorOnChanged;

            _targetDbForSaves = _tempDb; // before transition to full we are saving to beam DB
        }
示例#20
0
        public void Test04()
        {
            PeerInfo peer1 = new(null !);

            ISyncModeSelector selector     = Substitute.For <ISyncModeSelector>();
            ISnapProvider     snapProvider = Substitute.For <ISnapProvider>();

            Synchronization.SnapSync.SnapSyncFeed feed = new(selector, snapProvider, null !, LimboLogs.Instance);

            for (int i = 0; i < 200; i++)
            {
                feed.AnalyzeResponsePerPeer(AddRangeResult.OK, peer1);
            }
        }
示例#21
0
        public BeamSyncDb(IDb stateDb, IDb tempDb, ISyncModeSelector syncModeSelector, ILogManager logManager, int contextTimeout = 4, int preProcessTimeout = 15)
            : base(logManager)
        {
            _logger                      = logManager.GetClassLogger <BeamSyncDb>();
            _stateDb                     = stateDb ?? throw new ArgumentNullException(nameof(stateDb));
            _tempDb                      = tempDb ?? throw new ArgumentNullException(nameof(tempDb));
            _syncModeSelector            = syncModeSelector ?? throw new ArgumentNullException(nameof(syncModeSelector));
            _syncModeSelector.Preparing += SyncModeSelectorOnPreparing;
            _syncModeSelector.Changing  += SyncModeSelectorOnChanging;
            _syncModeSelector.Changed   += SyncModeSelectorOnChanged;

            _targetDbForSaves         = _tempDb; // before transition to full we are saving to beam DB
            _contextExpiryTimeSpan    = TimeSpan.FromSeconds(contextTimeout);
            _preProcessExpiryTimeSpan = TimeSpan.FromSeconds(preProcessTimeout);
        }
        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);
        }
示例#23
0
        public StateSyncFeed(ISnapshotableDb codeDb, ISnapshotableDb stateDb, IDb tempDb, ISyncModeSelector syncModeSelector, IBlockTree blockTree, ILogManager logManager)
            : base(logManager)
        {
            _codeDb                    = codeDb?.Innermost ?? throw new ArgumentNullException(nameof(codeDb));
            _stateDb                   = stateDb?.Innermost ?? throw new ArgumentNullException(nameof(stateDb));
            _tempDb                    = tempDb ?? throw new ArgumentNullException(nameof(tempDb));
            _blockTree                 = blockTree ?? throw new ArgumentNullException(nameof(blockTree));
            _syncModeSelector          = syncModeSelector ?? throw new ArgumentNullException(nameof(syncModeSelector));
            _syncModeSelector.Changed += SyncModeSelectorOnChanged;

            _logger = logManager.GetClassLogger() ?? throw new ArgumentNullException(nameof(logManager));

            byte[] progress = _codeDb.Get(_fastSyncProgressKey);
            _data         = new DetailedProgress(_blockTree.ChainId, progress);
            _pendingItems = new PendingSyncItems();
        }
        private async Task SetupBeamProcessor(ISyncModeSelector syncModeSelector = null)
        {
            IDbProvider memDbProvider = await TestMemDbProvider.InitAsync();

            _beamBlockchainProcessor = new BeamBlockchainProcessor(
                new ReadOnlyDbProvider(memDbProvider, false),
                _blockTree,
                MainnetSpecProvider.Instance,
                LimboLogs.Instance,
                _validator,
                NullRecoveryStep.Instance,
                NoBlockRewards.Instance,
                _blockchainProcessingQueue,
                syncModeSelector ?? new StaticSelector(SyncMode.Beam)
                );
        }
示例#25
0
        private void SetupBeamProcessor(ISyncModeSelector syncModeSelector = null)
        {
            MemDbProvider memDbProvider = new MemDbProvider();

            _beamBlockchainProcessor = new BeamBlockchainProcessor(
                new ReadOnlyDbProvider(memDbProvider, false),
                _blockTree,
                MainnetSpecProvider.Instance,
                LimboLogs.Instance,
                _validator,
                NullRecoveryStep.Instance,
                new InstanceRewardCalculatorSource(NoBlockRewards.Instance),
                _blockchainProcessingQueue,
                _blockchainProcessor,
                syncModeSelector ?? new StaticSelector(SyncMode.Beam)
                );
        }
示例#26
0
        public void Valid_block_with_transactions_makes_it_is_processed_normally_if_beam_syncing_finished()
        {
            ISyncModeSelector syncModeSelector = Substitute.For <ISyncModeSelector>();

            SetupBeamProcessor(syncModeSelector);
            syncModeSelector.Preparing += Raise.EventWith(new SyncModeChangedEventArgs(SyncMode.Beam, SyncMode.Full));
            syncModeSelector.Changing  += Raise.EventWith(new SyncModeChangedEventArgs(SyncMode.Beam, SyncMode.Full));
            syncModeSelector.Changed   += Raise.EventWith(new SyncModeChangedEventArgs(SyncMode.Beam, SyncMode.Full));

            EthereumEcdsa ethereumEcdsa = new EthereumEcdsa(MainnetSpecProvider.Instance, LimboLogs.Instance);
            Block         newBlock      = Build.A.Block.WithParent(_blockTree.Head).WithReceiptsRoot(new Keccak("0xeb82c315eaf2c2a5dfc1766b075263d80e8b3ab9cb690d5304cdf114fff26939")).WithTransactions(Build.A.Transaction.SignedAndResolved(ethereumEcdsa, TestItem.PrivateKeyA, 10000000).TestObject, Build.A.Transaction.SignedAndResolved(ethereumEcdsa, TestItem.PrivateKeyB, 10000000).TestObject).WithGasUsed(42000).WithTotalDifficulty(_blockTree.Head.TotalDifficulty + 1).TestObject;

            _blockTree.SuggestBlock(newBlock);
            Thread.Sleep(1000);
            _blockchainProcessor.DidNotReceiveWithAnyArgs().Process(newBlock, ProcessingOptions.Beam, NullBlockTracer.Instance);
            _blockchainProcessingQueue.Received().Enqueue(newBlock, ProcessingOptions.StoreReceipts);
        }
示例#27
0
        public async Task ProviderInitTests_BeamSyncDbProvider()
        {
            ISyncModeSelector syncModeSelector = Substitute.For <ISyncModeSelector>();

            using IDbProvider dbProvider = await TestMemDbProvider.InitAsync();

            RocksDbFactory           rocksDbFactory     = new RocksDbFactory(new DbConfig(), LimboLogs.Instance, Path.Combine(_folderWithDbs, "beam"));
            IDbProvider              beamSyncDbProvider = new BeamSyncDbProvider(syncModeSelector, dbProvider, new SyncConfig(), LimboLogs.Instance);
            ConsumerNdmDbInitializer initializer        = new ConsumerNdmDbInitializer(beamSyncDbProvider, new NdmConfig(), rocksDbFactory, new MemDbFactory());

            initializer.Reset();
            await initializer.InitAsync();

            Assert.IsTrue(beamSyncDbProvider.GetDb <IDb>(ConsumerNdmDbNames.ConsumerDepositApprovals) is MemDb);
            Assert.IsTrue(beamSyncDbProvider.GetDb <IDb>(ConsumerNdmDbNames.ConsumerReceipts) is MemDb);
            Assert.IsTrue(beamSyncDbProvider.GetDb <IDb>(ConsumerNdmDbNames.ConsumerSessions) is MemDb);
            Assert.IsTrue(beamSyncDbProvider.GetDb <IDb>(ConsumerNdmDbNames.Deposits) is MemDb);
        }
示例#28
0
 public BeaconHeadersSyncFeed(
     IPoSSwitcher poSSwitcher,
     ISyncModeSelector syncModeSelector,
     IBlockTree?blockTree,
     ISyncPeerPool?syncPeerPool,
     ISyncConfig?syncConfig,
     ISyncReport?syncReport,
     IPivot?pivot,
     IMergeConfig?mergeConfig,
     IInvalidChainTracker invalidChainTracker,
     ILogManager logManager)
     : base(syncModeSelector, blockTree, syncPeerPool, syncConfig, syncReport, logManager,
            true) // alwaysStartHeaderSync = true => for the merge we're forcing header sync start. It doesn't matter if it is archive sync or fast sync
 {
     _poSSwitcher         = poSSwitcher ?? throw new ArgumentNullException(nameof(poSSwitcher));
     _pivot               = pivot ?? throw new ArgumentNullException(nameof(pivot));
     _mergeConfig         = mergeConfig ?? throw new ArgumentNullException(nameof(mergeConfig));
     _invalidChainTracker = invalidChainTracker;
     _logger              = logManager.GetClassLogger();
 }
 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;
 }
示例#30
0
 public FastSyncFeed(ISyncModeSelector syncModeSelector, ISyncConfig syncConfig, ILogManager logManager)
     : base(syncModeSelector)
 {
     _syncConfig    = syncConfig ?? throw new ArgumentNullException(nameof(syncConfig));
     _blocksRequest = new BlocksRequest(BuildOptions(), MultiSyncModeSelector.FastSyncLag);
 }