protected async Task MaybeSwitchBranch(IBlockHeader header) { var blockHeader = (BlockHeader)header; if (blockHeader.Index <= GlobalConfig.GenesisBlockHeight) { var hash = GetHeightHash(blockHeader.Index).OfType(HashType.CanonicalHash); // hash.Height = blockHeader.Index; await _dataStore.InsertAsync(hash, header.GetHash()); await _chainManager.UpdateCurrentBlockHashAsync(_chainId, header.GetHash()); return; } var currentBlockHash = await GetCurrentBlockHashAsync(); var currentHeader = await GetHeaderByHashAsync(currentBlockHash); if (currentHeader.GetHash().Equals(((BlockHeader)header).PreviousBlockHash) || ((BlockHeader)header).PreviousBlockHash.Equals(Hash.Genesis)) { var hash = GetHeightHash(((BlockHeader)header).Index).OfType(HashType.CanonicalHash); // hash.Height = ((BlockHeader) header).Index; await _dataStore.InsertAsync(hash, header.GetHash()); await _chainManager.UpdateCurrentBlockHashAsync(_chainId, header.GetHash()); return; } if (((BlockHeader)header).Index > ((BlockHeader)currentHeader).Index) { await _chainManager.UpdateCurrentBlockHashAsync(_chainId, header.GetHash()); var branches = await GetComparedBranchesAsync(currentHeader, header); if (branches.Item2.Count > 0) { foreach (var newBranchHeader in branches.Item2) { if (newBranchHeader == null) { break; } var hash = GetHeightHash(((BlockHeader)newBranchHeader).Index).OfType(HashType.CanonicalHash); // hash.Height = ((BlockHeader) newBranchHeader).Index; await _dataStore.InsertAsync(hash, newBranchHeader.GetHash()); } } } }
protected async Task CheckHeaderAppendable(IBlockHeader header) { var blockHeader = (BlockHeader)header; #region genesis // TODO: more strict genesis if (blockHeader.Index == GlobalConfig.GenesisBlockHeight) { var curHash = await _chainManager.GetCurrentBlockHashAsync(_chainId); if (curHash.IsNull()) { await _chainManager.AddChainAsync(_chainId, header.GetHash()); } return; } #endregion genesis var prevHeader = await GetHeaderByHashAsync(blockHeader.PreviousBlockHash); if (prevHeader == null) { throw new InvalidOperationException($"Parent is unknown for {blockHeader}."); } var expected = ((BlockHeader)prevHeader).Index + 1; var actual = blockHeader.Index; if (actual != expected) { throw new InvalidOperationException($"Incorrect index. Expected: {expected}, actual: {actual}"); } }