示例#1
0
        private async Task ReceiveNextValidBlock()
        {
            if (!_executeNextBlock)
            {
                _executeNextBlock = true;
                return;
            }

            if (_stateFSM.CurrentState != (int)NodeState.Catching && _stateFSM.CurrentState != (int)NodeState.Caught)
            {
                IncorrectStateLog(nameof(ReceiveNextValidBlock));
                return;
            }

            var currentBlockHeight = await BlockChain.GetCurrentBlockHeightAsync();

            var nextBlocks = _blockSet.GetBlocksByHeight(currentBlockHeight + 1);

            foreach (var nextBlock in nextBlocks)
            {
                await ReceiveBlock(nextBlock);

                if (_stateFSM.CurrentState != (int)NodeState.Catching && _stateFSM.CurrentState != (int)NodeState.Caught)
                {
                    break;
                }
            }
        }
示例#2
0
        public async Task <bool> CheckLinkabilityAsync(BlockHeader blockHeader)
        {
            var previousBlocks = new List <IBlock> {
                await BlockChain.GetBlockByHeightAsync(blockHeader.Index - 1)
            };

            previousBlocks.AddRange(_blockSet.GetBlocksByHeight(blockHeader.Index - 1));
            foreach (var previousBlock in previousBlocks)
            {
                if (previousBlock.BlockHashToHex == blockHeader.PreviousBlockHash.DumpHex())
                {
                    return(true);
                }
            }

            return(false);
        }