libp2p is a modular network stack that allows you to build your own peer-to-peer applications with ease. This framework provides a robust set of network protocols and tools that aim to make decentralized and distributed systems faster, safer, and more connected.
Introduction to libp2p
libp2p is designed to handle the complexities of network communication, so you can focus on building your application. It provides essential networking features such as peer discovery, transport abstraction, stream multiplexing, and more. It is used extensively in protocols like IPFS, Filecoin, and other decentralized networks.
Core APIs and Code Snippets
Peer Discovery
Peer discovery lets your application find other peers in the network. Here is an example:
import { KadDHT } from '@libp2p/kad-dht'
import { createLibp2p } from 'libp2p'
import { WebSockets } from '@libp2p/websockets'
import { NOISE } from '@chainsafe/libp2p-noise'
const node = await createLibp2p({
transports: [new WebSockets()],
connectionEncryption: [new NOISE()],
peerDiscovery: [new KadDHT()]
})
// Listen for peer discovery events
node.on('peer:discovery', (peerId) => {
console.log(`Discovered peer ${peerId.toString()}`)
})
await node.start()
Transport Abstraction
libp2p allows you to use different transport protocols like WebSockets, WebRTC, and TCP seamlessly:
import { TCP } from '@libp2p/tcp'
import { WebSockets } from '@libp2p/websockets'
import { createLibp2p } from 'libp2p'
import { Mplex } from '@libp2p/mplex'
import { NOISE } from '@chainsafe/libp2p-noise'
const node = await createLibp2p({
transports: [
new TCP(),
new WebSockets()
],
streamMuxers: [
new Mplex()
],
connectionEncryption: [
new NOISE()
]
})
await node.start()
Stream Multiplexing
Stream multiplexing allows multiple independent logical connections to be encapsulated within a single physical connection:
import { Mplex } from '@libp2p/mplex'
import { createLibp2p } from 'libp2p'
const node = await createLibp2p({
streamMuxers: [new Mplex()]
})
// Creating a new stream
const { stream } = await node.dialProtocol(peerId, '/echo/1.0.0')
await stream.write(new TextEncoder().encode('Hello, World!'))
Connection Encryption
libp2p makes secure encrypted connections using various encryption protocols:
import { createLibp2p } from 'libp2p'
import { Noise } from '@chainsafe/libp2p-noise'
import { WebSockets } from '@libp2p/websockets'
const node = await createLibp2p({
connectionEncryption: [new Noise()],
transports: [new WebSockets()]
})
await node.start()
Usage in an Application Example
Here’s a full example that combines these APIs into a simple chat application:
import { createLibp2p } from 'libp2p'
import { TCP } from '@libp2p/tcp'
import { WebSockets } from '@libp2p/websockets'
import { Mplex } from '@libp2p/mplex'
import { NOISE } from '@chainsafe/libp2p-noise'
import { KadDHT } from '@libp2p/kad-dht'
import { PubSub } from '@libp2p/gossipsub'
const node = await createLibp2p({
transports: [
new TCP(),
new WebSockets()
],
streamMuxers: [new Mplex()],
connectionEncryption: [new Noise()],
peerDiscovery: [new KadDHT()],
pubsub: new PubSub()
})
node.pubsub.subscribe('chat')
node.pubsub.on('chat', (msg) => {
console.log(`Received: ${new TextDecoder().decode(msg.data)}`)
})
await node.start()
// Sending a chat message
document.getElementById('chatForm').onsubmit = async (e) => {
e.preventDefault()
const message = document.getElementById('message').value
await node.pubsub.publish('chat', new TextEncoder().encode(message))
}
In this example, we create a libp2p node that uses multiple transport protocols, peer discovery, stream multiplexing, encryption, and pub-sub for messaging. This structure is ideal for building a decentralized chat application.
Hash: e3ad6abccd8b4f5e63b3d3c9380d084f6b28c962aa724798c7e73f1a6966766b