private async Task <List <ParentChainBlockData> > GetNonIndexedParentChainBlockDataAsync(Hash blockHash,
                                                                                                 long blockHeight)
        {
            var parentChainBlockDataList = new List <ParentChainBlockData>();
            var libExists = await _irreversibleBlockStateProvider.ValidateIrreversibleBlockExistingAsync();

            if (!libExists)
            {
                return(parentChainBlockDataList);
            }

            var returnValue = await _readerFactory.Create(blockHash, blockHeight).GetParentChainId
                              .CallAsync(new Empty());

            var parentChainId = returnValue?.Value ?? 0;

            if (parentChainId == 0)
            {
                //Logger.LogTrace("No configured parent chain");
                // no configured parent chain
                return(parentChainBlockDataList);
            }

            int length        = CrossChainConstants.DefaultBlockCacheEntityCount;
            var heightInState = (await _readerFactory.Create(blockHash, blockHeight).GetParentChainHeight
                                 .CallAsync(new Empty())).Value;

            var targetHeight = heightInState + 1;

            Logger.LogTrace($"Target height {targetHeight}");

            var i = 0;

            while (i < length)
            {
                var parentChainBlockData =
                    _blockCacheEntityConsumer.Take <ParentChainBlockData>(parentChainId, targetHeight, false);
                if (parentChainBlockData == null || parentChainBlockData.Height != targetHeight)
                {
                    // no more available parent chain block info
                    break;
                }

                parentChainBlockDataList.Add(parentChainBlockData);
                targetHeight++;
                i++;
            }

            if (parentChainBlockDataList.Count > 0)
            {
                Logger.LogTrace(
                    $"Got height [{parentChainBlockDataList.First().Height} - {parentChainBlockDataList.Last().Height} ]" +
                    $" from parent chain {ChainHelper.ConvertChainIdToBase58(parentChainId)}.");
            }
            return(parentChainBlockDataList);
        }
Пример #2
0
        public async Task ValidateIrreversibleBlockExistingAsync_Test()
        {
            {
                var libExists = await _irreversibleBlockStateProvider.ValidateIrreversibleBlockExistingAsync();

                libExists.ShouldBeFalse();
            }

            _crossChainTestHelper.SetFakeLibHeight(1);
            {
                var libExists = await _irreversibleBlockStateProvider.ValidateIrreversibleBlockExistingAsync();

                libExists.ShouldBeFalse();
            }

            _crossChainTestHelper.SetFakeLibHeight(2);
            {
                var libExists = await _irreversibleBlockStateProvider.ValidateIrreversibleBlockExistingAsync();

                libExists.ShouldBeTrue();
            }
        }
Пример #3
0
        public async Task FinishInitialSyncAsync()
        {
            CrossChainConfigOptions.CurrentValue.CrossChainDataValidationIgnored = false;
            var isReadyToCreateChainCache = await _irreversibleBlockStateProvider.ValidateIrreversibleBlockExistingAsync();

            if (!isReadyToCreateChainCache)
            {
                return;
            }
            var libIdHeight = await _irreversibleBlockStateProvider.GetLastIrreversibleBlockHashAndHeightAsync();

            _ = RegisterNewChainsAsync(libIdHeight.BlockHash, libIdHeight.BlockHeight);
        }
Пример #4
0
        public async Task FinishInitialSyncAsync()
        {
            CrossChainConfigOptions.CurrentValue.CrossChainDataValidationIgnored = false;
            var isReadyToCreateChainCache = await _irreversibleBlockStateProvider.ValidateIrreversibleBlockExistingAsync();

            if (!isReadyToCreateChainCache)
            {
                return;
            }
            var libIdHeight = await _irreversibleBlockStateProvider.GetLastIrreversibleBlockHashAndHeightAsync();

            var chainIdHeightPairs = await GetAllChainIdHeightPairsAsync(libIdHeight.BlockHash, libIdHeight.BlockHeight);

            foreach (var chainIdHeight in chainIdHeightPairs.IdHeightDict)
            {
                // register new chain
                _crossChainCacheEntityService.RegisterNewChain(chainIdHeight.Key, chainIdHeight.Value);
            }
        }