public async Task Set_BestChain_Success()
        {
            BestChainFoundEventData eventData = null;

            _eventBus.Subscribe <BestChainFoundEventData>(d =>
            {
                eventData = d;
                return(Task.CompletedTask);
            });

            var chain = await _fullBlockchainService.GetChainAsync();

            chain.BestChainHeight.ShouldBe(_kernelTestHelper.BestBranchBlockList.Last().Height);
            chain.BestChainHash.ShouldBe(_kernelTestHelper.BestBranchBlockList.Last().GetHash());

            await _fullBlockchainService.SetBestChainAsync(chain, chain.LongestChainHeight, chain.LongestChainHash);

            chain = await _fullBlockchainService.GetChainAsync();

            chain.BestChainHeight.ShouldBe(_kernelTestHelper.LongestBranchBlockList.Last().Height);
            chain.BestChainHash.ShouldBe(_kernelTestHelper.LongestBranchBlockList.Last().GetHash());

            eventData.ShouldNotBeNull();
            eventData.BlockHash.ShouldBe(chain.BestChainHash);
            eventData.BlockHeight.ShouldBe(chain.BestChainHeight);
        }
Пример #2
0
        public async Task HandleBestChainFoundAsync(BestChainFoundEventData eventData)
        {
            Logger.LogTrace(
                $"Handle best chain found: BlockHeight: {eventData.BlockHeight}, BlockHash: {eventData.BlockHash}");

            var minimumHeight = _allTransactions.Count == 0
                ? 0
                : _allTransactions.Min(kv => kv.Value.Transaction.RefBlockNumber);
            var prefixes = await GetPrefixesByHeightAsync(minimumHeight, eventData.BlockHash, eventData.BlockHeight);

            ResetCurrentCollections();
            foreach (var queuedTransaction in _allTransactions.Values)
            {
                prefixes.TryGetValue(queuedTransaction.Transaction.RefBlockNumber, out var prefix);
                UpdateRefBlockStatus(queuedTransaction, prefix, eventData.BlockHeight);
                AddToCollection(queuedTransaction);
            }

            CleanTransactions(_expiredByExpiryBlock, eventData.BlockHeight);

            _bestChainHash   = eventData.BlockHash;
            _bestChainHeight = eventData.BlockHeight;

            Logger.LogTrace(
                $"Finish handle best chain found: BlockHeight: {eventData.BlockHeight}, BlockHash: {eventData.BlockHash}");
        }
Пример #3
0
        public async Task HandleBestChainFoundAsync(BestChainFoundEventData eventData)
        {
            Logger.LogDebug(
                $"Handle best chain found: BlockHeight: {eventData.BlockHeight}, BlockHash: {eventData.BlockHash}");

            var minimumHeight = _allTransactions.Count == 0
                ? 0
                : _allTransactions.Min(kv => kv.Value.Transaction.RefBlockNumber);
            var prefixes = await GetPrefixesByHeightAsync(minimumHeight, eventData.BlockHash, eventData.BlockHeight);

            ResetCurrentCollections();
            foreach (var kv in _allTransactions)
            {
                prefixes.TryGetValue(kv.Value.Transaction.RefBlockNumber, out var prefix);
                CheckPrefixForOne(kv.Value, prefix, _bestChainHeight);
                AddToRespectiveCurrentCollection(kv.Value);
            }

            CleanTransactions(_expiredByExpiryBlock, eventData.BlockHeight);

            _bestChainHash   = eventData.BlockHash;
            _bestChainHeight = eventData.BlockHeight;

            Logger.LogDebug(
                $"Finish handle best chain found: BlockHeight: {eventData.BlockHeight}, BlockHash: {eventData.BlockHash}");
        }
Пример #4
0
        public async Task HandleEventAsyncTest()
        {
            var eventData = new BestChainFoundEventData
            {
                BlockHash   = Hash.Generate(),
                BlockHeight = 100
            };

            await _bestChainFoundEventHandler.HandleEventAsync(eventData);
        }
        public async Task HandleEventAsync_Test()
        {
            var eventData = new BestChainFoundEventData
            {
                BlockHash      = Hash.FromString("BlockHash"),
                BlockHeight    = 11L,
                ExecutedBlocks = new List <Hash>
                {
                    Hash.FromString("element1"),
                    Hash.FromString("element2"),
                }
            };

            await _foundEventHandler.HandleEventAsync(eventData);
        }
