public Task AddBlock(Block block) { var persisted = new PersistedBlock(block); var prevHeader = MainChain .Find(x => x.Entity.Header.BlockId == block.Header.PreviousBlock) .Select(x => x.Entity.Header) .FirstOrDefault(); if (prevHeader != null) { persisted.Statistics.BlockTime = Convert.ToInt32(TimeSpan.FromTicks(block.Header.Timestamp - prevHeader.Timestamp).TotalSeconds); } MainChain.Insert(persisted); foreach (var txn in block.Transactions) { var pt = txn.Instructions.Select(ins => new PersistedInstruction(block.Header.BlockId, txn.TransactionId, ins, _addressEncoder.HashPublicKey(ins.PublicKey))).ToList(); Instructions.InsertBulk(pt); } ForkChain.Delete(x => x.Entity.Header.BlockId == block.Header.BlockId); return(Task.CompletedTask); }
private Block RehydratePersistedBlock(PersistedBlock persistedBlock) { var result = new Block(); result.Header = persistedBlock.Entity.Header; result.MerkleRootNode = persistedBlock.Entity.MerkleRootNode; var instructions = Instructions.Find(Query.EQ("BlockId", persistedBlock.Entity.Header.BlockId)); result.Transactions = instructions .GroupBy(x => x.TransactionId, new ByteArrayEqualityComparer()) .Select(x => new Transaction(x.Select(y => y.Entity).ToList()) { TransactionId = x.Key }) .ToList(); return(result); }