public void ProcessMessage(PeerConnection peer, Messages.MineralMessage message)
        {
            SyncBlockChainMessage sync_message = (SyncBlockChainMessage)message;

            Check(peer, sync_message);

            long           remain_num = 0;
            List <BlockId> ids        = GetLostBlockIds(sync_message.Ids);

            if (ids.Count == 1)
            {
                peer.IsNeedSyncUs = false;
            }
            else
            {
                peer.IsNeedSyncUs = true;
                remain_num        = Manager.Instance.NetDelegate.HeadBlockId.Num - ids.Last().Num;
            }

            peer.LastSyncBlockId = ids.Last();
            peer.RemainNum       = remain_num;
            peer.SendMessage(new ChainInventoryMessage(ids, remain_num));
        }
        public void ProcessMessage(PeerConnection peer, Messages.MineralMessage message)
        {
            FetchInventoryDataMessage fetch_message = (FetchInventoryDataMessage)message;

            Check(peer, fetch_message);

            InventoryType      type         = fetch_message.InventoryType;
            List <Transaction> transactions = new List <Transaction>();

            int size = 0;

            foreach (SHA256Hash hash in fetch_message.GetHashList())
            {
                Item item = new Item(hash, type);

                Message msg = Manager.Instance.AdvanceService.GetMessage(item);
                if (msg == null)
                {
                    try
                    {
                        msg = Manager.Instance.NetDelegate.GetData(hash, type);
                    }
                    catch (System.Exception e)
                    {
                        Logger.Error(
                            string.Format("Fetch item {0} failed. reason: {1}",
                                          item,
                                          hash,
                                          e.Message));
                        peer.Disconnect(ReasonCode.FetchFail, e.Message);

                        return;
                    }
                }

                if (type == InventoryType.Block)
                {
                    BlockId block_id = ((BlockMessage)msg).Block.Id;
                    if (peer.BlockBothHave.Num < block_id.Num)
                    {
                        peer.BlockBothHave = block_id;
                    }

                    peer.SendMessage(msg);
                }
                else
                {
                    transactions.Add(((TransactionMessage)msg).Transaction.Instance);
                    size += ((TransactionMessage)msg).Transaction.Instance.CalculateSize();

                    if (size > MAX_SIZE)
                    {
                        peer.SendMessage(new TransactionsMessage(transactions));
                        transactions = new List <Transaction>();
                        size         = 0;
                    }
                }
            }
            if (transactions.Count > 0)
            {
                peer.SendMessage(new TransactionsMessage(transactions));
            }
        }