/// <summary> /// Adds a block to Pending Storage. /// <para> /// The <see cref="BlockStoreSignaled"/> calls this method when a new block is available. Only add the block to pending storage if the store's tip is behind the given block. /// </para> /// </summary> /// <param name="blockPair">The block and its chained header pair to be added to pending storage.</param> /// <remarks>TODO: Possibly check the size of pending in memory</remarks> public void AddToPending(BlockPair blockPair) { this.logger.LogTrace("({0}:'{1}')", nameof(blockPair), blockPair.ChainedBlock); if (this.StoreTip.Height < blockPair.ChainedBlock.Height) { this.PendingStorage.TryAdd(blockPair.ChainedBlock.HashBlock, blockPair); this.CachedConsensusTip = blockPair.ChainedBlock; } this.logger.LogTrace("(-)"); }
protected override void OnNextCore(Block block) { this.logger.LogTrace("()"); if (this.storeSettings.Prune) { this.logger.LogTrace("(-)[PRUNE]"); return; } ChainedBlock chainedBlock = this.chain.GetBlock(block.GetHash()); if (chainedBlock == null) { this.logger.LogTrace("(-)[REORG]"); return; } this.logger.LogTrace("Block hash is '{0}'.", chainedBlock.HashBlock); var blockPair = new BlockPair(block, chainedBlock); // Ensure the block is written to disk before relaying. this.blockStoreLoop.AddToPending(blockPair); if (this.blockStoreLoop.InitialBlockDownloadState.IsInitialBlockDownload()) { this.logger.LogTrace("(-)[IBD]"); return; } // Add to cache if not in IBD. this.blockStoreCache.AddToCache(block); this.logger.LogTrace("Block header '{0}' added to the announce queue.", chainedBlock); this.blocksToAnnounce.Enqueue(chainedBlock); this.logger.LogTrace("(-)"); }