Improve Multiaddr Protocol Stack Handling using decapsulate_code()
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
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- 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