Làm gì bây giờ nhỉ ?
H chúng ta sẽ cùng thử sử dụng một vài chức năng cơ bản của libp2p để gửi tin nhắn ping qua lại giữa hai peer bằng 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
Tiếp theo là cài đặt libp2p
1 2 3 4 | npm install libp2p // OR yarn add libp2p |
Basic setup
H thì bạn đã hoàn thành việc Install libp2p rồi h hãy cấu hình một chút . Chúng ta cần 2 module của libp2p đó là Transport và Crypto .Tuy nhiên, theo docs của họ khuyên thì cũng nên setup cả Stream Multiplexer . Bắt đầu setup từng phần nào .
Transports
Libp2p sử dụng Transports để thiết lập các kết nối giữa các peer thông qua mạng . Bạn có thể định cấu hình bao nhiêu Transport cũng đc , nhưng trong demo này bạn chỉ cần 1 thôi . Có rất nhiều giao thức đc hỗ trợ nhưng hãy chọn tcp nhé .
1 2 3 4 | npm install libp2p-tcp // OR yarn add libp2p-tcp |
Sau khi install xong hãy viết vài dòng code để libp2p có thể sử dụng TCP nào
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> |
Trong đó Libp2p.create
khởi tạo và modules transport
để chọn giao thức và bạn hoàn toàn có thể chọn nhiều giao thức hơn vì transport nhận vào là một array mà .
Connection Encryption
Mọi kết nối phải được mã hóa để đảm bảo tính bảo mật cho người dùng . Có rất nhiều module Crypto được phát triển cho libp2p và trong demo này thì hãy sử dụng libp2p-secio
1 2 3 4 | npm install libp2p-secio // OR yarn add libp2p-secio |
Thêm phần secio vào :
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
Mặc dù Multiplexing không phải là bắt buộc nhưng theo docs của họ thì học khuyến khích vì nó giúp cải thiện hiệu quả của các kết nối trên các giao thức mà libp2p chạy .
1 2 3 4 | npm install libp2p-mplex // OR yarn add libp2p-mplex |
Thêm phần mplex vào :
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> |
Chạy thử nào
Chúng ta đã config Transport, Crypto và Stream Multiplexer module rồi h hãy chạy libp2p node nào . Sử dụng libp2p.start() và libp2p.stop() để start và stop node.
Một libp2p node cần phải listen một address trên giao thức mà chúng ta đã cài đặt .Theo đó chúng ta sẽ install thêm multiaddr để tạo một multiaddress tcp và thêm nó vào node
1 2 3 4 | npm install multiaddr // OR yarn add multiaddr |
Thêm multiaddr vào
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> |
Sau đó chạy thử bằng lênh node src/index
và đây là kết quả :
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 !
Mọi thứ đã đc setup ngon lành từ giao thức đến bảo mật ,… hãy thử kết nối chúng với nhau nào .
Chúng ta có thể sử dụng libp2p.ping()
để gửi “ping” từ peer này đến một peer khác. Peer nhận được “ping” sẽ gửi lại “pong” và như vậy chúng ta biết đc các peer có thể connect đc với nhau .Đồng thời có thể kiểm tra độ trễ giữa các peer
Chúng ta cần truyền peer multiaddress thông qua command line vì thế chúng ta cần thêm process
1 2 3 4 | npm install process // OR yarn add process |
Sau đó chúng ta thử truyền multiaddress từ commad line và thử ping xem thế nào . Và đây sẽ là code full
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> |
Hãy bắt đầu chạy trước 1 node libp2p node src/index.js
. Kết quả :
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 |
Mở một terminal khác lấy địa chỉ multiaddress truyền vào . Ví dụ theo đúng address bên trên chạy :
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 |
Kết quả :
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 |
Như vậy là 2 peer này đã có thể communicating với nhau thông qua multiplexed trên một kênh bảo mật .
Connect vs các peer khác
Khi node libp2p của chúng đã chạy đc thì đã đến lúc thử kết nối nó với public network. Chúng ta có thể làm điều này thông qua peer discovery. Hãy thử tính năng này bằng cách tạo một file mới nhé .
Peer Discovery
Ý tưởng chung ở đây đó là sẽ có một danh sách cố định một vài peer thường sẽ được sử dụng để cho các node mới tham gia mạng kết nối , nhưng tất nhiên sẽ phải kết hợp thêm một vài cơ chế khám phá khác để đảm bảo bạn có thể tìm các ra các peer khác quan trọng đối với app của mình . Có một số cách sau đây để tìm thấy các peer available trên mạng:
- Nếu bạn đã có được địa chỉ của một vài peer khác thì cách đơn giản nhất là dùng
libp2p-bootstrap
- Nếu app của bạn chạy trên browser thì có thể sử dụng
libp2p-webrtc-star
nó sẽ khám phá các peer khác dựa vào peer sharing service - Một cách tiếp cận khác đó là sử dụng
libp2p-kad-dht
cơ bản thì nó sẽ crawl dữ liệu về network và tìm các peer mới một cách random dựa trên dữ liệu trên các peer mà nó đã kết nối đc . - …
Để đơn giản thì mình sẽ sử dụng libp2p-bootstrap
và thay đổi giao thức thành websocket ( vì các node kia sử dụng giao thức này ) . Install libp2p-bootstrap :
1 2 3 4 | npm install libp2p-bootstrap libp2p-websockets // OR yarn add libp2p-bootstrap libp2p-websockets |
code sẽ như thế này :
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
và peer:on
là hai Event mà libp2p cung cấp các bạn có thể xem thêm tại đây https://github.com/libp2p/js-libp2p/blob/master/doc/API.md#events
Kết quả :
1 2 3 4 5 | Discovered QmSoLer265NRgSp2LA3dPaeykiS1J6DifTC88f5uVQKNAd Discovered QmSoLMeWqB7YGVLJN3pNLQpmmEk35v6wYtsMGLzSr5QBU3 Connected to QmSoLMeWqB7YGVLJN3pNLQpmmEk35v6wYtsMGLzSr5QBU3 Connected to QmSoLer265NRgSp2LA3dPaeykiS1J6DifTC88f5uVQKNAd |