Skip to content

No CLI tool for inspecting multiaddrs #119

Description

@sumanjeet0012

go-multiaddr includes a multiaddr CLI binary that parses a multiaddr (string or hex) and outputs detailed JSON information about each component. Python has no equivalent.

Problem

Go's CLI:

$ multiaddr /ip4/1.2.3.4/tcp/80
{
  "string": "/ip4/1.2.3.4/tcp/80",
  "stringSize": "21",
  "packed": "0x04010203040650",
  "packedSize": "9",
  "components": [
    {"string": "/ip4/1.2.3.4", "protocol": "ip4", "codec": "4", "value": "1.2.3.4", ...},
    {"string": "/tcp/80", "protocol": "tcp", "codec": "6", "value": "80", ...}
  ]
}

Proposed Solution

Add multiaddr/cli.py:

import argparse
import json
import sys
from .multiaddr import Multiaddr
from .transforms import bytes_iter

def main():
    parser = argparse.ArgumentParser(description="Inspect multiaddrs")
    parser.add_argument("addr", help="Multiaddr string or hex bytes (0x...)")
    args = parser.parse_args()

    if args.addr.startswith("0x"):
        addr = Multiaddr(bytes.fromhex(args.addr[2:]))
    else:
        addr = Multiaddr(args.addr)

    components = []
    for offset, proto, codec, value in bytes_iter(addr.to_bytes()):
        comp = {
            "protocol": proto.name,
            "code": proto.code,
            "value": codec.to_string(proto, value) if codec.SIZE != 0 else None,
            "rawValue": "0x" + value.hex(),
        }
        components.append(comp)

    result = {
        "string": str(addr),
        "packed": "0x" + addr.to_bytes().hex(),
        "packedSize": len(addr.to_bytes()),
        "components": components,
    }
    print(json.dumps(result, indent=2))

Register as console script in pyproject.toml:

[project.scripts]
multiaddr = "multiaddr.cli:main"

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