コード例 #1
0
ファイル: ProtocolHandler.cs プロジェクト: ZoroChain/Zoro
        private void OnPongMessageReceived(Message msg)
        {
            PongPayload payload = msg.GetPayload <PongPayload>();

            Context.Parent.Tell(new Pong {
                Payload = payload
            });
        }
コード例 #2
0
        void AttachedNode_MessageReceived(Node node, IncomingMessage message)
        {
            InvPayload invPayload = message.Message.Payload as InvPayload;

            if (invPayload != null)
            {
                foreach (var hash in invPayload.Where(i => i.Type == InventoryType.MSG_TX).Select(i => i.Hash))
                {
                    var tx = GetTransaction(hash, true);
                    if (tx != null)
                    {
                        tx.State = BroadcastState.Accepted;
                    }
                    Transaction unused;
                    if (_BroadcastHub.BroadcastedTransaction.TryRemove(hash, out unused))
                    {
                        _BroadcastHub.OnTransactionBroadcasted(tx.Transaction);
                    }
                }
            }

            GetDataPayload getData = message.Message.Payload as GetDataPayload;

            if (getData != null)
            {
                foreach (var inventory in getData.Inventory.Where(i => i.Type == InventoryType.MSG_TX))
                {
                    var tx = GetTransaction(inventory.Hash, false);
                    if (tx != null)
                    {
                        tx.State = BroadcastState.Broadcasted;
                        var ping = new PingPayload();
                        tx.PingValue = ping.Nonce;
                        _PingToTransaction.TryAdd(tx.PingValue, tx);
                        node.SendMessageAsync(new TxPayload(tx.Transaction));
                        node.SendMessageAsync(ping);
                    }
                }
            }

            PongPayload pong = message.Message.Payload as PongPayload;

            if (pong != null)
            {
                var tx = GetTransaction(pong.Nonce, true);
                if (tx != null)
                {
                    tx.State = BroadcastState.Accepted;
                    Transaction unused;
                    if (_BroadcastHub.BroadcastedTransaction.TryRemove(tx.Transaction.GetHash(), out unused))
                    {
                        _BroadcastHub.OnTransactionBroadcasted(tx.Transaction);
                    }
                }
            }
        }
コード例 #3
0
        private void OnPong(PongPayload payload)
        {
            Latency = GetAverageLatency(payload.Timestamp);

            Interlocked.Exchange(ref height, (int)payload.Height);

            system.TaskManager.Tell(new TaskManager.UpdateSession {
                Height = payload.Height, Latency = Latency
            });
        }
コード例 #4
0
        public void ConstructorTest()
        {
            PingPayload ping = new PingPayload();

            ping.SetToCurrentTime();
            PongPayload pong = new PongPayload(123);

            Assert.NotEqual(0L, ping.Nonce);
            Assert.Equal(PayloadType.Ping, ping.PayloadType);
            Assert.Equal(123L, pong.Nonce);
            Assert.Equal(PayloadType.Pong, pong.PayloadType);
        }
コード例 #5
0
 private void OnPing(PingPayload payload)
 {
     SendMessage(Message.Create(MessageType.Pong, PongPayload.Create(blockchain.Height, payload.Timestamp)));
 }
