What to do now?
Let’s try to use some basic functions of libp2p to send ping messages between two peers with js.
Requirement
- Nodejs> 12.16.x
Setup folder
1 2 3 4 5 6 7 8 9 10 11 12 | # create a directory for the project and `cd` into it > mkdir hello-libp2p > mkdir hello-libp2p/src > cd hello-libp2p # make it a git repository > git init . # make it an npm project. fill in the prompts with info for your project # when asked for your project's entry point, enter "src/index.js" > npm init |
Configure libp2p
Next is to install libp2p
1 2 3 4 | npm install libp2p // OR yarn add libp2p |
Basic setup
H, you have finished installing libp2p then h please configure a bit. We need 2 modules of libp2p: Transport and Crypto . However, according to their docs, it should also setup Stream Multiplexer . Start setting up each part.
Transports
Libp2p uses Transports to establish connections between peers through the network. You can configure as many Transports as you like, but in this demo you only need 1. There are many protocols supported but please select tcp.
1 2 3 4 | npm install libp2p-tcp // OR yarn add libp2p-tcp |
After installation is complete, write a few lines of code so that libp2p can use TCP
1 2 3 4 5 6 7 8 9 | <span class="token keyword">const</span> Libp2p <span class="token operator">=</span> <span class="token function">require</span> <span class="token punctuation">(</span> <span class="token string">'libp2p'</span> <span class="token punctuation">)</span> <span class="token keyword">const</span> <span class="token constant">TCP</span> <span class="token operator">=</span> <span class="token function">require</span> <span class="token punctuation">(</span> <span class="token string">'libp2p-tcp'</span> <span class="token punctuation">)</span> <span class="token keyword">const</span> node <span class="token operator">=</span> <span class="token keyword">await</span> Libp2p <span class="token punctuation">.</span> <span class="token function">create</span> <span class="token punctuation">(</span> <span class="token punctuation">{</span> modules <span class="token punctuation">:</span> <span class="token punctuation">{</span> transport <span class="token punctuation">:</span> <span class="token punctuation">[</span> <span class="token constant">TCP</span> <span class="token punctuation">]</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> |
In that Libp2p.create
initialize and modules transport
to choose the protocol and you can choose more protocols because the transport received is an array .
Connection Encryption
All connections must be encrypted to ensure user privacy. There are many Crypto modules developed for libp2p and in this demo use libp2p-secio
1 2 3 4 | npm install libp2p-secio // OR yarn add libp2p-secio |
Add the secio section to:
1 2 3 4 5 6 7 8 9 10 11 | <span class="token keyword">const</span> Libp2p <span class="token operator">=</span> <span class="token function">require</span> <span class="token punctuation">(</span> <span class="token string">'libp2p'</span> <span class="token punctuation">)</span> <span class="token keyword">const</span> <span class="token constant">TCP</span> <span class="token operator">=</span> <span class="token function">require</span> <span class="token punctuation">(</span> <span class="token string">'libp2p-tcp'</span> <span class="token punctuation">)</span> <span class="token keyword">const</span> <span class="token constant">SECIO</span> <span class="token operator">=</span> <span class="token function">require</span> <span class="token punctuation">(</span> <span class="token string">'libp2p-secio'</span> <span class="token punctuation">)</span> <span class="token keyword">const</span> node <span class="token operator">=</span> <span class="token keyword">await</span> Libp2p <span class="token punctuation">.</span> <span class="token function">create</span> <span class="token punctuation">(</span> <span class="token punctuation">{</span> modules <span class="token punctuation">:</span> <span class="token punctuation">{</span> transport <span class="token punctuation">:</span> <span class="token punctuation">[</span> <span class="token constant">TCP</span> <span class="token punctuation">]</span> <span class="token punctuation">,</span> connEncryption <span class="token punctuation">:</span> <span class="token punctuation">[</span> <span class="token constant">SECIO</span> <span class="token punctuation">]</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> |
Multiplexing
Although Multiplexing is not required, it is advisable to learn it because it helps improve the efficiency of connections on the protocols that libp2p runs.
1 2 3 4 | npm install libp2p-mplex // OR yarn add libp2p-mplex |
Add mplex part to:
1 2 3 4 5 6 7 8 9 10 11 12 13 | <span class="token keyword">const</span> Libp2p <span class="token operator">=</span> <span class="token function">require</span> <span class="token punctuation">(</span> <span class="token string">'libp2p'</span> <span class="token punctuation">)</span> <span class="token keyword">const</span> <span class="token constant">TCP</span> <span class="token operator">=</span> <span class="token function">require</span> <span class="token punctuation">(</span> <span class="token string">'libp2p-tcp'</span> <span class="token punctuation">)</span> <span class="token keyword">const</span> <span class="token constant">SECIO</span> <span class="token operator">=</span> <span class="token function">require</span> <span class="token punctuation">(</span> <span class="token string">'libp2p-secio'</span> <span class="token punctuation">)</span> <span class="token keyword">const</span> <span class="token constant">MPLEX</span> <span class="token operator">=</span> <span class="token function">require</span> <span class="token punctuation">(</span> <span class="token string">'libp2p-mplex'</span> <span class="token punctuation">)</span> <span class="token keyword">const</span> node <span class="token operator">=</span> <span class="token keyword">await</span> Libp2p <span class="token punctuation">.</span> <span class="token function">create</span> <span class="token punctuation">(</span> <span class="token punctuation">{</span> modules <span class="token punctuation">:</span> <span class="token punctuation">{</span> transport <span class="token punctuation">:</span> <span class="token punctuation">[</span> <span class="token constant">TCP</span> <span class="token punctuation">]</span> <span class="token punctuation">,</span> connEncryption <span class="token punctuation">:</span> <span class="token punctuation">[</span> <span class="token constant">SECIO</span> <span class="token punctuation">]</span> <span class="token punctuation">,</span> streamMuxer <span class="token punctuation">:</span> <span class="token punctuation">[</span> <span class="token constant">MPLEX</span> <span class="token punctuation">]</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> |
Let’s try it
We have already configured the Transport , Crypto and Stream Multiplexer modules, so let’s run libp2p node. Use libp2p.start () and libp2p.stop () to start and stop the node.
A libp2p node needs to listen to an address on the protocol that we have installed. Then we will install more multiaddr to create a tcp multiaddress and add it to the node
1 2 3 4 | npm install multiaddr // OR yarn add multiaddr |
Add multiaddr
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | <span class="token keyword">const</span> Libp2p <span class="token operator">=</span> <span class="token function">require</span> <span class="token punctuation">(</span> <span class="token string">'libp2p'</span> <span class="token punctuation">)</span> <span class="token keyword">const</span> <span class="token constant">TCP</span> <span class="token operator">=</span> <span class="token function">require</span> <span class="token punctuation">(</span> <span class="token string">'libp2p-tcp'</span> <span class="token punctuation">)</span> <span class="token keyword">const</span> <span class="token constant">SECIO</span> <span class="token operator">=</span> <span class="token function">require</span> <span class="token punctuation">(</span> <span class="token string">'libp2p-secio'</span> <span class="token punctuation">)</span> <span class="token keyword">const</span> <span class="token constant">MPLEX</span> <span class="token operator">=</span> <span class="token function">require</span> <span class="token punctuation">(</span> <span class="token string">'libp2p-mplex'</span> <span class="token punctuation">)</span> <span class="token keyword">const</span> multiaddr <span class="token operator">=</span> <span class="token function">require</span> <span class="token punctuation">(</span> <span class="token string">'multiaddr'</span> <span class="token punctuation">)</span> <span class="token keyword">const</span> main <span class="token operator">=</span> <span class="token keyword">async</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span> <span class="token keyword">const</span> node <span class="token operator">=</span> <span class="token keyword">await</span> Libp2p <span class="token punctuation">.</span> <span class="token function">create</span> <span class="token punctuation">(</span> <span class="token punctuation">{</span> modules <span class="token punctuation">:</span> <span class="token punctuation">{</span> transport <span class="token punctuation">:</span> <span class="token punctuation">[</span> <span class="token constant">TCP</span> <span class="token punctuation">]</span> <span class="token punctuation">,</span> connEncryption <span class="token punctuation">:</span> <span class="token punctuation">[</span> <span class="token constant">SECIO</span> <span class="token punctuation">]</span> <span class="token punctuation">,</span> streamMuxer <span class="token punctuation">:</span> <span class="token punctuation">[</span> <span class="token constant">MPLEX</span> <span class="token punctuation">]</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token comment">// add a listen address (localhost) to accept TCP connections on a random port</span> <span class="token keyword">const</span> listenAddress <span class="token operator">=</span> <span class="token function">multiaddr</span> <span class="token punctuation">(</span> <span class="token template-string"><span class="token string">`/ip4/127.0.0.1/tcp/0`</span></span> <span class="token punctuation">)</span> node <span class="token punctuation">.</span> peerInfo <span class="token punctuation">.</span> multiaddrs <span class="token punctuation">.</span> <span class="token function">add</span> <span class="token punctuation">(</span> listenAddress <span class="token punctuation">)</span> <span class="token comment">// start libp2p</span> <span class="token keyword">await</span> node <span class="token punctuation">.</span> <span class="token function">start</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> console <span class="token punctuation">.</span> <span class="token function">log</span> <span class="token punctuation">(</span> <span class="token string">'libp2p has started'</span> <span class="token punctuation">)</span> <span class="token comment">// print out listening addresses</span> <span class="token keyword">const</span> addresses <span class="token operator">=</span> node <span class="token punctuation">.</span> peerInfo <span class="token punctuation">.</span> multiaddrs <span class="token punctuation">.</span> <span class="token function">toArray</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> console <span class="token punctuation">.</span> <span class="token function">log</span> <span class="token punctuation">(</span> <span class="token string">'listening on addresses:'</span> <span class="token punctuation">)</span> addresses <span class="token punctuation">.</span> <span class="token function">forEach</span> <span class="token punctuation">(</span> addr <span class="token operator">=></span> <span class="token punctuation">{</span> console <span class="token punctuation">.</span> <span class="token function">log</span> <span class="token punctuation">(</span> <span class="token template-string"><span class="token string">`</span> <span class="token interpolation"><span class="token interpolation-punctuation punctuation">${</span> addr <span class="token punctuation">.</span> <span class="token function">toString</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token interpolation-punctuation punctuation">}</span></span> <span class="token string">/p2p/</span> <span class="token interpolation"><span class="token interpolation-punctuation punctuation">${</span> node <span class="token punctuation">.</span> peerInfo <span class="token punctuation">.</span> id <span class="token punctuation">.</span> <span class="token function">toB58String</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token interpolation-punctuation punctuation">}</span></span> <span class="token string">`</span></span> <span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token comment">// stop libp2p</span> <span class="token keyword">await</span> node <span class="token punctuation">.</span> <span class="token function">stop</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> console <span class="token punctuation">.</span> <span class="token function">log</span> <span class="token punctuation">(</span> <span class="token string">'libp2p has stopped'</span> <span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token function">main</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> |
Then test with the command node src/index
and here’s the result:
1 2 3 4 5 | libp2p has started listening on addresses <span class="token punctuation">:</span> <span class="token operator">/</span> ip4 <span class="token operator">/</span> <span class="token number">127.0</span> <span class="token number">.0</span> <span class="token number">.1</span> <span class="token operator">/</span> tcp <span class="token operator">/</span> <span class="token number">34907</span> <span class="token operator">/</span> p2p <span class="token operator">/</span> Qmdb3sQ6Z9GWgRpesoBtELBNuvHTD9FbjwNWSJYWJE3E1j libp2p has stopped |
Ping pong!
Everything has been well setup from protocol to security, … let’s try to connect them together.
We can use libp2p.ping()
to send “ping” from one peer to another. Peer receiving “ping” will send back “pong” and so we know that peers can connect with each other. At the same time, we can check the delay between peers.
We need to pass peer multiaddress via the command line so we need more process
1 2 3 4 | npm install process // OR yarn add process |
Then we try to transmit multiaddress from the commad line and try to ping how. And this will be the full code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 | <span class="token keyword">const</span> Libp2p <span class="token operator">=</span> <span class="token function">require</span> <span class="token punctuation">(</span> <span class="token string">'libp2p'</span> <span class="token punctuation">)</span> <span class="token keyword">const</span> <span class="token constant">TCP</span> <span class="token operator">=</span> <span class="token function">require</span> <span class="token punctuation">(</span> <span class="token string">'libp2p-tcp'</span> <span class="token punctuation">)</span> <span class="token keyword">const</span> <span class="token constant">SECIO</span> <span class="token operator">=</span> <span class="token function">require</span> <span class="token punctuation">(</span> <span class="token string">'libp2p-secio'</span> <span class="token punctuation">)</span> <span class="token keyword">const</span> <span class="token constant">MPLEX</span> <span class="token operator">=</span> <span class="token function">require</span> <span class="token punctuation">(</span> <span class="token string">'libp2p-mplex'</span> <span class="token punctuation">)</span> <span class="token keyword">const</span> multiaddr <span class="token operator">=</span> <span class="token function">require</span> <span class="token punctuation">(</span> <span class="token string">'multiaddr'</span> <span class="token punctuation">)</span> <span class="token keyword">const</span> process <span class="token operator">=</span> <span class="token function">require</span> <span class="token punctuation">(</span> <span class="token string">'process'</span> <span class="token punctuation">)</span> <span class="token keyword">const</span> main <span class="token operator">=</span> <span class="token keyword">async</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span> <span class="token keyword">const</span> node <span class="token operator">=</span> <span class="token keyword">await</span> Libp2p <span class="token punctuation">.</span> <span class="token function">create</span> <span class="token punctuation">(</span> <span class="token punctuation">{</span> modules <span class="token punctuation">:</span> <span class="token punctuation">{</span> transport <span class="token punctuation">:</span> <span class="token punctuation">[</span> <span class="token constant">TCP</span> <span class="token punctuation">]</span> <span class="token punctuation">,</span> connEncryption <span class="token punctuation">:</span> <span class="token punctuation">[</span> <span class="token constant">SECIO</span> <span class="token punctuation">]</span> <span class="token punctuation">,</span> streamMuxer <span class="token punctuation">:</span> <span class="token punctuation">[</span> <span class="token constant">MPLEX</span> <span class="token punctuation">]</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token comment">// add a listen address (localhost) to accept TCP connections on a random port</span> <span class="token keyword">const</span> listenAddress <span class="token operator">=</span> <span class="token function">multiaddr</span> <span class="token punctuation">(</span> <span class="token template-string"><span class="token string">`/ip4/127.0.0.1/tcp/0`</span></span> <span class="token punctuation">)</span> node <span class="token punctuation">.</span> peerInfo <span class="token punctuation">.</span> multiaddrs <span class="token punctuation">.</span> <span class="token function">add</span> <span class="token punctuation">(</span> listenAddress <span class="token punctuation">)</span> <span class="token comment">// start libp2p</span> <span class="token keyword">await</span> node <span class="token punctuation">.</span> <span class="token function">start</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> console <span class="token punctuation">.</span> <span class="token function">log</span> <span class="token punctuation">(</span> <span class="token string">'libp2p has started'</span> <span class="token punctuation">)</span> <span class="token comment">// print out listening addresses</span> <span class="token keyword">const</span> addresses <span class="token operator">=</span> node <span class="token punctuation">.</span> peerInfo <span class="token punctuation">.</span> multiaddrs <span class="token punctuation">.</span> <span class="token function">toArray</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> console <span class="token punctuation">.</span> <span class="token function">log</span> <span class="token punctuation">(</span> <span class="token string">'listening on addresses:'</span> <span class="token punctuation">)</span> addresses <span class="token punctuation">.</span> <span class="token function">forEach</span> <span class="token punctuation">(</span> addr <span class="token operator">=></span> <span class="token punctuation">{</span> console <span class="token punctuation">.</span> <span class="token function">log</span> <span class="token punctuation">(</span> <span class="token template-string"><span class="token string">`</span> <span class="token interpolation"><span class="token interpolation-punctuation punctuation">${</span> addr <span class="token punctuation">.</span> <span class="token function">toString</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token interpolation-punctuation punctuation">}</span></span> <span class="token string">/p2p/</span> <span class="token interpolation"><span class="token interpolation-punctuation punctuation">${</span> node <span class="token punctuation">.</span> peerInfo <span class="token punctuation">.</span> id <span class="token punctuation">.</span> <span class="token function">toB58String</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token interpolation-punctuation punctuation">}</span></span> <span class="token string">`</span></span> <span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token comment">// ping peer if received multiaddr</span> <span class="token keyword">if</span> <span class="token punctuation">(</span> process <span class="token punctuation">.</span> argv <span class="token punctuation">.</span> length <span class="token operator">>=</span> <span class="token number">3</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">const</span> ma <span class="token operator">=</span> <span class="token function">multiaddr</span> <span class="token punctuation">(</span> process <span class="token punctuation">.</span> argv <span class="token punctuation">[</span> <span class="token number">2</span> <span class="token punctuation">]</span> <span class="token punctuation">)</span> console <span class="token punctuation">.</span> <span class="token function">log</span> <span class="token punctuation">(</span> <span class="token template-string"><span class="token string">`pinging remote peer at </span> <span class="token interpolation"><span class="token interpolation-punctuation punctuation">${</span> process <span class="token punctuation">.</span> argv <span class="token punctuation">[</span> <span class="token number">2</span> <span class="token punctuation">]</span> <span class="token interpolation-punctuation punctuation">}</span></span> <span class="token string">`</span></span> <span class="token punctuation">)</span> <span class="token keyword">const</span> latency <span class="token operator">=</span> <span class="token keyword">await</span> node <span class="token punctuation">.</span> <span class="token function">ping</span> <span class="token punctuation">(</span> ma <span class="token punctuation">)</span> console <span class="token punctuation">.</span> <span class="token function">log</span> <span class="token punctuation">(</span> <span class="token template-string"><span class="token string">`pinged </span> <span class="token interpolation"><span class="token interpolation-punctuation punctuation">${</span> process <span class="token punctuation">.</span> argv <span class="token punctuation">[</span> <span class="token number">2</span> <span class="token punctuation">]</span> <span class="token interpolation-punctuation punctuation">}</span></span> <span class="token string"> in </span> <span class="token interpolation"><span class="token interpolation-punctuation punctuation">${</span> latency <span class="token interpolation-punctuation punctuation">}</span></span> <span class="token string">ms`</span></span> <span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span> console <span class="token punctuation">.</span> <span class="token function">log</span> <span class="token punctuation">(</span> <span class="token string">'no remote peer address given, skipping ping'</span> <span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token keyword">const</span> stop <span class="token operator">=</span> <span class="token keyword">async</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span> <span class="token comment">// stop libp2p</span> <span class="token keyword">await</span> node <span class="token punctuation">.</span> <span class="token function">stop</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> console <span class="token punctuation">.</span> <span class="token function">log</span> <span class="token punctuation">(</span> <span class="token string">'libp2p has stopped'</span> <span class="token punctuation">)</span> process <span class="token punctuation">.</span> <span class="token function">exit</span> <span class="token punctuation">(</span> <span class="token number">0</span> <span class="token punctuation">)</span> <span class="token punctuation">}</span> process <span class="token punctuation">.</span> <span class="token function">on</span> <span class="token punctuation">(</span> <span class="token string">'SIGTERM'</span> <span class="token punctuation">,</span> stop <span class="token punctuation">)</span> process <span class="token punctuation">.</span> <span class="token function">on</span> <span class="token punctuation">(</span> <span class="token string">'SIGINT'</span> <span class="token punctuation">,</span> stop <span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token function">main</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> |
Let’s start running before 1 node libp2p node src/index.js
. Result :
1 2 3 4 5 | libp2p has started listening on addresses <span class="token punctuation">:</span> <span class="token operator">/</span> ip4 <span class="token operator">/</span> <span class="token number">127.0</span> <span class="token number">.0</span> <span class="token number">.1</span> <span class="token operator">/</span> tcp <span class="token operator">/</span> <span class="token number">43607</span> <span class="token operator">/</span> p2p <span class="token operator">/</span> QmWApjKJ5Na62cvMgiydTonAFGKPgKDe9peKvuMVSk2qxv no remote peer address given <span class="token punctuation">,</span> skipping ping |
Open another terminal for multiaddress address. For example, following the correct address above runs:
1 2 | node src <span class="token operator">/</span> index <span class="token punctuation">.</span> js <span class="token operator">/</span> ip4 <span class="token operator">/</span> <span class="token number">127.0</span> <span class="token number">.0</span> <span class="token number">.1</span> <span class="token operator">/</span> tcp <span class="token operator">/</span> <span class="token number">43607</span> <span class="token operator">/</span> p2p <span class="token operator">/</span> QmWApjKJ5Na62cvMgiydTonAFGKPgKDe9peKvuMVSk2qxv |
Result :
1 2 3 | pinging remote peer at <span class="token operator">/</span> ip4 <span class="token operator">/</span> <span class="token number">127.0</span> <span class="token number">.0</span> <span class="token number">.1</span> <span class="token operator">/</span> tcp <span class="token operator">/</span> <span class="token number">43607</span> <span class="token operator">/</span> p2p <span class="token operator">/</span> QmWApjKJ5Na62cvMgiydTonAFGKPgKDe9peKvuMVSk2qxv pinged <span class="token operator">/</span> ip4 <span class="token operator">/</span> <span class="token number">127.0</span> <span class="token number">.0</span> <span class="token number">.1</span> <span class="token operator">/</span> tcp <span class="token operator">/</span> <span class="token number">43607</span> <span class="token operator">/</span> p2p <span class="token operator">/</span> QmWApjKJ5Na62cvMgiydTonAFGKPgKDe9peKvuMVSk2qxv <span class="token keyword">in</span> <span class="token number">53</span> ms |
So these two peers were able to communicate with each other via multiplexed on a secure channel.
Connect with other peers
Once their libp2p node is up and running, it’s time to try connecting it to the public network. We can do this through peer discovery. Try this feature by creating a new file.
Peer Discovery
The general idea here is that there will be a fixed list of a few peers that will often be used for new nodes to join the network, but of course there will have to be some other discovery mechanism to ensure Tell me you can find other peers important to your app. There are several ways to find peer available online:
- If you have the address of some other peer, the easiest way is to use
libp2p-bootstrap
- If your app is running on a browser, you can use
libp2p-webrtc-star
which will discover other peers based on peer sharing service. - Another approach is to use the basic
libp2p-kad-dht
, which will crawl the network and find new peers randomly based on the data on the peer it is connected to. - …
For simplicity, I will use libp2p-bootstrap
and change the protocol to websocket (because the other nodes use this protocol). Install libp2p-bootstrap:
1 2 3 4 | npm install libp2p-bootstrap libp2p-websockets // OR yarn add libp2p-bootstrap libp2p-websockets |
The code will look like this:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | <span class="token keyword">const</span> Libp2p <span class="token operator">=</span> <span class="token function">require</span> <span class="token punctuation">(</span> <span class="token string">'libp2p'</span> <span class="token punctuation">)</span> <span class="token keyword">const</span> WebSockets <span class="token operator">=</span> <span class="token function">require</span> <span class="token punctuation">(</span> <span class="token string">'libp2p-websockets'</span> <span class="token punctuation">)</span> <span class="token keyword">const</span> <span class="token constant">SECIO</span> <span class="token operator">=</span> <span class="token function">require</span> <span class="token punctuation">(</span> <span class="token string">'libp2p-secio'</span> <span class="token punctuation">)</span> <span class="token keyword">const</span> <span class="token constant">MPLEX</span> <span class="token operator">=</span> <span class="token function">require</span> <span class="token punctuation">(</span> <span class="token string">'libp2p-mplex'</span> <span class="token punctuation">)</span> <span class="token keyword">const</span> Bootstrap <span class="token operator">=</span> <span class="token function">require</span> <span class="token punctuation">(</span> <span class="token string">'libp2p-bootstrap'</span> <span class="token punctuation">)</span> <span class="token keyword">const</span> main <span class="token operator">=</span> <span class="token keyword">async</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span> <span class="token comment">// Known peers addresses</span> <span class="token keyword">const</span> bootstrapMultiaddrs <span class="token operator">=</span> <span class="token punctuation">[</span> <span class="token string">'/dns4/ams-1.bootstrap.libp2p.io/tcp/443/wss/p2p/QmSoLer265NRgSp2LA3dPaeykiS1J6DifTC88f5uVQKNAd'</span> <span class="token punctuation">,</span> <span class="token string">'/dns4/lon-1.bootstrap.libp2p.io/tcp/443/wss/p2p/QmSoLMeWqB7YGVLJN3pNLQpmmEk35v6wYtsMGLzSr5QBU3'</span> <span class="token punctuation">]</span> <span class="token keyword">const</span> node <span class="token operator">=</span> <span class="token keyword">await</span> Libp2p <span class="token punctuation">.</span> <span class="token function">create</span> <span class="token punctuation">(</span> <span class="token punctuation">{</span> modules <span class="token punctuation">:</span> <span class="token punctuation">{</span> transport <span class="token punctuation">:</span> <span class="token punctuation">[</span> WebSockets <span class="token punctuation">]</span> <span class="token punctuation">,</span> connEncryption <span class="token punctuation">:</span> <span class="token punctuation">[</span> <span class="token constant">SECIO</span> <span class="token punctuation">]</span> <span class="token punctuation">,</span> streamMuxer <span class="token punctuation">:</span> <span class="token punctuation">[</span> <span class="token constant">MPLEX</span> <span class="token punctuation">]</span> <span class="token punctuation">,</span> peerDiscovery <span class="token punctuation">:</span> <span class="token punctuation">[</span> Bootstrap <span class="token punctuation">]</span> <span class="token punctuation">}</span> <span class="token punctuation">,</span> config <span class="token punctuation">:</span> <span class="token punctuation">{</span> peerDiscovery <span class="token punctuation">:</span> <span class="token punctuation">{</span> autoDial <span class="token punctuation">:</span> <span class="token boolean">true</span> <span class="token punctuation">,</span> <span class="token comment">// Auto connect to discovered peers (limited by ConnectionManager minPeers)</span> <span class="token comment">// The `tag` property will be searched when creating the instance of your Peer Discovery service.</span> <span class="token comment">// The associated object, will be passed to the service when it is instantiated.</span> <span class="token punctuation">[</span> Bootstrap <span class="token punctuation">.</span> tag <span class="token punctuation">]</span> <span class="token punctuation">:</span> <span class="token punctuation">{</span> enabled <span class="token punctuation">:</span> <span class="token boolean">true</span> <span class="token punctuation">,</span> list <span class="token punctuation">:</span> bootstrapMultiaddrs <span class="token comment">// provide array of multiaddrs</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> node <span class="token punctuation">.</span> <span class="token function">on</span> <span class="token punctuation">(</span> <span class="token string">'peer:discovery'</span> <span class="token punctuation">,</span> <span class="token punctuation">(</span> peer <span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span> console <span class="token punctuation">.</span> <span class="token function">log</span> <span class="token punctuation">(</span> <span class="token string">'Discovered %s'</span> <span class="token punctuation">,</span> peer <span class="token punctuation">.</span> id <span class="token punctuation">.</span> <span class="token function">toB58String</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token comment">// Log discovered peer</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> node <span class="token punctuation">.</span> <span class="token function">on</span> <span class="token punctuation">(</span> <span class="token string">'peer:connect'</span> <span class="token punctuation">,</span> <span class="token punctuation">(</span> peer <span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span> console <span class="token punctuation">.</span> <span class="token function">log</span> <span class="token punctuation">(</span> <span class="token string">'Connected to %s'</span> <span class="token punctuation">,</span> peer <span class="token punctuation">.</span> id <span class="token punctuation">.</span> <span class="token function">toB58String</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token comment">// Log connected peer</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token comment">// start libp2p</span> <span class="token keyword">await</span> node <span class="token punctuation">.</span> <span class="token function">start</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token function">main</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> |
peer:discovery
and peer:on
are two events that libp2p provides you can see more here https://github.com/libp2p/js-libp2p/blob/master/doc/API.md#events
Result :
1 2 3 4 5 | Discovered QmSoLer265NRgSp2LA3dPaeykiS1J6DifTC88f5uVQKNAd Discovered QmSoLMeWqB7YGVLJN3pNLQpmmEk35v6wYtsMGLzSr5QBU3 Connected to QmSoLMeWqB7YGVLJN3pNLQpmmEk35v6wYtsMGLzSr5QBU3 Connected to QmSoLer265NRgSp2LA3dPaeykiS1J6DifTC88f5uVQKNAd |