Пример #1
0
        public BlockchainTree GetLongestBlockchain()
        {
            return(_cache.GetOrCreate(CacheKeys.LongestBlockchain, entry =>
            {
                var blockchainTree = GetBlockchainTree();
                if (blockchainTree?.Blocks == null)
                {
                    return null;
                }

                var blockchain = new BlockchainTree {
                    Blocks = new List <BlockBase>()
                };
                BlockBase block = null;
                do
                {
                    block = block == null
                        ? blockchainTree.Blocks.OrderByDescending(b => b.Depth).FirstOrDefault()
                        : blockchainTree.Blocks.FirstOrDefault(b =>
                                                               // ReSharper disable once AccessToModifiedClosure
                                                               block is Block current && b.UniqueId == current.ParentUniqueId);

                    if (block != null)
                    {
                        blockchain.Blocks.Add(block);
                    }
                } while (block != null);

                return blockchain;
            }));
        }
Пример #2
0
        private void SaveBlockchain(BlockchainTree blockchainTree)
        {
            _cache.Remove(CacheKeys.LastBlock);
            _cache.Remove(CacheKeys.BlockchainTree);
            _cache.Remove(CacheKeys.LongestBlockchain);

            _cache.Set(CacheKeys.BlockchainTree, blockchainTree);

            using (var streamWriter = _fileRepository.GetFileWriter(_blockchainFileName))
                using (var jsonWriter = new JsonTextWriter(streamWriter))
                {
                    _serializer.Serialize(jsonWriter, blockchainTree);
                    jsonWriter.Flush();
                }
        }
        public static BlockBase ManualMap(this IMapper mapper, BlockchainTree blockchainTree)
        {
            if (blockchainTree == null)
            {
                return(null);
            }

            var blocks = mapper.Map <List <BlockBase> >(blockchainTree.Blocks);

            blocks.Where(b => !b.IsGenesis).Cast <Block.Block>().ToList()
            .ForEach(b => b.Parent = blocks.FirstOrDefault(bl => b.ParentUniqueId == bl.UniqueId));

            blocks.ForEach(b => SetupTransactions(b.Body.MerkleTree, b.Body.Transactions));

            return(blocks.OrderByDescending(b => (b as Block.Block)?.Depth ?? 0).FirstOrDefault());
        }
Пример #4
0
        public BlockchainTree GetBlockchainFromBranch(string uniqueId)
        {
            if (uniqueId == null)
            {
                return(null);
            }

            lock (_padlock)
            {
                var blockchainTree = GetBlockchainTree();
                if (blockchainTree?.Blocks == null)
                {
                    return(null);
                }

                var blockchain = new BlockchainTree {
                    Blocks = new List <BlockBase>()
                };
                BlockBase block = null;
                do
                {
                    block = block == null
                        ? blockchainTree.Blocks.FirstOrDefault(b => b.UniqueId == uniqueId)
                        : blockchainTree.Blocks.FirstOrDefault(b =>
                                                               block is Block current && b.UniqueId == current.ParentUniqueId);

                    if (block != null)
                    {
                        blockchain.Blocks.Add(block);
                    }
                } while (block != null);

                blockchain.Blocks = blockchain.Blocks.OrderBy(b => b.Depth).ToList();
                return(blockchain);
            }
        }