protected virtual void HandleResponses(MessageHeader rp, MemoryStream ms) { switch (rp.Operation) { case NetOperationType.Hello: try { HelloResponse response = new HelloResponse(ms, rp); Node.Instance.NodeServers.UpdateNodeServers(response.NodeServers); OnHelloResponse(response); } catch (Exception e) { Log.Error(e.Message, e); } break; case NetOperationType.Transactions: BlockResponse transactionBlockResponse = new BlockResponse(ms, rp); OnGetBlockResponse(transactionBlockResponse); break; case NetOperationType.Blocks: BlockResponse blockResponse = new BlockResponse(ms, rp); OnGetBlockResponse(blockResponse); break; case NetOperationType.CheckPoint: ms.Position = 0; CheckPointResponse checkPointResponse = new CheckPointResponse(ms); break; } }
internal async Task <bool> DownloadCheckPointAsync(uint blockCount) { { uint endBlock = (blockCount / 100) * 100; var blockResponse = await RequestTransactionBlocksAsync(endBlock, 1); var ns = TcpClient.GetStream(); using (var ms = new MemoryStream()) { for (uint i = 0; i <= blockResponse.Blocks.Last().BlockNumber / 10000; i++) { CheckPointRequest checkPointRequest = new CheckPointRequest { Operation = NetOperationType.CheckPoint, RequestType = RequestType.Request, StartBlock = i * 10000, EndBlock = ((i + 1) * 10000) - 1 }; if (checkPointRequest.EndBlock > blockResponse.Blocks.Last().BlockNumber - 1) { checkPointRequest.EndBlock = blockResponse.Blocks.Last().BlockNumber - 1; } checkPointRequest.CheckPointBlockCount = endBlock; checkPointRequest.RequestId = 12345; checkPointRequest.CheckPointHash = blockResponse.Blocks.Last().CheckPointHash; using (MemoryStream requestStream = new MemoryStream()) { checkPointRequest.SaveToStream(requestStream); requestStream.Position = 0; requestStream.CopyTo(ns); ns.Flush(); } WaitForData(10000); Log.Info("Data received"); using (var responseStream = new MemoryStream()) { var rp = await ReadResponse(responseStream); Log.Info("All Data received"); responseStream.Position = 0; CheckPointResponse response = new CheckPointResponse(responseStream); } } return(true); } } }
protected virtual void HandleRequests(MessageHeader rp, MemoryStream ms) { switch (rp.Operation) { case NetOperationType.Blocks: BlockRequest blockRequest = new BlockRequest(ms, rp); var blockResponse = new BlockResponse { RequestId = blockRequest.RequestId, Blocks = BlockChain.Instance.GetBlocks(blockRequest.StartBlock, blockRequest.EndBlock) }; using (MemoryStream memoryStream = new MemoryStream()) { blockResponse.SaveToStream(memoryStream); memoryStream.Position = 0; SendRaw(memoryStream); } break; case NetOperationType.Transactions: { BlockRequest transactionBlockRequest = new BlockRequest(ms, rp); BlockResponse transactionBlockResponse = new BlockResponse { RequestId = transactionBlockRequest.RequestId, Blocks = BlockChain.Instance.GetBlocks(transactionBlockRequest.StartBlock, transactionBlockRequest.EndBlock).ToList() }; using (MemoryStream memoryStream = new MemoryStream()) { transactionBlockResponse.SaveToStream(memoryStream); memoryStream.Position = 0; SendRaw(memoryStream); } break; } case NetOperationType.CheckPoint: var checkPointRequest = new CheckPointRequest(ms, rp); var checkPointResponse = new CheckPointResponse { RequestId = checkPointRequest.RequestId }; break; case NetOperationType.Hello: HelloRequest request = new HelloRequest(ms, rp); Node.Instance.NodeServers.UpdateNodeServers(request.NodeServers); HelloResponse response = new HelloResponse(request) { Timestamp = DateTime.UtcNow, Error = 0, ServerPort = Node.NetParams.Port, Block = BlockChain.Instance.GetLastBlock(), WorkSum = CheckPoints.WorkSum, AccountKey = Node.Instance.NodeKey, RequestType = RequestType.Response, Operation = NetOperationType.Hello }; using (MemoryStream vm = new MemoryStream()) { response.SaveToStream(vm); vm.Position = 0; SendRaw(vm); } break; } }