public void RequestHandler(INetworkStream stream) { using (stream) { // wrap reporter var message = new IdentifyContract { Protocols = Host.Mux.Protocols, ObservedAddress = stream.Connection.RemoteMultiaddress.ToBytes(), ListenAddresses = Host.Addresses.Select(laddr => laddr.ToBytes()).ToArray(), ProtocolVersion = LibP2PVersion, AgentVersion = ClientVersion }; var ownKey = Host.Peerstore.PublicKey(Host.Id); if (ownKey == null) { Debug.WriteLine("Did not have own public key in Peerstore"); } else { message.PublicKey = ownKey.Bytes; } Serializer.SerializeWithLengthPrefix(((IWriter)stream).AsSystemStream(), message, PrefixStyle.Fixed32BigEndian); } }
private void ConsumeMessage(IdentifyContract message, INetworkConnection connection) { var p = connection.RemotePeer; Host.Peerstore.AddProtocols(p, message.Protocols); ConsumeObservedAddress(message.ObservedAddress, connection); var lmaddrs = message.ListenAddresses.Select(Multiaddress.Decode).ToArray(); if (HasConsistentTransport(connection.RemoteMultiaddress, lmaddrs)) { lmaddrs = lmaddrs.Append(connection.RemoteMultiaddress); } Host.Peerstore.SetAddresses(p, lmaddrs, AddressManager.ConnectedAddrTTL); if (!ProtocolVersionsAreCompatible(message.ProtocolVersion, LibP2PVersion)) { connection.Dispose(); return; } Host.Peerstore.Put(p, "ProtocolVersion", message.ProtocolVersion); Host.Peerstore.Put(p, "AgentVersion", message.AgentVersion); ConsumeReceivedPublicKey(connection, message.PublicKey); }