libp2p
is a collection of several protocols working together to offer a common solid interface that can talk with any other network addressable process. This is made possible by shimming currently existing protocols and implementations into a set of explicit interfaces: Peer Routing, Discovery, Stream Muxing, Transports, Connections and so on.
libp2p
, the top module that provides an interface to all the other modules that make a libp2p
instance, must offer an interface for dialing to a peer and plugging in all of the modules (e.g. which transports) we want to support. We present the libp2p
interface and UX in section 6.6, after presenting every other module interface.
A Peer Routing module offers a way for a libp2p
Node
to find the PeerInfo
of another Node
, so that it can dial that node. In its most pure form, a Peer Routing module should have an interface that takes a 'key', and returns a set of PeerInfo
s.
See https://github.com/libp2p/interface-peer-routing for the interface and tests.
Current interface available and updated at:
https://github.com/libp2p/js-libp2p-swarm#usage
https://github.com/libp2p/interface-transport
https://github.com/libp2p/interface-connection
https://github.com/libp2p/interface-stream-muxer
https://github.com/libp2p/interface-record-store
A Peer Discovery module interface should return PeerInfo
objects, as it finds new peers to be considered by our Peer Routing modules.
libp2p
implementations should enable it to be instantiated programmatically, or to use a previous compiled library with some of the protocol decisions already made, so that the user can reuse or expand.
Example made with JavaScript, should be mapped to other languages:
var Libp2p = require('libp2p')
var node = new Libp2p()
// add a swarm instance
node.addSwarm(swarmInstance)
// add one or more Peer Routing mechanisms
node.addPeerRouting(peerRoutingInstance)
// add a Distributed Record Store
node.addDistributedRecordStore(distributedRecordStoreInstance)
Configuring libp2p
is quite straightforward since most of the configuration comes from instantiating the several modules, one at a time.
Ideally, libp2p
uses its own mechanisms (PeerRouting and Record Store) to find a way to dial to a given peer:
node.dial(PeerInfo)
To receive an incoming connection, specify one or more protocols to handle:
node.handleProtocol('<multicodec>', function (duplexStream) {
})
Finding a peer is done through Peer Routing, so the interface is the same.
Like Finding a peer, Storing and Retrieving records is done through Record Store, so the interface is the same.