Package: libp2p
py-libp2pWARNINGpy-libp2p is an experimental and work-in-progress repo under heavy development. We do not yet recommend using py-libp2p in production environments.The Python implementation of the libp2p networking stackRead more in thedocumentation on ReadTheDocs.View the change log.SponsorshipThis project is graciously sponsored by the Ethereum Foundation throughWave 5 of their Grants Program.MaintainersThe py-libp2p team consists of:@zixuanzh@alexh@stuckinaboot@robzajac@carverDevelopmentpy-libp2p requires Python 3.7 and the best way to guarantee a clean Python 3.7 environment is withvirtualenvgitclonegit@github.com:libp2p/py-libp2p.gitcdpy-libp2p
virtualenv-ppython3.7venv
.venv/bin/activate
pipinstall-e.[dev]Testing SetupDuring development, you might like to have tests run on every file save.Show flake8 errors on file change:# Test flake8when-changed-v-s-r-1libp2p/tests/-c"clear; flake8 libp2p tests && echo 'flake8 success' || echo 'error'"Run multi-process tests in one command, but without color:# in the project root:pytest--numprocesses=4--looponfail--maxfail=1# the same thing, succinctly:pytest-n4-f--maxfail=1Run in one thread, with color and desktop notifications:cdvenv
ptw--onfail"notify-send -t 5000 'Test failure ⚠⚠⚠⚠⚠' 'python 3 test on py-libp2p failed'"../tests../libp2pNote that tests/libp2p/test_libp2p.py contains an end-to-end messaging test between two libp2p hosts, which is the bulk of our proof of concept.Release setupReleases follow the same basic pattern as releases of some tangentially-related projects,
like Trinity. SeeTrinity's release instructions.RequirementsThe protobuf description in this repository was generated byprotocat version3.7.1.Feature Breakdownpy-libp2p aims for conformity withthe standard libp2p modules. Below is a breakdown of the modules we have developed, are developing, and may develop in the future.Legend: :green_apple: Done   :lemon: In Progress   :tomato: Missing   :chestnut: Not plannedlibp2p NodeStatuslibp2p:green_apple:Identify ProtocolStatusIdentify:lemon:Transport ProtocolsStatusTCP:green_apple:UDP:tomato:WebSockets:chestnut:UTP:chestnut:WebRTC:chestnut:SCTP:chestnut:Tor:chestnut:i2p:chestnut:cjdns:chestnut:Bluetooth LE:chestnut:Audio TP:chestnut:Zerotier:chestnut:QUIC:chestnut:Stream MuxersStatusmultiplex:green_apple:yamux:tomato:benchmarks:chestnut:muxado:chestnut:spdystream:chestnut:spdy:chestnut:http2:chestnut:QUIC:chestnut:Protocol MuxersStatusmultiselect:green_apple:Switch (Swarm)StatusSwitch:green_apple:Dialer stack:green_apple:Peer DiscoveryStatusbootstrap list:tomato:Kademlia DHT:chestnut:mDNS:chestnut:PEX:chestnut:DNS:chestnut:Content RoutingStatusKademlia DHT:chestnut:floodsub:green_apple:gossipsub:green_apple:PHT:chestnut:Peer RoutingStatusKademlia DHT:chestnut:floodsub:green_apple:gossipsub:green_apple:PHT:chestnut:NAT TraversalStatusnat-pmp:chestnut:upnp:chestnut:ext addr discovery:chestnut:STUN-like:chestnut:line-switch relay:chestnut:pkt-switch relay:chestnut:ExchangeStatusHTTP:chestnut:Bitswap:chestnut:Bittorrent:chestnut:ConsensusStatusPaxos:chestnut:Raft:chestnut:PBTF:chestnut:Nakamoto:chestnut:Explanation of Basic Two Node CommunicationCore 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:Host: a node in the libp2p network.Connection: the layer 3 connection between two nodes in a libp2p network.Transport: the component that creates aConnection, e.g. TCP, UDP, QUIC, etc.Streams: an abstraction on top of aConnectionrepresenting parallel conversations about different matters, each of which is identified by a protocol ID. Multiple streams are layered on top of aConnectionvia theMultiplexer.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.Secure channel: optionally establishes a secure, encrypted, and authenticated channel over theConnection.Upgrader: a component that takes a raw layer 3 connection returned by theTransport, and performs the security and multiplexing negotiation to set up a secure, multiplexed channel on top of whichStreamscan 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.