Skip to content

No from_net_addr() / to_net_addr() functions for socket address conversion #115

Description

@sumanjeet0012

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions