The Python implementation of the libp2p networking stack 🐍 [under development]
Go to file
stuckinaboot 7fa674dee2
Protocol muxing (#82)
* Implement protocol muxing

* Integrate protocol muxing into new stream and listen's conn handler

* Fix bugs in protocol muxing

* Remove blank line

* Add comments and fix linting issues

* Fix order of parameters to select_one_of to match interface

* Use array of protocol ids in new stream instead of protocol id

* Add basic protocol muxer tests

* Add todo

* Modify new stream to take in protocol ids

* Add check to all tests to ensure protocol id is saved to net stream properly

* Lint tests

* Fix lint issues

* Add todo

* Modify port numbers in tests

* Fix linting issues

* Add more documentation to functions

* Add docs describing classes and fix indent error
2018-11-28 13:51:50 -05:00
assets added to readme 2018-11-07 13:06:29 -05:00
encryption fixed typo 2018-11-12 13:19:31 -05:00
examples/chat Protocol muxing (#82) 2018-11-28 13:51:50 -05:00
host Protocol muxing (#82) 2018-11-28 13:51:50 -05:00
kademlia Replace kad-dht with bmuller/kademlia 2018-10-14 10:32:27 -04:00
libp2p refactor libp2p 2018-11-25 01:45:13 -05:00
network Protocol muxing (#82) 2018-11-28 13:51:50 -05:00
peer WIP CI Build Errors (#76) 2018-11-26 18:24:29 -05:00
protocol_muxer Protocol muxing (#82) 2018-11-28 13:51:50 -05:00
stream_muxer Switch message buffers to blocking queues and update reading logic (#83) 2018-11-28 12:58:16 -05:00
tests Protocol muxing (#82) 2018-11-28 13:51:50 -05:00
transport WIP CI Build Errors (#76) 2018-11-26 18:24:29 -05:00
.gitignore Minor add to gitignore: pycharm 2018-10-21 11:18:35 -04:00
.pylintrc WIP CI Build Errors (#76) 2018-11-26 18:24:29 -05:00
.travis.yml WIP CI Build Errors (#76) 2018-11-26 18:24:29 -05:00
conftest.py enable CI 2018-11-26 19:01:13 +01:00
COPYRIGHT Dual license (MIT+Apache2) 2018-11-16 11:55:12 -08:00
LICENSE-APACHE Dual license (MIT+Apache2) 2018-11-16 11:55:12 -08:00
LICENSE-MIT Dual license (MIT+Apache2) 2018-11-16 11:55:12 -08:00
README.md Adding gitter badge 2018-11-28 13:28:57 -05:00
requirements.txt add click and base58 to requiremrents.txt 2018-11-19 17:29:54 +01:00

py-libp2p Build Status codecov Gitter chat

py-libp2p hex logo

WARNING

py-libp2p is an experimental and work-in-progress repo under heavy development. We do not yet recommend using py-libp2p in production environments.

Development

py-libp2p requires Python 3.6 and the best way to guarantee a clean Python 3.6 environment is with virtualenv

virtualenv -p python3.6 venv
. venv/bin/activate
pip3 install -r requirements.txt

Testing

After installing our requirements (see above), you can:

cd tests
pytest

Note 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.

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.