Skip to content

Latest commit

 

History

History
132 lines (92 loc) · 9.29 KB

File metadata and controls

132 lines (92 loc) · 9.29 KB

py-libp2p

py-libp2p hex logo

Support py-libp2p on drips.network

The Python implementation of the libp2p networking stack.

py-libp2p has moved beyond its experimental roots and is progressing toward production readiness. Core modules are stable, with active work on performance, protocol coverage, and interop with other libp2p implementations. We welcome contributions and real-world usage feedback.

Maintainers

Maintained by @pacrob, @seetadev, and @dhuseby.

Questions or ideas? Start a discussion: https://github.com/libp2p/py-libp2p/discussions Join the Discord: https://discord.gg/d92MEugb (#py-libp2p)

Feature Breakdown

✅ Stable · 🛠️ In Progress · 🌱 Prototype · ❌ Not Yet Implemented

Transports

Transport Status Source
libp2p-tcp https://github.com/libp2p/py-libp2p/blob/main/libp2p/transport/tcp/tcp.py
libp2p-quic https://github.com/libp2p/py-libp2p/tree/main/libp2p/transport/quic
libp2p-websocket https://github.com/libp2p/py-libp2p/tree/main/libp2p/transport/websocket
libp2p-webrtc-browser-to-server 🌱
libp2p-webrtc-private-to-private 🌱

NAT Traversal

NAT Traversal Status Source
libp2p-circuit-relay-v2 https://github.com/libp2p/py-libp2p/tree/main/libp2p/relay/circuit_v2
libp2p-autonat https://github.com/libp2p/py-libp2p/tree/main/libp2p/host/autonat
libp2p-hole-punching https://github.com/libp2p/py-libp2p/tree/main/libp2p/relay/circuit_v2

Secure Communication

Secure Channel Status Source
libp2p-noise https://github.com/libp2p/py-libp2p/tree/main/libp2p/security/noise
libp2p-tls

Discovery

Discovery Status Source
bootstrap https://github.com/libp2p/py-libp2p/tree/main/libp2p/discovery/bootstrap
random-walk https://github.com/libp2p/py-libp2p/tree/main/libp2p/discovery/random_walk
mdns-discovery https://github.com/libp2p/py-libp2p/tree/main/libp2p/discovery/mdns
rendezvous https://github.com/libp2p/py-libp2p/tree/main/libp2p/discovery/rendezvous

Peer Routing

Peer Routing Status Source
libp2p-kad-dht https://github.com/libp2p/py-libp2p/tree/main/libp2p/kad_dht

Publish/Subscribe

PubSub Status Source
libp2p-floodsub https://github.com/libp2p/py-libp2p/blob/main/libp2p/pubsub/floodsub.py
libp2p-gossipsub https://github.com/libp2p/py-libp2p/blob/main/libp2p/pubsub/gossipsub.py

Stream Muxers

Muxer Status Source
libp2p-yamux https://github.com/libp2p/py-libp2p/tree/main/libp2p/stream_muxer/yamux
libp2p-mplex https://github.com/libp2p/py-libp2p/tree/main/libp2p/stream_muxer/mplex

Storage

Storage Status
libp2p-record

General Purpose Utilities & Datatypes

Utility/Datatype Status Source
libp2p-ping source
libp2p-peer source
libp2p-identify source

Explanation of Basic Two Node Communication

Core Concepts

(non-normative, useful for team notes, not a reference)

Several components of the libp2p stack take part when establishing a connection between two nodes:

  1. Host: a node in the libp2p network.
  2. Connection: the layer 3 connection between two nodes in a libp2p network.
  3. Transport: the component that creates a Connection, e.g. TCP, UDP, QUIC, etc.
  4. Streams: an abstraction on top of a Connection representing parallel conversations about different matters, each of which is identified by a protocol ID. Multiple streams are layered on top of a Connection via the Multiplexer.
  5. Multiplexer: a component that is responsible for wrapping messages sent on a stream with an envelope that identifies the stream they pertain to, normally via an ID. The multiplexer on the other unwraps the message and routes it internally based on the stream identification.
  6. Secure channel: optionally establishes a secure, encrypted, and authenticated channel over the Connection.
  7. Upgrader: a component that takes a raw layer 3 connection returned by the Transport, and performs the security and multiplexing negotiation to set up a secure, multiplexed channel on top of which Streams can be opened.

Communication between two hosts X and Y

(non-normative, useful for team notes, not a reference)

Initiate the connection: A host is simply a node in the libp2p network that is able to communicate with other nodes in the network. In order for X and Y to communicate with one another, one of the hosts must initiate the connection. Let's say that X is going to initiate the connection. X will first open a connection to Y. This connection is where all of the actual communication will take place.

Communication over one connection with multiple protocols: X and Y can communicate over the same connection using different protocols and the multiplexer will appropriately route messages for a given protocol to a particular handler function for that protocol, which allows for each host to handle different protocols with separate functions. Furthermore, we can use multiple streams for a given protocol that allow for the same protocol and same underlying connection to be used for communication about separate topics between nodes X and Y.

Why use multiple streams?: The purpose of using the same connection for multiple streams to communicate over is to avoid the overhead of having multiple connections between X and Y. In order for X and Y to differentiate between messages on different streams and different protocols, a multiplexer is used to encode the messages when a message will be sent and decode a message when a message is received. The multiplexer encodes the message by adding a header to the beginning of any message to be sent that contains the stream id (along with some other info). Then, the message is sent across the raw connection and the receiving host will use its multiplexer to decode the message, i.e. determine which stream id the message should be routed to.

Support

If py-libp2p has been useful to your project or organization, please consider supporting ongoing development:

Support py-libp2p on drips.network