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); }
public IEnumerable <NBitcoin.Block> GetBlocks(IEnumerable <NBitcoin.uint256> hashes, CancellationToken cancellation) { foreach (var h in hashes) { yield return(_Client.GetBlock(h)); } }
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); } }
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)); }
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); }