private void Check(PeerConnection peer, SyncBlockChainMessage message)
        {
            List <BlockId> ids = message.Ids;

            if (ids.IsNullOrEmpty())
            {
                throw new P2pException(
                          P2pException.ErrorType.BAD_MESSAGE, "SyncBlockChain blockIds is empty");
            }

            BlockId first_id = ids.First();

            if (!Manager.Instance.NetDelegate.ContainBlockInMainChain(first_id))
            {
                throw new P2pException(
                          P2pException.ErrorType.BAD_MESSAGE, "No first block:" + first_id.GetString());
            }

            long head_num = Manager.Instance.NetDelegate.HeadBlockId.Num;

            if (first_id.Num > head_num)
            {
                throw new P2pException(
                          P2pException.ErrorType.BAD_MESSAGE,
                          "First blockNum:" + first_id.Num + " gt my head BlockNum:" + head_num);
            }

            BlockId last_sync_id = peer.LastSyncBlockId;
            long    last_num     = ids[(ids.Count - 1)].Num;

            if (last_sync_id != null &&
                last_sync_id.Num > last_num)
            {
                throw new P2pException(
                          P2pException.ErrorType.BAD_MESSAGE,
                          "lastSyncNum:" + last_sync_id.Num + " gt lastNum:" + last_num);
            }
        }
        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));
        }