private void OnPongMessageReceived(Message msg) { PongPayload payload = msg.GetPayload <PongPayload>(); Context.Parent.Tell(new Pong { Payload = payload }); }
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); } } } }
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 }); }
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); }
private void OnPing(PingPayload payload) { SendMessage(Message.Create(MessageType.Pong, PongPayload.Create(blockchain.Height, payload.Timestamp))); }
/// <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); }