golibp2p手把手 接入中继教程
第一步 创建中继服务器
关键代码
host, err := libp2p.New(
libp2p.Identity(prvKey),
libp2p.ListenAddrStrings("/ip4/0.0.0.0/tcp/"+*port, "/ip4/0.0.0.0/udp/"+*port+"/quic-v1"),
libp2p.ConnectionManager(connmang),
libp2p.ForceReachabilityPublic(), // 设定公共可到达节点
libp2p.EnableAutoNATv2(),
libp2p.EnableNATService(),
libp2p.AutoNATServiceRateLimit(500, 10, time.Minute),
)
//手动开启relay
_, err = relay.New(host, relay.WithLimit(&relay.RelayLimit{
Duration: time.Minute * 3,
Data: 1024 * 1024 * 10, //单位 kb 10Mb限制
}))
if err != nil {
log.Printf("Failed to open the relay: %v", err)
return
}
第二部 准备两台客户端电脑
客户端都在NAT 后测试
客户端关键代码
//创建本地节点
host, err := libp2p.New()
//预定relay插槽
relayInfo, err := client.Reserve(context.Background(), host, replyPeerInfo)
if err != nil {
log.Printf("预定 中继插槽失败 %v", err)
} else {
host.Network().Listen(relayInfo.Addrs...)
}
//通过kdht 查找peer
...
//启动中继连接 尝试
relayPeer, _ := peer.AddrInfoFromP2pAddr(app.Fconfig.BootstrapPeers[0])
relayaddr, err := multiaddr.NewMultiaddr("/p2p/" + relayPeer.ID.String() + "/p2p-circuit/p2p/" + apeer.ID.String())
host.Network().(*swarm.Swarm).Backoff().Clear(apeer.ID)
unreachPeerWithRelay := peer.AddrInfo{
ID: apeer.ID,
Addrs: []multiaddr.Multiaddr{relayaddr},
}
host.Connect(context.Background(), unreachPeerWithRelay);