예제 #1
0
 public void ParseInvitationResponseRequest(InvitationResponseRequest request, Peer from)
 {
     if (request.IsBlock)
     {
         var bb = LookUpBlock(request.WantedDataId);
         _logger.Log($"Got new inv response : {request.WantedDataId}");
         if (bb != null)
         {
             var req = new BlockRequest()
             {
                 Block = bb
             };
             _logger.Log($"Sending new inv response : {request.WantedDataId}");
             _server.SendResponse(req, from);
         }
     }
     else
     {
         var tt = TryGetTransaction(request.WantedDataId);
         _logger.Log($"Got new inv response : {request.WantedDataId}");
         if (tt != null)
         {
             var req = new TransactionRequest()
             {
                 Transaction = tt
             };
             _logger.Log($"Sending new inv response : {request.WantedDataId}");
             _server.SendResponse(req, from);
         }
     }
 }
예제 #2
0
        public void ParseCatcherUpRequest(CatcherUpRequest request, Peer from)
        {
            supposedLongestBlockId = request.EndOfLongestChain;
            _logger.Log($"Ketchupper {request.EndOfLongestChain} - Count:{request.Invs.Count}");

            foreach (var inv in request.Invs)
            {
                if (inv.IsBlock)
                {
                    if (!IsBlockBuffered(inv.DataId))
                    {
                        var req = new InvitationResponseRequest()
                        {
                            IsBlock      = true,
                            WantedDataId = inv.DataId
                        };
                        _server.SendResponse(req, from);
                    }
                }
                else
                {
                    if (!bufferedTransactions.Exists(r => r.Body.TransactionId == inv.DataId))
                    {
                        var req = new InvitationResponseRequest()
                        {
                            IsBlock      = false,
                            WantedDataId = inv.DataId
                        };
                        _server.SendResponse(req, from);
                    }
                }
            }

            if (request.EndOfLongestChain == _blockChainService.Info.EndOfLongestChain && request.Invs.Count == 0)
            {
                CaughtUp = true;
                _logger.Log("Ketchup cas its ended and no invs.");
            }
        }
예제 #3
0
        public void ParseInvitationRequest(InvitationRequest request, Peer from)
        {
            var req = new InvitationResponseRequest()
            {
                IsBlock      = request.IsBlock,
                WantedDataId = request.DataId
            };
            var took = false;

            if (_askedForRequests.Exists(r => r.DataId == request.DataId && r.IsBlock == request.IsBlock))
            {
                return;
            }

            if (request.IsBlock)
            {
                var bb = LookUpBlock(request.DataId);

                if (bb == null)
                {
                    took = true;
                }
            }
            else
            {
                if (WantedTransaction(request) && _minerService.MemPool.ToList().FindAll(r => r.Body.TransactionId == request.DataId).Count == 0)
                {
                    took = true;
                }
            }

            if (took)
            {
                _askedForRequests.Add(request);
                _logger.Log($"Asked for data {request.DataId} ISBlock:{request.IsBlock}");
                _server.SendResponse(req, from);
            }
        }