package peermgr import ( "fmt" crypto2 "github.com/libp2p/go-libp2p-core/crypto" "github.com/libp2p/go-libp2p-core/peer" "github.com/meshplus/bitxhub-kit/crypto" "github.com/meshplus/bitxhub-kit/crypto/asym/ecdsa" ma "github.com/multiformats/go-multiaddr" "strings" ) func convertToLibp2pPrivKey(privateKey crypto.PrivateKey) (crypto2.PrivKey, error) { ecdsaPrivKey, ok := privateKey.(*ecdsa.PrivateKey) if !ok { return nil, fmt.Errorf("convert to libp2p private key: not ecdsa private key") } libp2pPrivKey, _, err := crypto2.ECDSAKeyPairFromKey(ecdsaPrivKey.K) if err != nil { return nil, err } return libp2pPrivKey, nil } func loadPeers(peers []string, privateKey crypto2.PrivKey) (string, map[string]*peer.AddrInfo, error) { var local string remotes := make(map[string]*peer.AddrInfo) id, err := peer.IDFromPrivateKey(privateKey) if err != nil { return "", nil, err } for _, p := range peers { //p: 127.0.0.1:4567/p2p/QmSoLV4Bbm51jM9C4gDYZQ9Cy3U6aXMJDAbzgu2fzaDs64 if strings.HasSuffix(p, id.String()) { idx := strings.LastIndex(p, "/p2p/") if idx == -1 { return "", nil, fmt.Errorf("pid is not existed in bootstrap") } local = p[:idx] } else { addr, err := AddrToPeerInfo(p) if err != nil { return "", nil, fmt.Errorf("wrong network addr: %w", err) } remotes[addr.ID.String()] = addr } } if local == "" { return "", nil, fmt.Errorf("get local addr: no local addr is configured") } return local, remotes, nil } // AddrToPeerInfo transfer addr to PeerInfo // addr example: "/ip4/104.236.76.40/tcp/4001/ipfs/QmSoLV4Bbm51jM9C4gDYZQ9Cy3U6aXMJDAbzgu2fzaDs64" func AddrToPeerInfo(multiAddr string) (*peer.AddrInfo, error) { maddr, err := ma.NewMultiaddr(multiAddr) if err != nil { return nil, err } return peer.AddrInfoFromP2pAddr(maddr) }