JavaScript implementation of the Kad-DHT for libp2p
npm install @libp2p/kad-dht



> JavaScript implementation of the Kad-DHT for libp2p
This module implements the libp2p Kademlia spec in TypeScript.
The Kademlia DHT allow for several operations such as finding peers, searching for providers of DHT records, etc.
``TypeScript
import { kadDHT } from '@libp2p/kad-dht'
import { createLibp2p } from 'libp2p'
import { peerIdFromString } from '@libp2p/peer-id'
import { ping } from '@libp2p/ping'
import { identify } from '@libp2p/identify'
const node = await createLibp2p({
services: {
dht: kadDHT({
// DHT options
}),
ping: ping(),
identify: identify()
}
})
const peerId = peerIdFromString('QmFoo')
const peerInfo = await node.peerRouting.findPeer(peerId)
console.info(peerInfo) // peer id, multiaddrs
`
The Amino DHT is a public-good DHT used by IPFS to fetch content, find peers, etc.
If you are trying to access content on the public internet, this is the implementation you want.
`TypeScript
import { kadDHT, removePrivateAddressesMapper } from '@libp2p/kad-dht'
import { createLibp2p } from 'libp2p'
import { peerIdFromString } from '@libp2p/peer-id'
import { ping } from '@libp2p/ping'
import { identify } from '@libp2p/identify'
const node = await createLibp2p({
services: {
aminoDHT: kadDHT({
protocol: '/ipfs/kad/1.0.0',
peerInfoMapper: removePrivateAddressesMapper
}),
ping: ping(),
identify: identify()
}
})
const peerId = peerIdFromString('QmFoo')
const peerInfo = await node.peerRouting.findPeer(peerId)
console.info(peerInfo) // peer id, multiaddrs
`
This DHT only works with privately dialable peers.
This is for use when peers are on the local area network.
`TypeScript
import { kadDHT, removePublicAddressesMapper } from '@libp2p/kad-dht'
import { createLibp2p } from 'libp2p'
import { peerIdFromString } from '@libp2p/peer-id'
import { ping } from '@libp2p/ping'
import { identify } from '@libp2p/identify'
const node = await createLibp2p({
services: {
lanDHT: kadDHT({
protocol: '/ipfs/lan/kad/1.0.0',
peerInfoMapper: removePublicAddressesMapper,
clientMode: false
}),
ping: ping(),
identify: identify()
}
})
const peerId = peerIdFromString('QmFoo')
const peerInfo = await node.peerRouting.findPeer(peerId)
console.info(peerInfo) // peer id, multiaddrs
`
When using multiple DHTs, you should specify distinct datastore, metrics and
log prefixes to ensure that data is kept separate for each instance.
`TypeScript
import { kadDHT, removePublicAddressesMapper, removePrivateAddressesMapper } from '@libp2p/kad-dht'
import { createLibp2p } from 'libp2p'
import { peerIdFromString } from '@libp2p/peer-id'
import { ping } from '@libp2p/ping'
import { identify } from '@libp2p/identify'
const node = await createLibp2p({
services: {
lanDHT: kadDHT({
protocol: '/ipfs/lan/kad/1.0.0',
peerInfoMapper: removePublicAddressesMapper,
clientMode: false,
logPrefix: 'libp2p:dht-lan',
datastorePrefix: '/dht-lan',
metricsPrefix: 'libp2p_dht_lan'
}),
aminoDHT: kadDHT({
protocol: '/ipfs/kad/1.0.0',
peerInfoMapper: removePrivateAddressesMapper,
logPrefix: 'libp2p:dht-amino',
datastorePrefix: '/dht-amino',
metricsPrefix: 'libp2p_dht_amino'
}),
ping: ping(),
identify: identify()
}
})
const peerId = peerIdFromString('QmFoo')
const peerInfo = await node.peerRouting.findPeer(peerId)
console.info(peerInfo) // peer id, multiaddrs
`
`console`
$ npm i @libp2p/kad-dht
-
Licensed under either of
- Apache 2.0, (LICENSE-APACHE /
- MIT (LICENSE-MIT /
Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.