private async Task <BlockExecutedSet> GetExecuteBlockSetAsync(Block block, Hash blockHash)
        {
            var set = new BlockExecutedSet()
            {
                Block          = block,
                TransactionMap = new Dictionary <Hash, Transaction>(),

                TransactionResultMap = new Dictionary <Hash, TransactionResult>()
            };

            if (block.TransactionIds.Any())
            {
                set.TransactionMap = (await _blockchainService.GetTransactionsAsync(block.TransactionIds))
                                     .ToDictionary(p => p.GetHash(), p => p);
            }

            foreach (var transactionId in block.TransactionIds)
            {
                if ((set.TransactionResultMap[transactionId] =
                         await _transactionResultService.GetTransactionResultAsync(transactionId, blockHash))
                    == null)
                {
                    Logger.LogWarning(
                        $"Fail to load transaction result. block hash : {blockHash}, tx id: {transactionId}");

                    return(null);
                }
            }

            return(set);
        }
Esempio n. 2
0
        private async Task CheckMiningResultAsync(BlockExecutedSet blockExecutedSet, Timestamp blockTime,
                                                  int transactionCount)
        {
            var chain = await _blockchainService.GetChainAsync();

            blockExecutedSet.Block.Header.PreviousBlockHash.ShouldBe(chain.BestChainHash);
            blockExecutedSet.Block.Header.Height.ShouldBe(chain.BestChainHeight + 1);
            blockExecutedSet.Block.Header.Time.ShouldBe(blockTime);
            blockExecutedSet.Block.VerifySignature().ShouldBeTrue();
            blockExecutedSet.Block.Body.TransactionsCount.ShouldBe(1 + transactionCount);
        }
Esempio n. 3
0
        private BlockExecutedSet GenerateBlockExecutedSet(long blockHeight, List <LogEvent> logEvents)
        {
            var blockExecutedSet = new BlockExecutedSet();
            var transactions     = new List <Transaction>();

            for (var i = 0; i < logEvents.Count + 1; i++)
            {
                transactions.Add(_kernelTestHelper.GenerateTransaction());
            }

            var block = _kernelTestHelper.GenerateBlock(blockHeight - 1, HashHelper.ComputeFrom("PreviousBlockHash"),
                                                        transactions);

            blockExecutedSet.Block = block;
            blockExecutedSet.TransactionResultMap = new Dictionary <Hash, TransactionResult>
            {
                {
                    transactions[0].GetHash(),
                    new TransactionResult {
                        TransactionId = transactions[0].GetHash(), Bloom = ByteString.Empty
                    }
                }
            };

            var bloom   = new Bloom();
            var logs    = new List <LogEvent>();
            var txIndex = 1;

            foreach (var logEvent in logEvents)
            {
                bloom.Combine(new List <Bloom> {
                    logEvent.GetBloom()
                });
                logs.Add(logEvent);

                var transactionResult = new TransactionResult
                {
                    TransactionId = transactions[txIndex].GetHash(),
                    Bloom         = ByteString.CopyFrom(bloom.Data),
                };
                transactionResult.Logs.AddRange(logs);

                blockExecutedSet.TransactionResultMap.Add(transactions[txIndex].GetHash(), transactionResult);
                txIndex++;
            }

            block.Header.Bloom = ByteString.CopyFrom(bloom.Data);

            return(blockExecutedSet);
        }
Esempio n. 4
0
        private async Task CheckBlockExecutedSetAsync(BlockExecutedSet blockExecutedSet, int transactionCount)
        {
            blockExecutedSet.Block.Body.TransactionIds.Count.ShouldBe(transactionCount);
            blockExecutedSet.TransactionResultMap.Values.Select(t => t.Status)
            .ShouldAllBe(status => status == TransactionResultStatus.Mined);
            var blockStateSet = await _blockStateSetManger.GetBlockStateSetAsync(blockExecutedSet.GetHash());

            blockStateSet.ShouldNotBeNull();
            var transactionResults = await _transactionResultManager.GetTransactionResultsAsync(
                blockExecutedSet.TransactionIds.ToList(),
                blockExecutedSet.GetHash());

            transactionResults.Count.ShouldBe(transactionCount);
            foreach (var transactionResult in transactionResults)
            {
                blockExecutedSet.TransactionResultMap[transactionResult.TransactionId].ShouldBe(transactionResult);
            }
        }
        private async Task CheckMiningResultAsync(BlockExecutedSet blockExecutedSet, Timestamp blockTime,
                                                  int transactionCount)
        {
            var chain = await _blockchainService.GetChainAsync();

            var pubkey = await _accountService.GetPublicKeyAsync();

            blockExecutedSet.Block.Header.PreviousBlockHash.ShouldBe(chain.BestChainHash);
            blockExecutedSet.Block.Header.Height.ShouldBe(chain.BestChainHeight + 1);
            blockExecutedSet.Block.Header.Time.ShouldBe(blockTime);
            blockExecutedSet.Block.Header.SignerPubkey.ShouldBe(ByteString.CopyFrom(pubkey));
            blockExecutedSet.Block.VerifySignature().ShouldBeTrue();
            blockExecutedSet.Block.Body.TransactionsCount.ShouldBe(1 + transactionCount);

            _systemTransactionExtraDataProvider.TryGetSystemTransactionCount(blockExecutedSet.Block.Header,
                                                                             out var systemTransactionCount);
            systemTransactionCount.ShouldBe(1);
        }