From a1e3c2d47cf55fecdbbd066f5d18ec5122490f30 Mon Sep 17 00:00:00 2001 From: Tim Myers Date: Wed, 22 Jan 2020 15:07:22 -0700 Subject: [PATCH] Add --p2p-host-dns flag to specify p2p external DNS (#4608) Co-authored-by: Raul Jordan --- beacon-chain/main.go | 1 + beacon-chain/node/node.go | 1 + beacon-chain/p2p/config.go | 1 + beacon-chain/p2p/options.go | 11 +++++++++++ beacon-chain/p2p/service.go | 21 ++++++++++++++++++++- beacon-chain/usage.go | 1 + shared/cmd/flags.go | 6 ++++++ 7 files changed, 41 insertions(+), 1 deletion(-) diff --git a/beacon-chain/main.go b/beacon-chain/main.go index 21d3c0db60b..2395efb5a89 100644 --- a/beacon-chain/main.go +++ b/beacon-chain/main.go @@ -51,6 +51,7 @@ var appFlags = []cli.Flag{ cmd.P2PUDPPort, cmd.P2PTCPPort, cmd.P2PHost, + cmd.P2PHostDNS, cmd.P2PMaxPeers, cmd.P2PPrivKey, cmd.P2PWhitelist, diff --git a/beacon-chain/node/node.go b/beacon-chain/node/node.go index 995bfce2554..b5c86cf60fc 100644 --- a/beacon-chain/node/node.go +++ b/beacon-chain/node/node.go @@ -269,6 +269,7 @@ func (b *BeaconNode) registerP2P(ctx *cli.Context) error { RelayNodeAddr: ctx.GlobalString(cmd.RelayNode.Name), DataDir: ctx.GlobalString(cmd.DataDirFlag.Name), HostAddress: ctx.GlobalString(cmd.P2PHost.Name), + HostDNS: ctx.GlobalString(cmd.P2PHostDNS.Name), PrivateKey: ctx.GlobalString(cmd.P2PPrivKey.Name), TCPPort: ctx.GlobalUint(cmd.P2PTCPPort.Name), UDPPort: ctx.GlobalUint(cmd.P2PUDPPort.Name), diff --git a/beacon-chain/p2p/config.go b/beacon-chain/p2p/config.go index c89ff3ad705..d3a1d10f4a3 100644 --- a/beacon-chain/p2p/config.go +++ b/beacon-chain/p2p/config.go @@ -10,6 +10,7 @@ type Config struct { Discv5BootStrapAddr []string RelayNodeAddr string HostAddress string + HostDNS string PrivateKey string DataDir string TCPPort uint diff --git a/beacon-chain/p2p/options.go b/beacon-chain/p2p/options.go index 524216fcbfa..c2d7040a592 100644 --- a/beacon-chain/p2p/options.go +++ b/beacon-chain/p2p/options.go @@ -45,6 +45,17 @@ func buildOptions(cfg *Config, ip net.IP, priKey *ecdsa.PrivateKey) []libp2p.Opt return addrs })) } + if cfg.HostDNS != "" { + options = append(options, libp2p.AddrsFactory(func(addrs []multiaddr.Multiaddr) []multiaddr.Multiaddr { + external, err := multiaddr.NewMultiaddr(fmt.Sprintf("/dns4/%s/tcp/%d", cfg.HostDNS, cfg.TCPPort)) + if err != nil { + log.WithError(err).Error("Unable to create external multiaddress") + } else { + addrs = append(addrs, external) + } + return addrs + })) + } return options } diff --git a/beacon-chain/p2p/service.go b/beacon-chain/p2p/service.go index 05ee0d4ff3c..91039acb3b4 100644 --- a/beacon-chain/p2p/service.go +++ b/beacon-chain/p2p/service.go @@ -217,7 +217,15 @@ func (s *Service) Start() { p2pHostAddress := s.cfg.HostAddress p2pTCPPort := s.cfg.TCPPort - logExternalIP4Addr(s.host.ID(), p2pHostAddress, p2pTCPPort) + + if p2pHostAddress != "" { + logExternalIP4Addr(s.host.ID(), p2pHostAddress, p2pTCPPort) + } + + p2pHostDNS := s.cfg.HostDNS + if p2pHostDNS != "" { + logExternalDNSAddr(s.host.ID(), p2pHostDNS, p2pTCPPort) + } } // Stop the p2p service and terminate all peer connections. @@ -380,3 +388,14 @@ func logExternalIP4Addr(id peer.ID, addr string, port uint) { ).Info("Node started external p2p server") } } + +func logExternalDNSAddr(id peer.ID, addr string, port uint) { + if addr != "" { + p := strconv.FormatUint(uint64(port), 10) + + log.WithField( + "multiAddr", + "/dns4/"+addr+"/tcp/"+p+"/p2p/"+id.String(), + ).Info("Node started external p2p server") + } +} diff --git a/beacon-chain/usage.go b/beacon-chain/usage.go index 151048a500f..2313cbc1064 100644 --- a/beacon-chain/usage.go +++ b/beacon-chain/usage.go @@ -95,6 +95,7 @@ var appHelpFlagGroups = []flagGroup{ Name: "p2p", Flags: []cli.Flag{ cmd.P2PHost, + cmd.P2PHostDNS, cmd.P2PMaxPeers, cmd.P2PPrivKey, cmd.P2PWhitelist, diff --git a/shared/cmd/flags.go b/shared/cmd/flags.go index 23a2c18f7ef..b4263e2e45e 100644 --- a/shared/cmd/flags.go +++ b/shared/cmd/flags.go @@ -94,6 +94,12 @@ var ( Usage: "The IP address advertised by libp2p. This may be used to advertise an external IP.", Value: "", } + // P2PHostDNS defines the host DNS to be used by libp2p. + P2PHostDNS = cli.StringFlag{ + Name: "p2p-host-dns", + Usage: "The DNS address advertised by libp2p. This may be used to advertise an external DNS.", + Value: "", + } // P2PPrivKey defines a flag to specify the location of the private key file for libp2p. P2PPrivKey = cli.StringFlag{ Name: "p2p-priv-key",