如何从主机获取 PeerInfo?

How can I get a PeerInfo from a Host?

我正在尝试从 libp2p.Host 实例中获取 PeerInfo。我可以通过调用 Host.Addrs() 获得 multiaddr.Multiaddr 的列表,但我无法将它们转换为有效的 peerstore.PeerInfo.

这是我的尝试,它出现错误 panic: invalid p2p multiaddr

package main

import (
    "log"

    "github.com/SentimensRG/ctx"
    "github.com/SentimensRG/ctx/sigctx"

    libp2p "github.com/libp2p/go-libp2p"
    ps "github.com/libp2p/go-libp2p-peerstore"
)

var c = ctx.AsContext(sigctx.New())

func main() {
    h0, err := libp2p.New(c)
    if err != nil {
        panic(err)
    }    

    addr0 := h0.Addrs()[1]

    _, err := ps.InfoFromP2pAddr(addr0)
    if err != nil {
        panic(err)
    }
}

如何从 libp2p.Host 中获取 peerstore.PeerInfo

PeerInfo 是封装对等 ID 及其多地址的结构。要从主机轻松构建 PeerInfo,您只需执行以下操作:

pi := PeerInfo{
        ID: host.ID(),
        Addrs: host.Addrs(),
}

pstore.InfoFromP2pAddr() 需要具有 p2pipfs 组件的多地址才能填充 PeerInfo.ID 元素。

也就是说,我们绝对可以更轻松地从 Host 获得 PeerInfo。我会努力的 ;-)