Exemple #1
0
        public OpenBlockStatus TryOpenBlock(CommittedBlockId parent, out UncommittedBlock freshBlock)
        {
            var blocks     = GetBlocks();
            var blockCount = AsHeader.BlockCount;
            var lowerIndex = Math.Max(0, blockCount - BlockScanLimit);

            freshBlock = default;

            if (blockCount == 0 && !parent.Equals(CommittedBlockId.GenesisParent))
            {
                return(OpenBlockStatus.ParentNotFound);
            }

            // Find the parent, and assess the block height
            int parentBlockHeight = -1;
            var parentAlias       = BlockAlias.Undefined;

            for (var i = blockCount - 1; i >= lowerIndex; i--)
            {
                ref var candidate = ref blocks[i];
                if (candidate.IsDeleted)
                {
                    continue;
                }

                if (candidate.BlockId.Equals(parent))
                {
                    parentBlockHeight = candidate.BlockHeight;
                    parentAlias       = candidate.Alias;
                    break;
                }

                if (i == 0)
                {
                    return(OpenBlockStatus.ParentNotFound);
                }
            }