package common import ( "context" "fmt" "net" "time" "github.com/libp2p/go-libp2p/core/host" pp "github.com/libp2p/go-libp2p/core/peer" "github.com/multiformats/go-multiaddr" ) func PeerIsAlive(h host.Host, ad pp.AddrInfo) bool { ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second) defer cancel() err := h.Connect(ctx, ad) return err == nil } func ExtractIP(addr string) (net.IP, error) { ma, err := multiaddr.NewMultiaddr(addr) if err != nil { return nil, err } ips, err := ma.ValueForProtocol(multiaddr.P_IP4) // or P_IP6 if err != nil { return nil, err } host, _, err := net.SplitHostPort(ips) if err != nil { return nil, err } ip := net.ParseIP(host) if ip == nil { return nil, fmt.Errorf("invalid IP: %s", host) } return ip, nil }