github.com/lazyledger/lazyledger-core@v0.35.0-dev.0.20210613111200-4c651f053571/rpc/core/net.go (about) 1 package core 2 3 import ( 4 "errors" 5 "fmt" 6 "strings" 7 8 "github.com/lazyledger/lazyledger-core/p2p" 9 ctypes "github.com/lazyledger/lazyledger-core/rpc/core/types" 10 rpctypes "github.com/lazyledger/lazyledger-core/rpc/jsonrpc/types" 11 ) 12 13 // NetInfo returns network info. 14 // More: https://docs.tendermint.com/master/rpc/#/Info/net_info 15 func NetInfo(ctx *rpctypes.Context) (*ctypes.ResultNetInfo, error) { 16 peersList := env.P2PPeers.Peers().List() 17 peers := make([]ctypes.Peer, 0, len(peersList)) 18 for _, peer := range peersList { 19 nodeInfo, ok := peer.NodeInfo().(p2p.DefaultNodeInfo) 20 if !ok { 21 return nil, fmt.Errorf("peer.NodeInfo() is not DefaultNodeInfo") 22 } 23 peers = append(peers, ctypes.Peer{ 24 NodeInfo: nodeInfo, 25 IsOutbound: peer.IsOutbound(), 26 ConnectionStatus: peer.Status(), 27 RemoteIP: peer.RemoteIP().String(), 28 }) 29 } 30 // TODO: Should we include PersistentPeers and Seeds in here? 31 // PRO: useful info 32 // CON: privacy 33 return &ctypes.ResultNetInfo{ 34 Listening: env.P2PTransport.IsListening(), 35 Listeners: env.P2PTransport.Listeners(), 36 NPeers: len(peers), 37 Peers: peers, 38 }, nil 39 } 40 41 // UnsafeDialSeeds dials the given seeds (comma-separated id@IP:PORT). 42 func UnsafeDialSeeds(ctx *rpctypes.Context, seeds []string) (*ctypes.ResultDialSeeds, error) { 43 if len(seeds) == 0 { 44 return &ctypes.ResultDialSeeds{}, errors.New("no seeds provided") 45 } 46 env.Logger.Info("DialSeeds", "seeds", seeds) 47 if err := env.P2PPeers.DialPeersAsync(seeds); err != nil { 48 return &ctypes.ResultDialSeeds{}, err 49 } 50 return &ctypes.ResultDialSeeds{Log: "Dialing seeds in progress. See /net_info for details"}, nil 51 } 52 53 // UnsafeDialPeers dials the given peers (comma-separated id@IP:PORT), 54 // optionally making them persistent. 55 func UnsafeDialPeers(ctx *rpctypes.Context, peers []string, persistent, unconditional, private bool) ( 56 *ctypes.ResultDialPeers, error) { 57 if len(peers) == 0 { 58 return &ctypes.ResultDialPeers{}, errors.New("no peers provided") 59 } 60 61 ids, err := getIDs(peers) 62 if err != nil { 63 return &ctypes.ResultDialPeers{}, err 64 } 65 66 env.Logger.Info("DialPeers", "peers", peers, "persistent", 67 persistent, "unconditional", unconditional, "private", private) 68 69 if persistent { 70 if err := env.P2PPeers.AddPersistentPeers(peers); err != nil { 71 return &ctypes.ResultDialPeers{}, err 72 } 73 } 74 75 if private { 76 if err := env.P2PPeers.AddPrivatePeerIDs(ids); err != nil { 77 return &ctypes.ResultDialPeers{}, err 78 } 79 } 80 81 if unconditional { 82 if err := env.P2PPeers.AddUnconditionalPeerIDs(ids); err != nil { 83 return &ctypes.ResultDialPeers{}, err 84 } 85 } 86 87 if err := env.P2PPeers.DialPeersAsync(peers); err != nil { 88 return &ctypes.ResultDialPeers{}, err 89 } 90 91 return &ctypes.ResultDialPeers{Log: "Dialing peers in progress. See /net_info for details"}, nil 92 } 93 94 // Genesis returns genesis file. 95 // More: https://docs.tendermint.com/master/rpc/#/Info/genesis 96 func Genesis(ctx *rpctypes.Context) (*ctypes.ResultGenesis, error) { 97 return &ctypes.ResultGenesis{Genesis: env.GenDoc}, nil 98 } 99 100 func getIDs(peers []string) ([]string, error) { 101 ids := make([]string, 0, len(peers)) 102 103 for _, peer := range peers { 104 105 spl := strings.Split(peer, "@") 106 if len(spl) != 2 { 107 return nil, p2p.ErrNetAddressNoID{Addr: peer} 108 } 109 ids = append(ids, spl[0]) 110 111 } 112 return ids, nil 113 }