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