Пример #1
0
        private void BlockPersisted(Block block)
        {
            _snapshotIndexRepository.SaveSnapshotForBlock(block.Header.Index, _stateManager.LastApprovedSnapshot);
            // a new block is committed to the storage

            // add to the cache
            if (_heightCache.TryAdd(block.Header.Index, block))
            {
                _heightCacheQueue.Enqueue(block.Header.Index);
            }

            // if cache size exceeds limit, remove the oldest one
            if (_heightCacheQueue.Count > _blockSizeLimit)
            {
                // remove oldest height from queue
                var oldestKey = _heightCacheQueue.Dequeue();

                // remove from cache dictionary
                _heightCache.Remove(oldestKey);
            }

            // this invocation triggers consensusManager and consensusManager knows that a new block
            // is added and thus stops the current era of consensus if it's running. It also triggers a
            // method in pool and pool does some necessary clean-ups
            OnBlockPersisted?.Invoke(this, block);
        }
Пример #2
0
        public static void FastSync(IStateManager stateManager, ISnapshotIndexRepository snapshotIndexRepository, string peerURL, ulong blockNumber)
        {
            StateDownloader stateDownloader = new StateDownloader(peerURL, blockNumber);

            blockNumber = stateDownloader.DownloadBlockNumber();
            Logger.LogWarning($"Performing set state to block {blockNumber}");
            var snapshot = stateManager.NewSnapshot();

            string[]    trieNames = new string[] { "Balances", "Contracts", "Storage", "Transactions", "Blocks", "Events", "Validators" };
            ISnapshot[] snapshots = new ISnapshot[] { snapshot.Balances,
                                                      snapshot.Contracts,
                                                      snapshot.Storage,
                                                      snapshot.Transactions,
                                                      snapshot.Blocks,
                                                      snapshot.Events,
                                                      snapshot.Validators };

            for (int i = 0; i < trieNames.Length; i++)
            {
                string trieName    = trieNames[i];
                ulong  curTrieRoot = stateDownloader.DownloadRoot(trieName);
                IDictionary <ulong, IHashTrieNode> curTrie = stateDownloader.DownloadTrie(trieName);
                snapshots[i].SetState(curTrieRoot, curTrie);
                Logger.LogInformation($"{trieName} update done");
            }

            stateManager.Approve();
            stateManager.Commit();
            snapshotIndexRepository.SaveSnapshotForBlock(blockNumber, snapshot);
            Logger.LogWarning($"Set state to block {blockNumber} complete");
        }
Пример #3
0
        public static void StartSync(IStateManager stateManager,
                                     IRocksDbContext dbContext,
                                     ISnapshotIndexRepository snapshotIndexRepository,
                                     VersionFactory versionFactory,
                                     ulong blockNumber)
        {
            dbContext.Save(EntryPrefix.NodesDownloadedTillNow.BuildPrefix(), UInt64Utils.ToBytes(0));
            List <string> devnetNodes = new List <string>
            {
                "http://157.245.160.201:7070",
                "http://95.217.6.171:7070",
                "http://88.99.190.191:7070",
                "http://94.130.78.183:7070",
                "http://94.130.24.163:7070",
                "http://94.130.110.127:7070",
                "http://94.130.110.95:7070",
                "http://94.130.58.63:7070",
                "http://88.99.86.166:7070",
                "http://88.198.78.106:7070",
                "http://88.198.78.141:7070",
                "http://88.99.126.144:7070",
                "http://88.99.87.58:7070",
                "http://95.217.6.234:7070"
            };
//            List <string> onlyonenode = new List<string>
            List <string> localnetNodes = new List <string>
            {
                "http://127.0.0.1:7070",
                "http://127.0.0.1:7071",
                "http://127.0.0.1:7072"
            };

            var snapshot = stateManager.NewSnapshot();

            ISnapshot[] snapshots = new ISnapshot[] { snapshot.Balances,
                                                      snapshot.Contracts,
                                                      snapshot.Storage,
                                                      snapshot.Transactions,
                                                      snapshot.Events,
                                                      snapshot.Validators, };

            List <string>  urls           = devnetNodes;
            HybridQueue    hybridQueue    = new HybridQueue(dbContext);
            PeerManager    peerManager    = new PeerManager(urls);
            NodeStorage    nodeStorage    = new NodeStorage(dbContext, versionFactory);
            RequestManager requestManager = new RequestManager(nodeStorage, hybridQueue);
            Downloader     downloader     = new Downloader(peerManager, requestManager, blockNumber);

            string[] trieNames = new string[]
            {
                "Balances", "Contracts", "Storage", "Transactions", "Events", "Validators"
            };


            downloader.DownloadBlocks(nodeStorage, snapshot.Blocks);

            for (int i = 0; i < trieNames.Length; i++)
            {
                Logger.LogWarning($"Starting trie {trieNames[i]}");
                string rootHash  = downloader.GetTrie(trieNames[i], nodeStorage);
                bool   foundRoot = nodeStorage.GetIdByHash(rootHash, out ulong curTrieRoot);
                snapshots[i].SetCurrentVersion(curTrieRoot);
                Logger.LogWarning($"Ending trie {trieNames[i]} : {curTrieRoot}");
                Logger.LogWarning($"Max Queue Size {requestManager.maxQueueSize}");
                Logger.LogWarning($"Total Nodes downloaded: {versionFactory.CurrentVersion}");
            }

            blockNumber = Convert.ToUInt64(downloader.GetBlockNumber(), 16);
            stateManager.Approve();
            stateManager.Commit();
            snapshotIndexRepository.SaveSnapshotForBlock(blockNumber, snapshot);
            Logger.LogWarning($"Set state to block {blockNumber} complete");
        }