libp2p / libp2p/py-libp2p

Improve Multiaddr Protocol Stack Handling using decapsulate_code()

Open
#1,223 1 comment 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Dominant language
Python
Stars
624
Forks
256
Avg merge
1d 34m
Merged PRs (30d)
47

Description

Problem

Currently the code manually removes protocols using string-constructed Multiaddr objects
Location: libp2p/transport/websocket/multiaddr_utils.py

rest_multiaddr = rest_multiaddr.decapsulate(Multiaddr("/ws"))
rest_multiaddr = rest_multiaddr.decapsulate(Multiaddr(f"/sni/{sni}"))
rest_multiaddr = rest_multiaddr.decapsulate(Multiaddr("/tls"))

And circuit relay parsing performs complex protocol extraction logic instead of using protocol stack operations.

# Lines 480-521: Complex manual parsing of circuit addresses
def _parse_circuit_multiaddr(self, ma: multiaddr.Multiaddr) -> tuple[multiaddr.Multiaddr, ID]:
    # Manual protocol extraction and parsing

Drawbacks:

  • String parsing overhead
  • Error-prone when protocol ordering varies
  • Harder to read intent
  • Duplicates functionality already provided by py-multiaddr
  • Fragile for edge cases (optional protocols, reordered stacks)

Proposed Solution or improvement

Use decapsulate_code(protocol_code) provided by py-multiaddr and replace some manual instance from codebase

Location: libp2p/transport/websocket/multiaddr_utils.py

# current code
rest_multiaddr = rest_multiaddr.decapsulate(Multiaddr("/ws"))
rest_multiaddr = rest_multiaddr.decapsulate(Multiaddr(f"/sni/{sni}"))
rest_multiaddr = rest_multiaddr.decapsulate(Multiaddr("/tls"))

# Replace
from multiaddr.protocols import P_WS, P_SNI, P_TLS
rest_multiaddr = maddr.decapsulate_code(P_WS)
if sni:
    rest_multiaddr = rest_multiaddr.decapsulate_code(P_SNI)
rest_multiaddr = rest_multiaddr.decapsulate_code(P_TLS)

Location: libp2p/relay/circuit_v2/transport.py

Simplify manual protocol extraction logic in _parse_circuit_multiaddr by using protocol codes

# Current code
# Lines 480-521: Complex manual parsing of circuit addresses
def _parse_circuit_multiaddr(self, ma: multiaddr.Multiaddr) -> tuple[multiaddr.Multiaddr, ID]:
    # Manual protocol extraction and parsing

# Replace
from multiaddr.protocols import P_P2P_CIRCUIT, P_P2P
# remove /p2p-circuit layer
circuit_base = ma.decapsulate_code(P_P2P_CIRCUIT)
# extract relay peer address
relay_addr = circuit_base.decapsulate_code(P_P2P)

Are you planning to do it yourself in a pull request?

Yes, the above improvements plan and suggestions are referred from discussion (py-libp2p Multiaddr Integration Status and Improvement Opportunities) #1171

@seetadev @acul71

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start in libp2p/transport/websocket/multiaddr_utils.py at the listed decapsulation code, then read _parse_circuit_multiaddr in libp2p/relay/circuit_v2/transport.py. Compare the current manual handling with py-multiaddr protocol-code operations, including optional and reordered protocols. Done means both locations use protocol codes while preserving websocket and circuit address behavior.

Written by the indexing model from the issue text.

Assessment

Tech stack
python
Domain
networking
Issue type
Refactor
Difficulty
4/5
Estimated time
3-5 days
Activity status
Active
Clarity
Mostly clear
Newbie friendliness
58/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.