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);
        }
 public PersistedInstruction(Instruction entity, IAddressEncoder addressEncoder)
     : base(entity)
 {
     Id = entity.InstructionId;
     Statistics.PublicKeyHash = addressEncoder.HashPublicKey(entity.PublicKey);
 }