コード例 #1
0
        public async Task <IBlock> GetBlockAsync(uint256 hash)
        {
            var result = new Lazy <Block>(() => new Block());

            var fillHeaderTask = GetBlockHeaderAsync(hash.ToString())
                                 .ContinueWith(tsk =>
            {
                if (tsk.Result != null)
                {
                    FillHeaderData(tsk.Result, result.Value);
                }
            });

            var fillDbDataTask = Task.Run((Func <Task>)(async() =>
            {
                var block = await _indexerClient.GetBlock(hash);
                if (block != null)
                {
                    FillBlockDataFromDb(block, result.Value);
                }
            }));

            await Task.WhenAll(fillHeaderTask, fillDbDataTask);

            return(result.IsValueCreated ? result.Value : null);
        }
コード例 #2
0
 public IEnumerable <NBitcoin.Block> GetBlocks(IEnumerable <NBitcoin.uint256> hashes, CancellationToken cancellation)
 {
     foreach (var h in hashes)
     {
         yield return(_Client.GetBlock(h));
     }
 }
コード例 #3
0
        public async Task ParseBlock(AssetDefinitionParseBlockContext context)
        {
            try
            {
                _console.Write(nameof(ParseBlockCommandQueueConsumer), nameof(ParseBlock), context.ToJson(), "Started");
                var block = await _indexerClient.GetBlock(uint256.Parse(context.BlockHash));

                foreach (var transaction in block.Transactions.Where(p => p.HasValidColoredMarker()))
                {
                    var assetDefUrl = transaction.TryGetAssetDefinitionUrl();

                    if (assetDefUrl != null)
                    {
                        await _log.WriteInfoAsync(nameof(ParseBlockCommandQueueConsumer),
                                                  nameof(ParseBlock),
                                                  context.ToJson(),
                                                  $"Found asset definition url {assetDefUrl.AbsoluteUri}");

                        await _assetDefinitionCommandProducer.CreateRetrieveAssetDefinitionCommand(assetDefUrl.AbsoluteUri);
                    }
                }


                await _assetDefinitionParsedBlockRepository.AddBlockAsync(AssetDefinitionParsedBlock.Create(context.BlockHash));

                _console.Write(nameof(ParseBlockCommandQueueConsumer), nameof(ParseBlock), context.ToJson(), "Done");
            }
            catch (Exception e)
            {
                await _log.WriteErrorAsync(nameof(ParseBlockCommandQueueConsumer), nameof(ParseBlock), context.ToJson(), e);
            }
        }
コード例 #4
0
ファイル: MainController.cs プロジェクト: lreardon/QBitNinja
        private Block GetHeader(uint256 hash, IndexerClient client)
        {
            var header = Chain.GetBlock(hash);

            if (header == null)
            {
                var b = client.GetBlock(hash);
                if (b == null)
                {
                    return(null);
                }
                return(new Block(b.Header));
            }
            return(new Block(header.Header));
        }
コード例 #5
0
        public async Task <Core.Domain.Block> GetBlock(string id)
        {
            var blockId = NBitcoin.uint256.Parse(id);

            var blockRecord = await Task.Run <NBitcoin.Block>(() => _client.GetBlock(blockId));

            ConcurrentChain chain;

            if (_chain == null)
            {
                _chain = _client.GetMainChain();
            }

            chain = _chain;

            var confirmed = chain.GetBlock(blockId);

            if (blockRecord == null)
            {
                return(null);
            }

            var blockInformation = new BlockInformation
            {
                BlockId        = confirmed.HashBlock,
                BlockHeader    = confirmed.Header,
                Confirmations  = chain.Tip.Height - confirmed.Height + 1,
                Height         = confirmed.Height,
                MedianTimePast = confirmed.GetMedianTimePast(),
                BlockTime      = confirmed.Header.BlockTime
            };

            var transactionList = new List <Core.Domain.Transaction>();

            foreach (var t in blockRecord.Transactions)
            {
                var transInfo     = _client.GetTransaction(t.GetHash());
                var colored       = NBitcoin.OpenAsset.Extensions.HasValidColoredMarker(t);
                var tranExtraInfo = GetTransactionInfo(transInfo, colored, blockInformation);

                var transJson = Serializer.ToString <GetTransactionResponse>(tranExtraInfo, NBitcoin.Network.TestNet);
                var model     = Serializer.ToObject <TransactionNinjaModel>(transJson, NBitcoin.Network.TestNet);

                if (colored)
                {
                    var colorMarker = ColorMarker.Get(t);
                    model.TransactionUrl = colorMarker.GetMetadataUrl();
                }

                model.CalculateInputsWithReturnedChange();

                var transaction = GetTransaction(model);

                transactionList.Add(transaction);
            }

            var block = new Core.Domain.Block()
            {
                Hash              = id,
                Height            = confirmed.Height,
                Time              = confirmed.Header.BlockTime.UtcDateTime,
                Confirmations     = chain.Tip.Height - confirmed.Height + 1,
                Difficulty        = confirmed.Header.Bits.Difficulty,
                MerkleRoot        = confirmed.Header.HashMerkleRoot.ToString(),
                Nonce             = confirmed.Header.Nonce,
                PreviousBlock     = confirmed.Header.HashPrevBlock.ToString(),
                Transactions      = transactionList,
                TotalTransactions = transactionList.Count
            };

            return(block);
        }