コード例 #6
0
        /// <inheritdoc/>
        public Message[] GetReply(Message msg)
        {
            if (!Enum.TryParse(Encoding.ASCII.GetString(msg.PayloadName.TrimEnd()), ignoreCase: true, out PayloadType plt))
            {
                // Undefined payload type
                nodeStatus.AddSmallViolation();
            }
            else
            {
                if (nodeStatus.HandShake != HandShakeState.Finished)
                {
                    if (plt == PayloadType.Verack)
                    {
                        var verack = new VerackPayload();
                        if (!verack.TryDeserialize(new FastStreamReader(msg.PayloadData), out _))
                        {
                            nodeStatus.AddSmallViolation();
                        }
                        else if (nodeStatus.HandShake == HandShakeState.None ||
                                 nodeStatus.HandShake == HandShakeState.Finished ||
                                 nodeStatus.HandShake == HandShakeState.SentAndConfirmed)
                        {
                            nodeStatus.AddMediumViolation();
                        }
                        else if (nodeStatus.HandShake == HandShakeState.ReceivedAndReplied ||
                                 nodeStatus.HandShake == HandShakeState.SentAndReceived)
                        {
                            nodeStatus.HandShake = HandShakeState.Finished;
                        }
                        else if (nodeStatus.HandShake == HandShakeState.Sent)
                        {
                            nodeStatus.HandShake = HandShakeState.SentAndConfirmed;
                        }
                    }
                    else if (plt == PayloadType.Version)
                    {
                        var version = new VersionPayload();
                        if (!version.TryDeserialize(new FastStreamReader(msg.PayloadData), out _))
                        {
                            nodeStatus.AddSmallViolation();
                        }
                        else if (nodeStatus.HandShake == HandShakeState.None)
                        {
                            nodeStatus.HandShake = HandShakeState.ReceivedAndReplied;
                            return(new Message[2]
                            {
                                new Message(new VerackPayload(), settings.Network),
                                GetVersionMsg(version.TransmittingNodeNetworkAddress)
                            });
                        }
                        else if (nodeStatus.HandShake == HandShakeState.Sent)
                        {
                            nodeStatus.HandShake = HandShakeState.SentAndReceived;
                            return(new Message[1]
                            {
                                new Message(new VerackPayload(), settings.Network)
                            });
                        }
                        else if (nodeStatus.HandShake == HandShakeState.SentAndConfirmed)
                        {
                            nodeStatus.HandShake = HandShakeState.Finished;
                            return(new Message[1]
                            {
                                new Message(new VerackPayload(), settings.Network)
                            });
                        }
                        else if (nodeStatus.HandShake == HandShakeState.ReceivedAndReplied ||
                                 nodeStatus.HandShake == HandShakeState.SentAndReceived ||
                                 nodeStatus.HandShake == HandShakeState.Finished)
                        {
                            nodeStatus.AddMediumViolation();
                        }
                    }
                    else
                    {
                        // HandShake is not complete but the other node is sending other types of messages
                        nodeStatus.AddMediumViolation();
                    }
                }
                else
                {
                    switch (plt)
                    {
                    case PayloadType.Addr:
                        break;

                    case PayloadType.Alert:
                        // Alert messages are ignored
                        break;

                    case PayloadType.Block:
                        break;

                    case PayloadType.BlockTxn:
                        break;

                    case PayloadType.CmpctBlock:
                        break;

                    case PayloadType.FeeFilter:
                        break;

                    case PayloadType.FilterAdd:
                        break;

                    case PayloadType.FilterClear:
                        break;

                    case PayloadType.FilterLoad:
                        break;

                    case PayloadType.GetAddr:
                        break;

                    case PayloadType.GetBlocks:
                        break;

                    case PayloadType.GetBlockTxn:
                        break;

                    case PayloadType.GetData:
                        break;

                    case PayloadType.GetHeaders:
                        break;

                    case PayloadType.Headers:
                        break;

                    case PayloadType.Inv:
                        break;

                    case PayloadType.MemPool:
                        break;

                    case PayloadType.MerkleBlock:
                        break;

                    case PayloadType.NotFound:
                        break;

                    case PayloadType.Ping:
                        var ping = new PingPayload();
                        if (!ping.TryDeserialize(new FastStreamReader(msg.PayloadData), out _))
                        {
                            nodeStatus.AddSmallViolation();
                            break;
                        }
                        return(new Message[1] {
                            new Message(new PongPayload(ping.Nonce), settings.Network)
                        });

                    case PayloadType.Pong:
                        var pong = new PongPayload();
                        if (!pong.TryDeserialize(new FastStreamReader(msg.PayloadData), out _))
                        {
                            nodeStatus.AddSmallViolation();
                            break;
                        }
                        break;

                    case PayloadType.Reject:
                        // Reject messages are ignored
                        break;

                    case PayloadType.SendCmpct:
                        break;

                    case PayloadType.SendHeaders:
                        break;

                    case PayloadType.Tx:
                        break;

                    case PayloadType.Verack:
                    case PayloadType.Version:
                        nodeStatus.AddMediumViolation();
                        break;

                    default:
                        break;
                    }
                }
            }

            nodeStatus.UpdateTime();
            return(null);
        }