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