Пример #6
0
        public async Task HandleBestChainFoundAsync(BestChainFoundEventData eventData)
        {
            var heights  = _allTransactions.Select(kv => kv.Value.Transaction.RefBlockNumber).Distinct();
            var prefixes = await GetPrefixesByHeightAsync(heights, eventData.BlockHash);

            ResetCurrentCollections();
            foreach (var kv in _allTransactions)
            {
                var prefix = prefixes[kv.Value.Transaction.RefBlockNumber];
                CheckPrefixForOne(kv.Value, prefix, _bestChainHeight);
                AddToRespectiveCurrentCollection(kv.Value);
            }

            _bestChainHash   = eventData.BlockHash;
            _bestChainHeight = eventData.BlockHeight;
        }
 public async Task HandleEventAsync(BestChainFoundEventData eventData)
 {
     await _txHub.HandleBestChainFoundAsync(eventData);
 }
Пример #8
0
 public async Task HandleBestChainFoundAsync(BestChainFoundEventData eventData)
 {
     _bestChainHeight = eventData.BlockHeight;
     _bestChainHash   = eventData.BlockHash;
     await Task.CompletedTask;
 }
Пример #9
0
 public async Task HandleEventAsync(BestChainFoundEventData eventData)
 {
     await _transactionPoolService.UpdateTransactionPoolByBestChainAsync(eventData.BlockHash, eventData.BlockHeight);
 }
        public async Task Query_TransactionResult_On_Irreversible_Chain()
        {
            var tx1 = _kernelTestHelper.GenerateTransaction();

            var(block11, results11) =
                GetNextBlockWithTransactionAndResults(_kernelTestHelper.BestBranchBlockList.Last().Header, new[] { tx1 });

            var tx2 = _kernelTestHelper.GenerateTransaction();

            var(block12, results12) =
                GetNextBlockWithTransactionAndResults(block11.Header, new[] { tx2 });

            // Add block 1
            await AddTransactionResultsWithPreMiningAsync(block11, new[] { results11.First() });

            // Add block 2
            await AddTransactionResultsWithPostMiningAsync(block12, new[] { results12.First() });


            #region Before LIB

            // Before LIB, transaction result is saved with PreMiningHash but not with PostMiningHash (normal BlockHash)
            {
                var queried = await _transactionResultService.GetTransactionResultAsync(tx2.GetHash());

                queried.ShouldBe(results12.First());

                var queried2 = await _transactionResultService.GetTransactionResultAsync(tx2.GetHash(), block12.GetHash());

                queried2.ShouldBe(results12.First());

                var queried3 = await _transactionResultService.GetTransactionResultAsync(tx2.GetHash(), block12.GetHash());

                queried3.ShouldBe(results12.First());
                // PreMiningHash
                var resultWithPreMiningHash =
                    await _transactionResultManager.GetTransactionResultAsync(tx1.GetHash(),
                                                                              block11.Header.GetPreMiningHash());

                resultWithPreMiningHash.ShouldBe(results11.First());

                // PostMiningHash
                var resultWithPostMiningHash =
                    await _transactionResultManager.GetTransactionResultAsync(tx1.GetHash(),
                                                                              block11.Header.GetHash());

                resultWithPostMiningHash.ShouldBeNull();
            }

            #endregion

            var bestChainFoundEventData = new BestChainFoundEventData
            {
                BlockHash      = block11.GetHash(),
                BlockHeight    = block11.Height,
                ExecutedBlocks = new List <Hash>()
            };

            bestChainFoundEventData.ExecutedBlocks.Add(block11.GetHash());
            await _localEventBus.PublishAsync(bestChainFoundEventData);

            #region After Best Chain Found

            // After LIB, transaction result is re-saved with PostMiningHash (normal BlockHash)
            {
                var queried = await _transactionResultService.GetTransactionResultAsync(tx2.GetHash());

                queried.ShouldBe(results12.First());

                var queried2 = await _transactionResultService.GetTransactionResultAsync(tx2.GetHash(), block12.GetHash());

                queried2.ShouldBe(results12.First());
                // PreMiningHash
                var resultWithPreMiningHash =
                    await _transactionResultManager.GetTransactionResultAsync(tx1.GetHash(),
                                                                              block11.Header.GetPreMiningHash());

                resultWithPreMiningHash.ShouldBeNull();

                // PostMiningHash
                var resultWithPostMiningHash =
                    await _transactionResultManager.GetTransactionResultAsync(tx1.GetHash(),
                                                                              block11.Header.GetHash());

                resultWithPostMiningHash.ShouldBe(results11.First());
            }

            #endregion
        }