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  }