Replies: 1 comment
-
|
@acul71 I raised a pr regarding this improvement. Currently, phase 1 is implemented. CCing : @seetadev |
Beta Was this translation helpful? Give feedback.
0 replies
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
-
py-libp2p Multibase Integration Status and Improvement Opportunities
Executive Summary
This document analyzes the current usage of base encoding functionality in py-libp2p and identifies opportunities to leverage py-multibase (v2.0.0+) to improve code quality, interoperability, and maintainability.
Key Finding: py-libp2p currently uses direct base58 and base64 encoding without multibase prefixes. The codebase does not import or use the py-multibase library. Integrating py-multibase can provide self-describing encodings, better error handling, encoding detection, and support for multiple encoding formats.
py-multibase Overview
What is Multibase?
Multibase is a protocol for distinguishing base encodings and ensuring full compatibility with program interfaces. It answers the question: Given data d encoded into string s, how can I tell what base d is encoded with?
Multibase solves the problem by prefixing encoded data with a single character that identifies the encoding used, making the encoding self-describing.
py-multibase Features (v2.0.0)
Core Functions
encode(encoding, data)- Encode data with a multibase prefixdecode(data, return_encoding=False)- Decode multibase-encoded datais_encoded(data)- Check if data is multibase-encodedget_codec(data)- Get encoding information from multibase datais_encoding_supported(encoding)- Check if encoding is supportedlist_encodings()- List all supported encodingsget_encoding_info(encoding)- Get detailed encoding informationReusable Classes
Encoder(encoding)- Reusable encoder for a specific encodingDecoder()- Reusable decoder with composition supportComposedDecoder- Try multiple decoders in sequenceSupported Encodings
py-multibase supports 24+ encodings including:
base2,base8,base10,base16,base16upperbase32,base32upper,base32pad,base32padupperbase32hex,base32hexupper,base32hexpad,base32hexpadupperbase32z,base36,base36upperbase58flickr,base58btc(most common for libp2p)base64,base64pad,base64url,base64urlpadbase256emojiidentity(no encoding, just prefix)Error Handling
MultibaseError- Base exceptionUnsupportedEncodingError- Encoding not supportedInvalidMultibaseStringError- Invalid multibase formatDecodingError- Decoding failureCurrent State Analysis
1. Peer ID Encoding (Base58 Without Multibase Prefix)
Location:
libp2p/peer/id.pyCurrent Implementation:
Issues:
base58library instead of standardized multibaseUsage Locations:
libp2p/peer/peerinfo.py-info_from_p2p_addr(),peer_info_from_bytes()libp2p/relay/circuit_v2/transport.py- Multiple peer ID parsing locationslibp2p/discovery/mdns/listener.py- Peer ID parsinglibp2p/discovery/bootstrap/bootstrap.py- Peer ID parsinglibp2p/transport/quic/transport.py- Peer ID parsinglibp2p/rcmgr/manager.py- Peer ID parsinglibp2p/security/tls/certificate.py- Certificate CN encodinglibp2p/security/tls/transport.py- Peer ID handling2. DHT Key Encoding (Base58 Utility)
Location:
libp2p/kad_dht/utils.pyCurrent Implementation:
Issues:
Usage Locations:
3. Pubsub Message ID Encoding (Base64 Without Multibase Prefix)
Location:
libp2p/pubsub/pubsub.pyCurrent Implementation:
Issues:
base64instead of multibaseAdditional Base58 Usage in Pubsub:
4. Test Utilities
Location:
tests/core/peer/test_peerid.pyCurrent Implementation:
Issues:
5. Example Code
Locations:
examples/pubsub/pubsub.pyexamples/pubsub/floodsub.pyCurrent Implementation:
Issues:
Improvement Opportunities
1. Peer ID Encoding with Multibase (High Priority)
Current Problem: Peer IDs are encoded as plain base58 strings without multibase prefix, making them not self-describing and limiting encoding flexibility.
Proposed Solution: Use multibase for peer ID encoding/decoding while maintaining backward compatibility.
Benefits:
Implementation Approach:
Migration Strategy:
from_base58to try multibase decoding first, fallback to base58Files to Update:
libp2p/peer/id.py- Core peer ID classlibp2p/peer/peerinfo.py- Peer info parsinglibp2p/relay/circuit_v2/transport.py- Relay peer ID parsinglibp2p/discovery/mdns/listener.py- mDNS peer ID parsinglibp2p/discovery/bootstrap/bootstrap.py- Bootstrap peer ID parsinglibp2p/transport/quic/transport.py- QUIC peer ID parsinglibp2p/security/tls/certificate.py- TLS certificate handlinglibp2p/rcmgr/manager.py- Resource manager peer ID handling2. DHT Key Encoding with Multibase (Medium Priority)
Current Problem: DHT keys use a utility function that only supports base58.
Proposed Solution: Replace
bytes_to_base58with multibase-aware functions.Benefits:
Implementation:
Files to Update:
libp2p/kad_dht/utils.py- DHT utility functionslibp2p/kad_dht/kad_dht.py- DHT key handling3. Pubsub Message ID Encoding with Multibase (Medium Priority)
Current Problem: Message IDs use base64 without multibase prefix.
Proposed Solution: Use multibase for message IDs.
Benefits:
Implementation:
Files to Update:
libp2p/pubsub/pubsub.py- Message ID generation4. Enhanced Error Handling (Low Priority)
Current Problem: Direct base58/base64 usage provides limited error information.
Proposed Solution: Use multibase's exception hierarchy.
Benefits:
Implementation:
5. Encoding Detection and Validation (Low Priority)
Current Problem: No way to detect or validate encoding of existing data.
Proposed Solution: Use multibase's detection capabilities.
Benefits:
Implementation:
6. Support for Multiple Encodings (Low Priority)
Current Problem: Hardcoded to base58/base64 only.
Proposed Solution: Use multibase's encoding support.
Benefits:
Use Cases:
base64urlorbase32base32z(z-base-32)base36orbase58btc7. Reusable Encoder/Decoder Classes (Low Priority)
Current Problem: Encoding/decoding logic is scattered and not reusable.
Proposed Solution: Use multibase's
EncoderandDecoderclasses.Benefits:
Implementation:
Integration Plan
Phase 1: Add Multibase Support (Non-Breaking)
Add py-multibase dependency
pyproject.tomlto includepy-multibase>=2.0.0Extend Peer ID Class
to_multibase()methodfrom_multibase()methodfrom_string()smart parserto_base58()andfrom_base58()for backward compatibilityUpdate Utility Functions
Add Tests
Phase 2: Internal Migration
Update Internal Code
Update Pubsub
Update Examples
Phase 3: External API (Optional)
Consider Making Multibase Default
Add Configuration
Dependencies
Current Dependencies
base58>=1.0.3- Direct base58 encodingProposed Addition
py-multibase>=2.0.0- Multibase encoding supportNote: py-multibase internally uses:
python-baseconv>=1.2.0,<2.0- Base conversion utilitiesmorphys>=1.0,<2.0- Bytes/string handlingCompatibility
base58library during migrationTesting Considerations
Test Cases to Add
Multibase Encoding/Decoding
Backward Compatibility
Encoding Detection
Error Handling
Multiple Encodings
Interoperability Considerations
libp2p Specification
The libp2p specification does not mandate multibase for peer IDs, but many implementations are moving toward multibase for better interoperability. Using multibase would:
Backward Compatibility
is_encoded()to detect multibase vs plain base58Performance Considerations
Encoding/Decoding Performance
Encoder/Decoderclasses for repeated operationsMemory Impact
Documentation Updates Needed
API Documentation
to_multibase()andfrom_multibase()methodsMigration Guide
Examples
Summary
Current State
With py-multibase Integration
Priority Recommendations
Estimated Effort
Total: ~2 weeks for complete integration
References
Beta Was this translation helpful? Give feedback.
All reactions