1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109
// This file is part of Substrate. // Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. // SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see <https://www.gnu.org/licenses/>. //! Information about the networking, for diagnostic purposes. //! //! **Warning**: These APIs are not stable. use libp2p::{core::ConnectedPoint, Multiaddr}; use serde::{Deserialize, Serialize}; use slog_derive::SerdeValue; use std::{collections::{HashMap, HashSet}, time::Duration}; /// Returns general information about the networking. /// /// Meant for general diagnostic purposes. /// /// **Warning**: This API is not stable. #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, SerdeValue)] #[serde(rename_all = "camelCase")] pub struct NetworkState { /// PeerId of the local node. pub peer_id: String, /// List of addresses the node is currently listening on. pub listened_addresses: HashSet<Multiaddr>, /// List of addresses the node knows it can be reached as. pub external_addresses: HashSet<Multiaddr>, /// List of node we're connected to. pub connected_peers: HashMap<String, Peer>, /// List of node that we know of but that we're not connected to. pub not_connected_peers: HashMap<String, NotConnectedPeer>, /// State of the peerset manager. pub peerset: serde_json::Value, } /// Part of the `NetworkState` struct. Unstable. #[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub struct Peer { /// How we are connected to the node. pub endpoint: PeerEndpoint, /// Node information, as provided by the node itself. Can be empty if not known yet. pub version_string: Option<String>, /// Latest ping duration with this node. pub latest_ping_time: Option<Duration>, /// If true, the peer is "enabled", which means that we try to open Substrate-related protocols /// with this peer. If false, we stick to Kademlia and/or other network-only protocols. pub enabled: bool, /// If true, the peer is "open", which means that we have a Substrate-related protocol /// with this peer. pub open: bool, /// List of addresses known for this node. pub known_addresses: HashSet<Multiaddr>, } /// Part of the `NetworkState` struct. Unstable. #[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub struct NotConnectedPeer { /// List of addresses known for this node. pub known_addresses: HashSet<Multiaddr>, /// Node information, as provided by the node itself, if we were ever connected to this node. pub version_string: Option<String>, /// Latest ping duration with this node, if we were ever connected to this node. pub latest_ping_time: Option<Duration>, } /// Part of the `NetworkState` struct. Unstable. #[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub enum PeerEndpoint { /// We are dialing the given address. Dialing(Multiaddr), /// We are listening. Listening { /// Local address of the connection. local_addr: Multiaddr, /// Address data is sent back to. send_back_addr: Multiaddr, }, } impl From<ConnectedPoint> for PeerEndpoint { fn from(endpoint: ConnectedPoint) -> Self { match endpoint { ConnectedPoint::Dialer { address } => PeerEndpoint::Dialing(address), ConnectedPoint::Listener { local_addr, send_back_addr } => PeerEndpoint::Listening { local_addr, send_back_addr } } } }