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