This repository is the central place for rust development of the libp2p spec.
This readme along with many others will be more fleshed out the closer the project gets to completion. Right now everything including the crate organization is very much Work in Progress.
This repository includes a facade crate named libp2p
, which reexports the rest of the repository.
Architecture of the other crates of this repository:
cid
: implements CID (Content IDentifier): Self-describing content-addressed identifiers for distributed systems.circular-buffer
: An optimized FIFO queue that allows safe access to the internal storage as a slice (i.e. not just element-by-element). This is useful for circular buffers of bytes. Since it usessmallvec
'sArray
trait it can only be backed by an array of static size, this may change in the future.core
: Transport, protocol upgrade and swarm systems of libp2p. This crate contains all the core traits and mechanisms of the transport and swarm systems of libp2p.datastore
: Utility library whose API provides a key-value storage with multiple possible backends. Used bypeerstore
.dns
: this crate provides the typeDnsConfig
that allows one to resolve the/dns4/
and/dns6/
components of multiaddresses.example
: Example usages of this library.floodsub
: a flooding PubSub implementation for p2p messaging.identify
: implementation of the/ipfs/id/1.0.0
protocol that allows a node A to query another node B what information B knows about A. Implements theConnectionUpgrade
trait ofcore
. Also includes the addresses B is listening on.kad
: kademlia DHT implementation for peer routingmplex
: Implements a binary stream multiplexer, streams multiple streams of binary data over a single binary stream.multiaddr
: composable, future-proof, efficient and self-describing network addressesmultihash
: self identifying hashes; differentiating outputs from various well-established cryptographic hash functions; addressing size + encoding considerations; future-proofing use of hashes, and allowing multiple hash functions to coexist.multistream-select
: used internally by libp2p to negotiate a protocol over a newly-established connection with a peer, or after a connection upgrade.peerstore
: Generic storage for information about remote peers (their multiaddresses and their public key), with multiple possible backends. Each multiaddress also has a time-to-live. Used bycore
.ping
: Implementation of theping
protocol (the exact protocol is specific to libp2p). Implements theConnectionUpgrade
trait ofcore
.ratelimit
: manages rate limiting with a connection. Also see here for design.relay
: Implements the/libp2p/circuit/relay/0.1.0
protocol. It allows a sourceA
to connect to a destinationB
via an intermediate relay nodeR
to whichB
is already connected to. This is used as a last resort to makeB
reachable from other nodes when it would normally not be, e.g. due to certain NAT setups.rw-stream-sink
: Utility library that makes it possible to wrap around a tokioStream + Sink
of bytes and implementsAsyncRead + AsyncWrite
.secio
: Implementation of thesecio
protocol. Encrypts communications. Implements theConnectionUpgrade
trait ofcore
.tcp-transport
: Implementation of theTransport
trait ofcore
for TCP/IP.uds
: Implementation ofTransport
for UNIX domain sockets.varint
: encoding and decoding state machines for protobuf varints.websocket
: Implementation of theTransport
trait ofcore
for Websockets.
Right now a lot of code of this library uses Box<Future>
or Box<Stream>
objects, or forces
'static
lifetime bounds.
This is caused by the lack of a stable impl Trait
syntax in the Rust language. Once this syntax
is fully implemented and stabilized, it will be possible to change this code to use plain and
non-static objects instead of boxes.
Progress for the impl Trait
syntax can be tracked in this issue of the Rust repository.
Once this syntax is stable in the nightly version, we will consider requiring the nightly version of the compiler and switching to this syntax.