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); }
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}"); }
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}"); }
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); }
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); }
public async Task HandleBestChainFoundAsync(BestChainFoundEventData eventData) { _bestChainHeight = eventData.BlockHeight; _bestChainHash = eventData.BlockHash; await Task.CompletedTask; }
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 }