Go's manet package provides FromNetAddr(net.Addr) and ToNetAddr(ma) for converting between Go's net.Addr and multiaddr. Python has no equivalent for Python's socket address tuples.
Problem
Go:
// From socket address to multiaddr
addr, _ := net.ResolveTCPAddr("tcp", "1.2.3.4:80")
ma, _ := manet.FromNetAddr(addr)
// → /ip4/1.2.3.4/tcp/80
// From multiaddr to socket address
ma, _ := multiaddr.NewMultiaddr("/ip4/1.2.3.4/tcp/80")
addr, _ := manet.ToNetAddr(ma)
// → &net.TCPAddr{IP: 1.2.3.4, Port: 80}
Python has no equivalent. Users must manually parse multiaddr strings and construct socket address tuples.
Proposed Solution
Add to utils.py:
import socket
def from_net_addr(addr: tuple) -> Multiaddr:
"""Convert a socket address tuple to a Multiaddr.
>>> from_net_addr(("1.2.3.4", 80))
Multiaddr("/ip4/1.2.3.4/tcp/80") # (assumes TCP)
"""
host, port = addr[:2]
ip = ipaddress.ip_address(host)
if isinstance(ip, ipaddress.IPv4Address):
return Multiaddr(f"/ip4/{host}/tcp/{port}")
else:
return Multiaddr(f"/ip6/{host}/tcp/{port}")
def to_net_addr(ma: Multiaddr) -> tuple[str, int]:
"""Convert a Multiaddr to a socket address tuple.
>>> to_net_addr(Multiaddr("/ip4/1.2.3.4/tcp/80"))
('1.2.3.4', 80)
"""
opts = get_multiaddr_options(ma)
if opts is None:
raise ValueError(f"{ma} is not a thin waist address")
return (opts["host"], opts["port"])
Related
Go's
manetpackage providesFromNetAddr(net.Addr)andToNetAddr(ma)for converting between Go'snet.Addrand multiaddr. Python has no equivalent for Python'ssocketaddress tuples.Problem
Go:
Python has no equivalent. Users must manually parse multiaddr strings and construct socket address tuples.
Proposed Solution
Add to
utils.py:Related
net/convert.goFromNetAddr(),ToNetAddr()