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); }
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"); }
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"); }