github.com/turingchain2020/turingchain@v1.1.21/system/p2p/dht/extension/relayAddr.go (about) 1 package extension 2 3 import ( 4 "strings" 5 6 "github.com/libp2p/go-libp2p/config" 7 ma "github.com/multiformats/go-multiaddr" 8 ) 9 10 // WithRelayAddrs 会自动把relay的地址加入到自己的addrs 中,然后进行广播,这样其他节点收到包含有relay地址格式的节点地址时, 11 //如果接收到的节点打开了启用relay服务功能,就会触发relay协议进行尝试连接。 12 /* 13 比如 中继服务器R的地址:/ip4/116.63.171.186/tcp/13801/p2p/16Uiu2HAm1Qgogf1vHj7WV7d8YmVNPw6PzRuYEnJbQsMDmDWtLoEM 14 NAT 后面的一个普通节点A是:/ip4/192.168.1.101/tcp/13801/p2p/16Uiu2HAkw6w2YVenbCLAXHv2XVo1kh945GVxQrpm5Y6z2kE3eFSg 15 第一步:A--->R A连接到中继节点R 16 第二步:A开始组装自己的中继地址: 17 [/ip4/116.63.171.186/tcp/13801/p2p/16Uiu2HAm1Qgogf1vHj7WV7d8YmVNPw6PzRuYEnJbQsMDmDWtLoEM/p2p-circuit/ip4/192.168.1.101/tcp 18 /13801/p2p/16Uiu2HAkw6w2YVenbCLAXHv2XVo1kh945GVxQrpm5Y6z2kE3eFSg] 19 第三步:A广播这个拼接后的带有p2p-circuit的地址 20 第四步:网络中的节点不论是NAT前面的或者NAT后面的节点,如果想连接节点PID为16Uiu2HAkw6w2YVenbCLAXHv2XVo1kh945GVxQrpm5Y6z2kE3eFSg的A节点, 21 只需要通过上述组装的带有p2p-circuit的地址就可以建立到与A的连接 22 23 */ 24 func WithRelayAddrs(relays []string) config.AddrsFactory { //添加多个relay地址 25 return func(addrs []ma.Multiaddr) []ma.Multiaddr { 26 if len(relays) == 0 { 27 return addrs 28 } 29 30 var relayAddrs []ma.Multiaddr 31 for _, a := range addrs { 32 if strings.Contains(a.String(), "/p2p-circuit") { 33 continue 34 } 35 for _, relay := range relays { 36 relayAddr, err := ma.NewMultiaddr(relay + "/p2p-circuit" + a.String()) 37 if err != nil { 38 log.Error("Failed to create multiaddress for relay node: %v", err) 39 } else { 40 relayAddrs = append(relayAddrs, relayAddr) 41 } 42 } 43 44 } 45 46 if len(relayAddrs) == 0 { 47 log.Warn("no relay addresses") 48 return addrs 49 } 50 return append(addrs, relayAddrs...) 51 } 52 }