Example #1
0
        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;
            }
        }
Example #2
0
        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);
                }
            }
        }
Example #3
0
        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;
            }
        }