diff --git a/README.md b/README.md index 7ea2f24..adf5c84 100644 --- a/README.md +++ b/README.md @@ -37,7 +37,7 @@ Connect on: In the next 3 new terminals run ``` -$ ./dht --peer /ip4/192.168.1.20/tcp/58476/p2p/12D3KooWCEsQ9vbkBCgR7gwF1xcqZiNrNkhA57EjUuho48MiypaT +$ ./dht --peer /ip4/192.168.1.20/tcp/58476/p2p/12D3KooWCEsQ9vbkBCgR7gwF1xcqZiNrNkhA57EjUuho48MiypaT --port --externalIp ``` You'll see all the nodes are connected to each other. \ No newline at end of file diff --git a/main.go b/main.go index 98c3128..16d4bac 100644 --- a/main.go +++ b/main.go @@ -6,11 +6,17 @@ import ( "fmt" "github.com/libp2p/go-libp2p" "github.com/libp2p/go-libp2p/core/host" + "github.com/multiformats/go-multiaddr" "time" ) -func CreateNode() (host.Host, error) { - node, err := libp2p.New() +func CreateNode(externalIp string, port string) (host.Host, error) { + addressFactory, err := getAddressFactory(externalIp, port) + if err != nil { + return nil, err + } + node, err := libp2p.New( + libp2p.AddrsFactory(addressFactory)) if err != nil { return nil, err } @@ -22,12 +28,39 @@ func CreateNode() (host.Host, error) { return node, nil } +func getAddressFactory(externalIP string, port string) (func([]multiaddr.Multiaddr) []multiaddr.Multiaddr, error) { + var ( + externalAddr multiaddr.Multiaddr + err error + ) + + // binding external IP to libp2p node + if len(externalIP) != 0 { + externalAddr, err = multiaddr.NewMultiaddr(fmt.Sprintf("/ip4/%s/tcp/%s", externalIP, port)) + if err != nil { + return nil, fmt.Errorf("fail to create listen with given external IP: %v", err) + } + fmt.Printf("Binding to external IP: %v", externalAddr.String()) + } + addressFactory := func(addrs []multiaddr.Multiaddr) []multiaddr.Multiaddr { + if externalAddr != nil { + return []multiaddr.Multiaddr{externalAddr} + } + return addrs + } + return addressFactory, nil +} + func main() { var discoveryPeers addrList + var externalIp string + var port string flag.Var(&discoveryPeers, "peer", "Peer multi address for peer discovery") + flag.StringVar(&externalIp, "externalIp", "", "Public IP address of user") + flag.StringVar(&port, "port", "", "Port of user") flag.Parse() - node, err := CreateNode() + node, err := CreateNode(externalIp, port) if err != nil { panic(err) }