libp2p: Comprehensive Guide for Network Building Enthusiasts
libp2p is a modular network stack that offers developers the tools needed to build robust and scalable peer-to-peer (P2P) applications. Whether you’re creating the next generation of decentralized applications (dApps) or enhancing an existing distributed system, libp2p provides a multitude of capabilities to achieve effective network communication.
API Overview and Code Examples
1. Basic Node Setup
const Libp2p = require('libp2p') const TCP = require('libp2p-tcp') const { NOISE } = require('@chainsafe/libp2p-noise') const MPLEX = require('libp2p-mplex') const node = await Libp2p.create({ modules: { transport: [TCP], connEncryption: [NOISE], streamMuxer: [MPLEX] } }) await node.start() console.log('Node started with id:', node.peerId.toB58String())
2. Discovering Peers
const MDNS = require('libp2p-mdns') const node = await Libp2p.create({ modules: { transport: [TCP], connEncryption: [NOISE], streamMuxer: [MPLEX], peerDiscovery: [MDNS] }, config: { peerDiscovery: { mdns: { interval: 2000, enabled: true } } } }) node.on('peer:discovery', (peerId) => { console.log('Discovered:', peerId.toB58String()) })
3. Connecting to a Peer
const peerInfo = /* Add the peerInfo you want to connect to */ const connection = await node.dial(peerInfo) console.log('Connected to:', peerInfo.id.toB58String())
4. Sending and Receiving Data
node.handle('/app/1.0.0', ({ connection, stream }) => { collect(stream, (data) => { console.log('Received:', data.toString()) stream.write('Pong') }) }) const { stream } = await node.dialProtocol(peerInfo, ['/app/1.0.0']) stream.write('Ping') collect(stream, (data) => { console.log('Received response:', data.toString()) }) function collect(stream, cb) { let data = '' stream.on('data', (chunk) => { data += chunk.toString() }) stream.on('end', () => { cb(data) }) }
App Example: Chat Application
Here’s a simple chat application using libp2p for peer-to-peer communication:
const Libp2p = require('libp2p') const TCP = require('libp2p-tcp') const { NOISE } = require('@chainsafe/libp2p-noise') const MPLEX = require('libp2p-mplex') const MDNS = require('libp2p-mdns') const node = await Libp2p.create({ modules: { transport: [TCP], connEncryption: [NOISE], streamMuxer: [MPLEX], peerDiscovery: [MDNS] }, config: { peerDiscovery: { autoDial: false, mdns: { interval: 2000, enabled: true } } } }) node.on('peer:discovery', (peerId) => { node.dial(peerId).catch(err => console.log('Connection failed', err)) }) node.handle('/chat/1.0.0', ({ connection, stream }) => { collect(stream, (data) => { console.log('Friend:', data.toString()) }) }) async function sendMessage(msg, peerId) { const { stream } = await node.dialProtocol(peerId, ['/chat/1.0.0']) stream.write(msg) collect(stream, (data) => { console.log('Friend:', data.toString()) }) } function collect(stream, cb) { let data = '' stream.on('data', (chunk) => { data += chunk.toString() }) stream.on('end', () => { cb(data) }) } await node.start() console.log('Libp2p node has started') // Manually dial a peer const peerInfo = /* Add the peerInfo you want to connect to */ await sendMessage('Hello!', peerInfo)
With these examples and the companion code snippet, you can create a variety of peer-to-peer applications using libp2p. This modular network stack is powerful and flexible, making it an essential tool for modern network developers.
Hash: e3ad6abccd8b4f5e63b3d3c9380d084f6b28c962aa724798c7e73f1a6966766b