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; })); }
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()); }
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); } }