Bootstrap Nodes and Discover Peers
This guide provides detailed steps to bootstrap your your node using Static Peers and discover peers in the Waku Network using DNS Discovery.
If you do not set up a bootstrap node or discovery mechanism, your node will not connect to any remote peer.
Until node incentivisation is in place, you should operate extra nodes alongside the ones provided by the Waku Network. When running a node, we recommend using the DNS Discovery and Static Peers configuration to connect to both the Waku Network and your node.
Default bootstrap method
The @waku/sdk
package provides a built-in bootstrapping method that uses DNS Discovery to locate peers from the waku v2.prod
ENR
tree.
import { createLightNode } from "@waku/sdk";
// Bootstrap node using the default bootstrap method
const node = await createLightNode({ defaultBootstrap: true });
Configure static peers
To set static peers, a list of multiaddr
to bootstrap the node should be passed to the bootstrapPeers
parameter of the createLightNode()
function:
import { createLightNode } from "@waku/sdk";
// Bootstrap node using static peers
const node = await createLightNode({
bootstrapPeers: ["[PEER MULTIADDR]"],
});
For example, consider a node that connects to two static peers on the same local host (IP: 0.0.0.0
) using TCP ports 60002
and 60003
with WebSocket enabled:
// Define the list of static peers to bootstrap
const peers = [
"/ip4/0.0.0.0/tcp/60002/ws/p2p/16Uiu2HAkzjwwgEAXfeGNMKFPSpc6vGBRqCdTLG5q3Gmk2v4pQw7H",
"/ip4/0.0.0.0/tcp/60003/ws/p2p/16Uiu2HAmFBA7LGtwY5WVVikdmXVo3cKLqkmvVtuDu63fe8safeQJ",
];
// Bootstrap node using the static peers
const node = await createLightNode({
bootstrapPeers: peers,
});
Alternatively, you can dial a particular node like this:
// Define the list of static peers to bootstrap
const peers = [
"/ip4/0.0.0.0/tcp/60002/ws/p2p/16Uiu2HAkzjwwgEAXfeGNMKFPSpc6vGBRqCdTLG5q3Gmk2v4pQw7H",
"/ip4/0.0.0.0/tcp/60003/ws/p2p/16Uiu2HAmFBA7LGtwY5WVVikdmXVo3cKLqkmvVtuDu63fe8safeQJ",
];
const node = await createLightNode();
// In case nodes are using `ws` protocol - additional configuration is needed:
/*
import { webSockets } from "@libp2p/websockets";
import { all as filterAll } from "@libp2p/websockets/filters";
const node = await createLightNode({
libp2p: {
transports: [webSockets({ filter: filterAll })],
},
});
*/
const promises = peers.map(multiaddr => node.dial(multiaddr));
await Promise.all(promises);
For local development using a nwaku
node, use a ws
address instead of wss
. Remember that this setup is functional only when your web server is running locally. You can check how to get multi address of your locally run node in Find node address.
Configure DNS discovery
To bootstrap a node using DNS Discovery, first install the @waku/dns-discovery
package:
npm install @waku/dns-discovery
yarn add @waku/dns-discovery
Then, use the wakuDnsDiscovery()
function to provide a list of URLs for DNS node list in the format enrtree://<key>@<fqdn>
:
import { createLightNode } from "@waku/sdk";
import { wakuDnsDiscovery } from "@waku/dns-discovery";
// Define DNS node list
const enrTree = "enrtree://[PUBLIC KEY]@[DOMAIN NAME]";
// Define node requirements
const NODE_REQUIREMENTS = {
store: 3,
lightPush: 3,
filter: 3,
};
// Bootstrap node using DNS Discovery
const node = await createLightNode({
libp2p: {
peerDiscovery: [
wakuDnsDiscovery(
[enrTree],
NODE_REQUIREMENTS,
),
],
},
});
For example, consider a node that uses the waku v2.prod
and waku v2.test
ENR
trees for DNS Discovery
:
import { enrTree } from "@waku/dns-discovery";
// Bootstrap node using DNS Discovery
const node = await createLightNode({
libp2p: {
peerDiscovery: [
wakuDnsDiscovery(
[enrTree["PROD"], enrTree["TEST"]],
NODE_REQUIREMENTS,
),
],
},
});
Configure DNS discovery and static peers
You can also bootstrap your node using DNS Discovery and Static Peers simultaneously:
import { createLightNode } from "@waku/sdk";
import { bootstrap } from "@libp2p/bootstrap";
import { enrTree, wakuDnsDiscovery } from "@waku/dns-discovery";
// Define the list of static peers to bootstrap
const peers = [
"/ip4/0.0.0.0/tcp/60002/ws/p2p/16Uiu2HAkzjwwgEAXfeGNMKFPSpc6vGBRqCdTLG5q3Gmk2v4pQw7H",
"/ip4/0.0.0.0/tcp/60003/ws/p2p/16Uiu2HAmFBA7LGtwY5WVVikdmXVo3cKLqkmvVtuDu63fe8safeQJ",
];
// Define node requirements
const NODE_REQUIREMENTS = {
store: 3,
lightPush: 3,
filter: 3,
};
// Bootstrap node using DNS Discovery and static peers
const node = await createLightNode({
libp2p: {
bootstrapPeers: peers,
peerDiscovery: [
wakuDnsDiscovery(
[enrTree["PROD"]],
NODE_REQUIREMENTS,
),
],
},
});
Retrieving connected peers
You can retrieve the array of peers connected to a node using the libp2p.getPeers()
function within the @waku/sdk
package:
import { createLightNode, waitForRemotePeer } from "@waku/sdk";
const node = await createLightNode({ defaultBootstrap: true });
await waitForRemotePeer(node);
// Retrieve array of peers connected to the node
console.log(node.libp2p.getPeers());