Exemplo n.º 1
0
        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());
                    }
                }
            }
        }
Exemplo n.º 2
0
        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}");
            }
        }