update website

This commit is contained in:
richard-ramos 2025-01-15 03:37:04 +00:00
parent 9c97473306
commit 52e4a69cc8
7 changed files with 124 additions and 128 deletions

File diff suppressed because one or more lines are too long

View File

@ -2,38 +2,38 @@
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url> <url>
<loc>https://status-im.github.io/nim-libp2p/docs/</loc> <loc>https://status-im.github.io/nim-libp2p/docs/</loc>
<lastmod>2025-01-14</lastmod> <lastmod>2025-01-15</lastmod>
</url> </url>
<url> <url>
<loc>https://status-im.github.io/nim-libp2p/docs/circuitrelay/</loc> <loc>https://status-im.github.io/nim-libp2p/docs/circuitrelay/</loc>
<lastmod>2025-01-14</lastmod> <lastmod>2025-01-15</lastmod>
</url> </url>
<url> <url>
<loc>https://status-im.github.io/nim-libp2p/docs/tutorial_1_connect/</loc> <loc>https://status-im.github.io/nim-libp2p/docs/tutorial_1_connect/</loc>
<lastmod>2025-01-14</lastmod> <lastmod>2025-01-15</lastmod>
</url> </url>
<url> <url>
<loc>https://status-im.github.io/nim-libp2p/docs/tutorial_2_customproto/</loc> <loc>https://status-im.github.io/nim-libp2p/docs/tutorial_2_customproto/</loc>
<lastmod>2025-01-14</lastmod> <lastmod>2025-01-15</lastmod>
</url> </url>
<url> <url>
<loc>https://status-im.github.io/nim-libp2p/docs/tutorial_3_protobuf/</loc> <loc>https://status-im.github.io/nim-libp2p/docs/tutorial_3_protobuf/</loc>
<lastmod>2025-01-14</lastmod> <lastmod>2025-01-15</lastmod>
</url> </url>
<url> <url>
<loc>https://status-im.github.io/nim-libp2p/docs/tutorial_4_gossipsub/</loc> <loc>https://status-im.github.io/nim-libp2p/docs/tutorial_4_gossipsub/</loc>
<lastmod>2025-01-14</lastmod> <lastmod>2025-01-15</lastmod>
</url> </url>
<url> <url>
<loc>https://status-im.github.io/nim-libp2p/docs/tutorial_5_discovery/</loc> <loc>https://status-im.github.io/nim-libp2p/docs/tutorial_5_discovery/</loc>
<lastmod>2025-01-14</lastmod> <lastmod>2025-01-15</lastmod>
</url> </url>
<url> <url>
<loc>https://status-im.github.io/nim-libp2p/docs/tutorial_6_game/</loc> <loc>https://status-im.github.io/nim-libp2p/docs/tutorial_6_game/</loc>
<lastmod>2025-01-14</lastmod> <lastmod>2025-01-15</lastmod>
</url> </url>
<url> <url>
<loc>https://status-im.github.io/nim-libp2p/docs/go-daemon/daemonapi/</loc> <loc>https://status-im.github.io/nim-libp2p/docs/go-daemon/daemonapi/</loc>
<lastmod>2025-01-14</lastmod> <lastmod>2025-01-15</lastmod>
</url> </url>
</urlset> </urlset>

Binary file not shown.

View File

@ -75,9 +75,7 @@ proc oneNode(node: Node, rng: ref HmacDrbgContext) {.async.} =
# This procedure will handle one of the node of the network # This procedure will handle one of the node of the network
node.gossip.addValidator( node.gossip.addValidator(
["metrics"], ["metrics"],
proc( proc(topic: string, message: Message): Future[ValidationResult] {.async.} =
topic: string, message: Message
): Future[ValidationResult] {.async: (raises: []).} =
let decoded = MetricList.decode(message.data) let decoded = MetricList.decode(message.data)
if decoded.isErr: if decoded.isErr:
return ValidationResult.Reject return ValidationResult.Reject
@ -94,7 +92,7 @@ proc oneNode(node: Node, rng: ref HmacDrbgContext) {.async.} =
if node.hostname == "John": if node.hostname == "John":
node.gossip.subscribe( node.gossip.subscribe(
"metrics", "metrics",
proc(topic: string, data: seq[byte]) {.async: (raises: []).} = proc(topic: string, data: seq[byte]) {.async.} =
let m = MetricList.decode(data).expect("metric can be decoded") let m = MetricList.decode(data).expect("metric can be decoded")
echo m echo m
, ,

View File

@ -645,45 +645,43 @@ and collect them on one of the node.
<a id="__codelineno-1-4" name="__codelineno-1-4" href="#__codelineno-1-4"></a><span class="w"> </span><span class="c"># This procedure will handle one of the node of the network</span> <a id="__codelineno-1-4" name="__codelineno-1-4" href="#__codelineno-1-4"></a><span class="w"> </span><span class="c"># This procedure will handle one of the node of the network</span>
<a id="__codelineno-1-5" name="__codelineno-1-5" href="#__codelineno-1-5"></a><span class="w"> </span><span class="n">node</span><span class="p">.</span><span class="n">gossip</span><span class="p">.</span><span class="n">addValidator</span><span class="p">(</span> <a id="__codelineno-1-5" name="__codelineno-1-5" href="#__codelineno-1-5"></a><span class="w"> </span><span class="n">node</span><span class="p">.</span><span class="n">gossip</span><span class="p">.</span><span class="n">addValidator</span><span class="p">(</span>
<a id="__codelineno-1-6" name="__codelineno-1-6" href="#__codelineno-1-6"></a><span class="w"> </span><span class="o">[</span><span class="s">&quot;metrics&quot;</span><span class="o">]</span><span class="p">,</span> <a id="__codelineno-1-6" name="__codelineno-1-6" href="#__codelineno-1-6"></a><span class="w"> </span><span class="o">[</span><span class="s">&quot;metrics&quot;</span><span class="o">]</span><span class="p">,</span>
<a id="__codelineno-1-7" name="__codelineno-1-7" href="#__codelineno-1-7"></a><span class="w"> </span><span class="n">proc</span><span class="p">(</span> <a id="__codelineno-1-7" name="__codelineno-1-7" href="#__codelineno-1-7"></a><span class="w"> </span><span class="n">proc</span><span class="p">(</span><span class="n">topic</span><span class="p">:</span><span class="w"> </span><span class="nb">string</span><span class="p">,</span><span class="w"> </span><span class="n">message</span><span class="p">:</span><span class="w"> </span><span class="n">Message</span><span class="p">):</span><span class="w"> </span><span class="n">Future</span><span class="o">[</span><span class="n">ValidationResult</span><span class="o">]</span><span class="w"> </span><span class="sx">{.async.}</span><span class="w"> </span><span class="o">=</span>
<a id="__codelineno-1-8" name="__codelineno-1-8" href="#__codelineno-1-8"></a><span class="w"> </span><span class="n">topic</span><span class="p">:</span><span class="w"> </span><span class="nb">string</span><span class="p">,</span><span class="w"> </span><span class="n">message</span><span class="p">:</span><span class="w"> </span><span class="n">Message</span> <a id="__codelineno-1-8" name="__codelineno-1-8" href="#__codelineno-1-8"></a><span class="w"> </span><span class="k">let</span><span class="w"> </span><span class="n">decoded</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">MetricList</span><span class="p">.</span><span class="n">decode</span><span class="p">(</span><span class="n">message</span><span class="p">.</span><span class="n">data</span><span class="p">)</span>
<a id="__codelineno-1-9" name="__codelineno-1-9" href="#__codelineno-1-9"></a><span class="w"> </span><span class="p">):</span><span class="w"> </span><span class="n">Future</span><span class="o">[</span><span class="n">ValidationResult</span><span class="o">]</span><span class="w"> </span><span class="sx">{.async</span>:<span class="w"> </span><span class="sx">(raises</span>:<span class="w"> </span><span class="sx">[]).} =</span> <a id="__codelineno-1-9" name="__codelineno-1-9" href="#__codelineno-1-9"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="n">decoded</span><span class="p">.</span><span class="n">isErr</span><span class="p">:</span>
<a id="__codelineno-1-10" name="__codelineno-1-10" href="#__codelineno-1-10"></a><span class="sx"> let</span><span class="w"> </span><span class="sx">decoded</span><span class="w"> </span><span class="sx">= MetricList.decode(message.data)</span> <a id="__codelineno-1-10" name="__codelineno-1-10" href="#__codelineno-1-10"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">ValidationResult</span><span class="p">.</span><span class="n">Reject</span>
<a id="__codelineno-1-11" name="__codelineno-1-11" href="#__codelineno-1-11"></a><span class="sx"> if</span><span class="w"> </span><span class="sx">decoded.isErr</span>: <a id="__codelineno-1-11" name="__codelineno-1-11" href="#__codelineno-1-11"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">ValidationResult</span><span class="p">.</span><span class="n">Accept</span>
<a id="__codelineno-1-12" name="__codelineno-1-12" href="#__codelineno-1-12"></a><span class="w"> </span><span class="sx">return</span><span class="w"> </span><span class="sx">ValidationResult.Reject</span> <a id="__codelineno-1-12" name="__codelineno-1-12" href="#__codelineno-1-12"></a><span class="w"> </span><span class="p">,</span>
<a id="__codelineno-1-13" name="__codelineno-1-13" href="#__codelineno-1-13"></a><span class="w"> </span><span class="sx">return</span><span class="w"> </span><span class="sx">ValidationResult.Accept</span> <a id="__codelineno-1-13" name="__codelineno-1-13" href="#__codelineno-1-13"></a><span class="w"> </span><span class="p">)</span>
<a id="__codelineno-1-14" name="__codelineno-1-14" href="#__codelineno-1-14"></a><span class="w"> </span>, <a id="__codelineno-1-14" name="__codelineno-1-14" href="#__codelineno-1-14"></a><span class="w"> </span><span class="c"># This &quot;validator&quot; will attach to the `metrics` topic and make sure</span>
<a id="__codelineno-1-15" name="__codelineno-1-15" href="#__codelineno-1-15"></a><span class="w"> </span><span class="sx">)</span> <a id="__codelineno-1-15" name="__codelineno-1-15" href="#__codelineno-1-15"></a><span class="w"> </span><span class="c"># that every message in this topic is valid. This allows us to stop</span>
<a id="__codelineno-1-16" name="__codelineno-1-16" href="#__codelineno-1-16"></a><span class="sx"> # This</span><span class="w"> </span><span class="sx">&quot;validator&quot; will</span><span class="w"> </span><span class="sx">attach</span><span class="w"> </span><span class="sx">to</span><span class="w"> </span><span class="sx">the</span><span class="w"> </span><span class="sx">`metrics` topic</span><span class="w"> </span><span class="sx">and</span><span class="w"> </span><span class="sx">make</span><span class="w"> </span><span class="sx">sure</span> <a id="__codelineno-1-16" name="__codelineno-1-16" href="#__codelineno-1-16"></a><span class="w"> </span><span class="c"># propagation of invalid messages quickly in the network, and punish</span>
<a id="__codelineno-1-17" name="__codelineno-1-17" href="#__codelineno-1-17"></a><span class="w"> </span><span class="sx"># that</span><span class="w"> </span><span class="sx">every</span><span class="w"> </span><span class="sx">message</span><span class="w"> </span><span class="sx">in</span><span class="w"> </span><span class="sx">this</span><span class="w"> </span><span class="sx">topic</span><span class="w"> </span><span class="sx">is</span><span class="w"> </span><span class="sx">valid. This</span><span class="w"> </span><span class="sx">allows</span><span class="w"> </span><span class="sx">us</span><span class="w"> </span><span class="sx">to</span><span class="w"> </span><span class="sx">stop</span> <a id="__codelineno-1-17" name="__codelineno-1-17" href="#__codelineno-1-17"></a><span class="w"> </span><span class="c"># peers sending them.</span>
<a id="__codelineno-1-18" name="__codelineno-1-18" href="#__codelineno-1-18"></a><span class="w"> </span><span class="sx"># propagation</span><span class="w"> </span><span class="sx">of</span><span class="w"> </span><span class="sx">invalid</span><span class="w"> </span><span class="sx">messages</span><span class="w"> </span><span class="sx">quickly</span><span class="w"> </span><span class="sx">in</span><span class="w"> </span><span class="sx">the</span><span class="w"> </span><span class="sx">network</span>,<span class="w"> </span><span class="sx">and</span><span class="w"> </span><span class="sx">punish</span> <a id="__codelineno-1-18" name="__codelineno-1-18" href="#__codelineno-1-18"></a>
<a id="__codelineno-1-19" name="__codelineno-1-19" href="#__codelineno-1-19"></a><span class="w"> </span><span class="sx"># peers</span><span class="w"> </span><span class="sx">sending</span><span class="w"> </span><span class="sx">them.</span> <a id="__codelineno-1-19" name="__codelineno-1-19" href="#__codelineno-1-19"></a><span class="w"> </span><span class="c"># `John` will be responsible to log the metrics, the rest of the nodes</span>
<a id="__codelineno-1-20" name="__codelineno-1-20" href="#__codelineno-1-20"></a> <a id="__codelineno-1-20" name="__codelineno-1-20" href="#__codelineno-1-20"></a><span class="w"> </span><span class="c"># will just forward them in the network</span>
<a id="__codelineno-1-21" name="__codelineno-1-21" href="#__codelineno-1-21"></a><span class="sx"> # `John` will</span><span class="w"> </span><span class="sx">be</span><span class="w"> </span><span class="sx">responsible</span><span class="w"> </span><span class="sx">to</span><span class="w"> </span><span class="sx">log</span><span class="w"> </span><span class="sx">the</span><span class="w"> </span><span class="sx">metrics</span>,<span class="w"> </span><span class="sx">the</span><span class="w"> </span><span class="sx">rest</span><span class="w"> </span><span class="sx">of</span><span class="w"> </span><span class="sx">the</span><span class="w"> </span><span class="sx">nodes</span> <a id="__codelineno-1-21" name="__codelineno-1-21" href="#__codelineno-1-21"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="n">node</span><span class="p">.</span><span class="n">hostname</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="s">&quot;John&quot;</span><span class="p">:</span>
<a id="__codelineno-1-22" name="__codelineno-1-22" href="#__codelineno-1-22"></a><span class="w"> </span><span class="sx"># will</span><span class="w"> </span><span class="sx">just</span><span class="w"> </span><span class="sx">forward</span><span class="w"> </span><span class="sx">them</span><span class="w"> </span><span class="sx">in</span><span class="w"> </span><span class="sx">the</span><span class="w"> </span><span class="sx">network</span> <a id="__codelineno-1-22" name="__codelineno-1-22" href="#__codelineno-1-22"></a><span class="w"> </span><span class="n">node</span><span class="p">.</span><span class="n">gossip</span><span class="p">.</span><span class="n">subscribe</span><span class="p">(</span>
<a id="__codelineno-1-23" name="__codelineno-1-23" href="#__codelineno-1-23"></a><span class="w"> </span><span class="sx">if</span><span class="w"> </span><span class="sx">node.hostname</span><span class="w"> </span><span class="sx">== &quot;John&quot;:</span> <a id="__codelineno-1-23" name="__codelineno-1-23" href="#__codelineno-1-23"></a><span class="w"> </span><span class="s">&quot;metrics&quot;</span><span class="p">,</span>
<a id="__codelineno-1-24" name="__codelineno-1-24" href="#__codelineno-1-24"></a><span class="sx"> node.gossip.subscribe(</span> <a id="__codelineno-1-24" name="__codelineno-1-24" href="#__codelineno-1-24"></a><span class="w"> </span><span class="n">proc</span><span class="p">(</span><span class="n">topic</span><span class="p">:</span><span class="w"> </span><span class="nb">string</span><span class="p">,</span><span class="w"> </span><span class="n">data</span><span class="p">:</span><span class="w"> </span><span class="nb">seq</span><span class="o">[</span><span class="n">byte</span><span class="o">]</span><span class="p">)</span><span class="w"> </span><span class="sx">{.async.}</span><span class="w"> </span><span class="o">=</span>
<a id="__codelineno-1-25" name="__codelineno-1-25" href="#__codelineno-1-25"></a><span class="sx"> &quot;metrics&quot;,</span> <a id="__codelineno-1-25" name="__codelineno-1-25" href="#__codelineno-1-25"></a><span class="w"> </span><span class="k">let</span><span class="w"> </span><span class="n">m</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">MetricList</span><span class="p">.</span><span class="n">decode</span><span class="p">(</span><span class="n">data</span><span class="p">).</span><span class="n">expect</span><span class="p">(</span><span class="s">&quot;metric can be decoded&quot;</span><span class="p">)</span>
<a id="__codelineno-1-26" name="__codelineno-1-26" href="#__codelineno-1-26"></a><span class="sx"> proc(topic</span>:<span class="w"> </span><span class="sx">string</span>,<span class="w"> </span><span class="sx">data</span>:<span class="w"> </span><span class="sx">seq[byte]) {.async</span>:<span class="w"> </span><span class="sx">(raises</span>:<span class="w"> </span><span class="sx">[]).} =</span> <a id="__codelineno-1-26" name="__codelineno-1-26" href="#__codelineno-1-26"></a><span class="w"> </span><span class="n">echo</span><span class="w"> </span><span class="n">m</span>
<a id="__codelineno-1-27" name="__codelineno-1-27" href="#__codelineno-1-27"></a><span class="sx"> let</span><span class="w"> </span><span class="sx">m</span><span class="w"> </span><span class="sx">= MetricList.decode(data).expect(&quot;metric</span><span class="w"> </span><span class="sx">can</span><span class="w"> </span><span class="sx">be</span><span class="w"> </span><span class="sx">decoded&quot;)</span> <a id="__codelineno-1-27" name="__codelineno-1-27" href="#__codelineno-1-27"></a><span class="w"> </span><span class="p">,</span>
<a id="__codelineno-1-28" name="__codelineno-1-28" href="#__codelineno-1-28"></a><span class="sx"> echo</span><span class="w"> </span><span class="sx">m</span> <a id="__codelineno-1-28" name="__codelineno-1-28" href="#__codelineno-1-28"></a><span class="w"> </span><span class="p">)</span>
<a id="__codelineno-1-29" name="__codelineno-1-29" href="#__codelineno-1-29"></a><span class="w"> </span>, <a id="__codelineno-1-29" name="__codelineno-1-29" href="#__codelineno-1-29"></a><span class="w"> </span><span class="k">else</span><span class="p">:</span>
<a id="__codelineno-1-30" name="__codelineno-1-30" href="#__codelineno-1-30"></a><span class="w"> </span><span class="sx">)</span> <a id="__codelineno-1-30" name="__codelineno-1-30" href="#__codelineno-1-30"></a><span class="w"> </span><span class="n">node</span><span class="p">.</span><span class="n">gossip</span><span class="p">.</span><span class="n">subscribe</span><span class="p">(</span><span class="s">&quot;metrics&quot;</span><span class="p">,</span><span class="w"> </span><span class="kp">nil</span><span class="p">)</span>
<a id="__codelineno-1-31" name="__codelineno-1-31" href="#__codelineno-1-31"></a><span class="sx"> else</span>: <a id="__codelineno-1-31" name="__codelineno-1-31" href="#__codelineno-1-31"></a>
<a id="__codelineno-1-32" name="__codelineno-1-32" href="#__codelineno-1-32"></a><span class="w"> </span><span class="sx">node.gossip.subscribe(&quot;metrics&quot;, nil)</span> <a id="__codelineno-1-32" name="__codelineno-1-32" href="#__codelineno-1-32"></a><span class="w"> </span><span class="c"># Create random metrics 10 times and broadcast them</span>
<a id="__codelineno-1-33" name="__codelineno-1-33" href="#__codelineno-1-33"></a> <a id="__codelineno-1-33" name="__codelineno-1-33" href="#__codelineno-1-33"></a><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="err">_ in 0 ..&lt; 10:</span>
<a id="__codelineno-1-34" name="__codelineno-1-34" href="#__codelineno-1-34"></a><span class="sx"> # Create</span><span class="w"> </span><span class="sx">random</span><span class="w"> </span><span class="sx">metrics</span><span class="w"> </span><span class="sx">10</span><span class="w"> </span><span class="sx">times</span><span class="w"> </span><span class="sx">and</span><span class="w"> </span><span class="sx">broadcast</span><span class="w"> </span><span class="sx">them</span> <a id="__codelineno-1-34" name="__codelineno-1-34" href="#__codelineno-1-34"></a><span class="w"> </span><span class="n">await</span><span class="w"> </span><span class="n">sleepAsync</span><span class="p">(</span><span class="mf">500.</span><span class="n">milliseconds</span><span class="p">)</span>
<a id="__codelineno-1-35" name="__codelineno-1-35" href="#__codelineno-1-35"></a><span class="w"> </span><span class="sx">for</span><span class="w"> </span><span class="sx">_</span><span class="w"> </span><span class="sx">in</span><span class="w"> </span><span class="sx">0</span><span class="w"> </span><span class="sx">..&lt; 10</span>: <a id="__codelineno-1-35" name="__codelineno-1-35" href="#__codelineno-1-35"></a><span class="w"> </span><span class="kd">var</span><span class="w"> </span><span class="n">metricList</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">MetricList</span><span class="p">(</span><span class="n">hostname</span><span class="p">:</span><span class="w"> </span><span class="n">node</span><span class="p">.</span><span class="n">hostname</span><span class="p">)</span>
<a id="__codelineno-1-36" name="__codelineno-1-36" href="#__codelineno-1-36"></a><span class="w"> </span><span class="sx">await</span><span class="w"> </span><span class="sx">sleepAsync(500.milliseconds)</span> <a id="__codelineno-1-36" name="__codelineno-1-36" href="#__codelineno-1-36"></a><span class="w"> </span><span class="k">let</span><span class="w"> </span><span class="n">metricCount</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">rng</span><span class="o">[]</span><span class="p">.</span><span class="n">generate</span><span class="p">(</span><span class="n">uint32</span><span class="p">)</span><span class="w"> </span><span class="ow">mod</span><span class="w"> </span><span class="mi">4</span>
<a id="__codelineno-1-37" name="__codelineno-1-37" href="#__codelineno-1-37"></a><span class="sx"> var</span><span class="w"> </span><span class="sx">metricList</span><span class="w"> </span><span class="sx">= MetricList(hostname</span>:<span class="w"> </span><span class="sx">node.hostname)</span> <a id="__codelineno-1-37" name="__codelineno-1-37" href="#__codelineno-1-37"></a><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="ow">in</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="p">..</span><span class="o">&lt;</span><span class="w"> </span><span class="n">metricCount</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="mi">1</span><span class="p">:</span>
<a id="__codelineno-1-38" name="__codelineno-1-38" href="#__codelineno-1-38"></a><span class="sx"> let</span><span class="w"> </span><span class="sx">metricCount</span><span class="w"> </span><span class="sx">= rng[].generate(uint32) mod</span><span class="w"> </span><span class="sx">4</span> <a id="__codelineno-1-38" name="__codelineno-1-38" href="#__codelineno-1-38"></a><span class="w"> </span><span class="n">metricList</span><span class="p">.</span><span class="n">metrics</span><span class="p">.</span><span class="n">add</span><span class="p">(</span>
<a id="__codelineno-1-39" name="__codelineno-1-39" href="#__codelineno-1-39"></a><span class="w"> </span><span class="sx">for</span><span class="w"> </span><span class="sx">i</span><span class="w"> </span><span class="sx">in</span><span class="w"> </span><span class="sx">0</span><span class="w"> </span><span class="sx">..&lt; metricCount</span><span class="w"> </span><span class="sx">+ 1</span>: <a id="__codelineno-1-39" name="__codelineno-1-39" href="#__codelineno-1-39"></a><span class="w"> </span><span class="n">Metric</span><span class="p">(</span><span class="n">name</span><span class="p">:</span><span class="w"> </span><span class="s">&quot;metric_&quot;</span><span class="w"> </span><span class="o">&amp;</span><span class="w"> </span><span class="o">$</span><span class="n">i</span><span class="p">,</span><span class="w"> </span><span class="n">value</span><span class="p">:</span><span class="w"> </span><span class="nb">float</span><span class="p">(</span><span class="n">rng</span><span class="o">[]</span><span class="p">.</span><span class="n">generate</span><span class="p">(</span><span class="n">uint16</span><span class="p">))</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="mf">1000.0</span><span class="p">)</span>
<a id="__codelineno-1-40" name="__codelineno-1-40" href="#__codelineno-1-40"></a><span class="w"> </span><span class="sx">metricList.metrics.add(</span> <a id="__codelineno-1-40" name="__codelineno-1-40" href="#__codelineno-1-40"></a><span class="w"> </span><span class="p">)</span>
<a id="__codelineno-1-41" name="__codelineno-1-41" href="#__codelineno-1-41"></a><span class="sx"> Metric(name</span>:<span class="w"> </span><span class="sx">&quot;metric_&quot; &amp; $i</span>,<span class="w"> </span><span class="sx">value</span>:<span class="w"> </span><span class="sx">float(rng[].generate(uint16)) / 1000.0)</span> <a id="__codelineno-1-41" name="__codelineno-1-41" href="#__codelineno-1-41"></a>
<a id="__codelineno-1-42" name="__codelineno-1-42" href="#__codelineno-1-42"></a><span class="sx"> )</span> <a id="__codelineno-1-42" name="__codelineno-1-42" href="#__codelineno-1-42"></a><span class="w"> </span><span class="k">discard</span><span class="w"> </span><span class="n">await</span><span class="w"> </span><span class="n">node</span><span class="p">.</span><span class="n">gossip</span><span class="p">.</span><span class="n">publish</span><span class="p">(</span><span class="s">&quot;metrics&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">encode</span><span class="p">(</span><span class="n">metricList</span><span class="p">).</span><span class="n">buffer</span><span class="p">)</span>
<a id="__codelineno-1-43" name="__codelineno-1-43" href="#__codelineno-1-43"></a> <a id="__codelineno-1-43" name="__codelineno-1-43" href="#__codelineno-1-43"></a><span class="w"> </span><span class="n">await</span><span class="w"> </span><span class="n">node</span><span class="p">.</span><span class="n">switch</span><span class="p">.</span><span class="n">stop</span><span class="p">()</span>
<a id="__codelineno-1-44" name="__codelineno-1-44" href="#__codelineno-1-44"></a><span class="sx"> discard</span><span class="w"> </span><span class="sx">await</span><span class="w"> </span><span class="sx">node.gossip.publish(&quot;metrics&quot;, encode(metricList).buffer)</span>
<a id="__codelineno-1-45" name="__codelineno-1-45" href="#__codelineno-1-45"></a><span class="sx"> await</span><span class="w"> </span><span class="sx">node.switch.stop()</span>
</code></pre></div> </code></pre></div>
For our main procedure, we'll create a few nodes, and connect them together. For our main procedure, we'll create a few nodes, and connect them together.
Note that they are not all interconnected, but GossipSub will take care of Note that they are not all interconnected, but GossipSub will take care of

View File

@ -194,7 +194,7 @@ proc networking(g: Game) {.async.} =
gossip.subscribe( gossip.subscribe(
"/tron/matchmaking", "/tron/matchmaking",
proc(topic: string, data: seq[byte]) {.async: (raises: []).} = proc(topic: string, data: seq[byte]) {.async.} =
# If we are still looking for an opponent, # If we are still looking for an opponent,
# try to match anyone broadcasting its address # try to match anyone broadcasting its address
if g.peerFound.finished or g.hasCandidate: if g.peerFound.finished or g.hasCandidate:

View File

@ -781,90 +781,90 @@ and launch the game.
<a id="__codelineno-3-41" name="__codelineno-3-41" href="#__codelineno-3-41"></a> <a id="__codelineno-3-41" name="__codelineno-3-41" href="#__codelineno-3-41"></a>
<a id="__codelineno-3-42" name="__codelineno-3-42" href="#__codelineno-3-42"></a><span class="w"> </span><span class="n">gossip</span><span class="p">.</span><span class="n">subscribe</span><span class="p">(</span> <a id="__codelineno-3-42" name="__codelineno-3-42" href="#__codelineno-3-42"></a><span class="w"> </span><span class="n">gossip</span><span class="p">.</span><span class="n">subscribe</span><span class="p">(</span>
<a id="__codelineno-3-43" name="__codelineno-3-43" href="#__codelineno-3-43"></a><span class="w"> </span><span class="s">&quot;/tron/matchmaking&quot;</span><span class="p">,</span> <a id="__codelineno-3-43" name="__codelineno-3-43" href="#__codelineno-3-43"></a><span class="w"> </span><span class="s">&quot;/tron/matchmaking&quot;</span><span class="p">,</span>
<a id="__codelineno-3-44" name="__codelineno-3-44" href="#__codelineno-3-44"></a><span class="w"> </span><span class="n">proc</span><span class="p">(</span><span class="n">topic</span><span class="p">:</span><span class="w"> </span><span class="nb">string</span><span class="p">,</span><span class="w"> </span><span class="n">data</span><span class="p">:</span><span class="w"> </span><span class="nb">seq</span><span class="o">[</span><span class="n">byte</span><span class="o">]</span><span class="p">)</span><span class="w"> </span><span class="sx">{.async</span>:<span class="w"> </span><span class="sx">(raises</span>:<span class="w"> </span><span class="sx">[]).} =</span> <a id="__codelineno-3-44" name="__codelineno-3-44" href="#__codelineno-3-44"></a><span class="w"> </span><span class="n">proc</span><span class="p">(</span><span class="n">topic</span><span class="p">:</span><span class="w"> </span><span class="nb">string</span><span class="p">,</span><span class="w"> </span><span class="n">data</span><span class="p">:</span><span class="w"> </span><span class="nb">seq</span><span class="o">[</span><span class="n">byte</span><span class="o">]</span><span class="p">)</span><span class="w"> </span><span class="sx">{.async.}</span><span class="w"> </span><span class="o">=</span>
<a id="__codelineno-3-45" name="__codelineno-3-45" href="#__codelineno-3-45"></a><span class="sx"> # If</span><span class="w"> </span><span class="sx">we</span><span class="w"> </span><span class="sx">are</span><span class="w"> </span><span class="sx">still</span><span class="w"> </span><span class="sx">looking</span><span class="w"> </span><span class="sx">for</span><span class="w"> </span><span class="sx">an</span><span class="w"> </span><span class="sx">opponent</span>, <a id="__codelineno-3-45" name="__codelineno-3-45" href="#__codelineno-3-45"></a><span class="w"> </span><span class="c"># If we are still looking for an opponent,</span>
<a id="__codelineno-3-46" name="__codelineno-3-46" href="#__codelineno-3-46"></a><span class="w"> </span><span class="sx"># try</span><span class="w"> </span><span class="sx">to</span><span class="w"> </span><span class="sx">match</span><span class="w"> </span><span class="sx">anyone</span><span class="w"> </span><span class="sx">broadcasting</span><span class="w"> </span><span class="sx">its</span><span class="w"> </span><span class="sx">address</span> <a id="__codelineno-3-46" name="__codelineno-3-46" href="#__codelineno-3-46"></a><span class="w"> </span><span class="c"># try to match anyone broadcasting its address</span>
<a id="__codelineno-3-47" name="__codelineno-3-47" href="#__codelineno-3-47"></a><span class="w"> </span><span class="sx">if</span><span class="w"> </span><span class="sx">g.peerFound.finished</span><span class="w"> </span><span class="sx">or</span><span class="w"> </span><span class="sx">g.hasCandidate</span>: <a id="__codelineno-3-47" name="__codelineno-3-47" href="#__codelineno-3-47"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="n">g</span><span class="p">.</span><span class="n">peerFound</span><span class="p">.</span><span class="n">finished</span><span class="w"> </span><span class="ow">or</span><span class="w"> </span><span class="n">g</span><span class="p">.</span><span class="n">hasCandidate</span><span class="p">:</span>
<a id="__codelineno-3-48" name="__codelineno-3-48" href="#__codelineno-3-48"></a><span class="w"> </span><span class="sx">return</span> <a id="__codelineno-3-48" name="__codelineno-3-48" href="#__codelineno-3-48"></a><span class="w"> </span><span class="k">return</span>
<a id="__codelineno-3-49" name="__codelineno-3-49" href="#__codelineno-3-49"></a><span class="w"> </span><span class="sx">g.hasCandidate</span><span class="w"> </span><span class="sx">= true</span> <a id="__codelineno-3-49" name="__codelineno-3-49" href="#__codelineno-3-49"></a><span class="w"> </span><span class="n">g</span><span class="p">.</span><span class="n">hasCandidate</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="kp">true</span>
<a id="__codelineno-3-50" name="__codelineno-3-50" href="#__codelineno-3-50"></a> <a id="__codelineno-3-50" name="__codelineno-3-50" href="#__codelineno-3-50"></a>
<a id="__codelineno-3-51" name="__codelineno-3-51" href="#__codelineno-3-51"></a><span class="w"> </span><span class="sx">try</span>: <a id="__codelineno-3-51" name="__codelineno-3-51" href="#__codelineno-3-51"></a><span class="w"> </span><span class="k">try</span><span class="p">:</span>
<a id="__codelineno-3-52" name="__codelineno-3-52" href="#__codelineno-3-52"></a><span class="w"> </span><span class="sx">let</span> <a id="__codelineno-3-52" name="__codelineno-3-52" href="#__codelineno-3-52"></a><span class="w"> </span><span class="k">let</span>
<a id="__codelineno-3-53" name="__codelineno-3-53" href="#__codelineno-3-53"></a><span class="w"> </span><span class="sx">(peerId</span>,<span class="w"> </span><span class="sx">multiAddress) = parseFullAddress(data).tryGet()</span> <a id="__codelineno-3-53" name="__codelineno-3-53" href="#__codelineno-3-53"></a><span class="w"> </span><span class="p">(</span><span class="n">peerId</span><span class="p">,</span><span class="w"> </span><span class="n">multiAddress</span><span class="p">)</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">parseFullAddress</span><span class="p">(</span><span class="n">data</span><span class="p">).</span><span class="n">tryGet</span><span class="p">()</span>
<a id="__codelineno-3-54" name="__codelineno-3-54" href="#__codelineno-3-54"></a><span class="sx"> stream</span><span class="w"> </span><span class="sx">= await</span><span class="w"> </span><span class="sx">switch.dial(peerId</span>,<span class="w"> </span><span class="sx">@[multiAddress], gameProto.codec)</span> <a id="__codelineno-3-54" name="__codelineno-3-54" href="#__codelineno-3-54"></a><span class="w"> </span><span class="n">stream</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">await</span><span class="w"> </span><span class="n">switch</span><span class="p">.</span><span class="n">dial</span><span class="p">(</span><span class="n">peerId</span><span class="p">,</span><span class="w"> </span><span class="o">@[</span><span class="n">multiAddress</span><span class="o">]</span><span class="p">,</span><span class="w"> </span><span class="n">gameProto</span><span class="p">.</span><span class="n">codec</span><span class="p">)</span>
<a id="__codelineno-3-55" name="__codelineno-3-55" href="#__codelineno-3-55"></a> <a id="__codelineno-3-55" name="__codelineno-3-55" href="#__codelineno-3-55"></a>
<a id="__codelineno-3-56" name="__codelineno-3-56" href="#__codelineno-3-56"></a><span class="sx"> await</span><span class="w"> </span><span class="sx">stream.writeLp(&quot;ok&quot;)</span> <a id="__codelineno-3-56" name="__codelineno-3-56" href="#__codelineno-3-56"></a><span class="w"> </span><span class="n">await</span><span class="w"> </span><span class="n">stream</span><span class="p">.</span><span class="n">writeLp</span><span class="p">(</span><span class="s">&quot;ok&quot;</span><span class="p">)</span>
<a id="__codelineno-3-57" name="__codelineno-3-57" href="#__codelineno-3-57"></a><span class="sx"> if</span><span class="w"> </span><span class="sx">(await</span><span class="w"> </span><span class="sx">stream.readLp(10)) != &quot;ok&quot;.toBytes</span>: <a id="__codelineno-3-57" name="__codelineno-3-57" href="#__codelineno-3-57"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">await</span><span class="w"> </span><span class="n">stream</span><span class="p">.</span><span class="n">readLp</span><span class="p">(</span><span class="mi">10</span><span class="p">))</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="s">&quot;ok&quot;</span><span class="p">.</span><span class="n">toBytes</span><span class="p">:</span>
<a id="__codelineno-3-58" name="__codelineno-3-58" href="#__codelineno-3-58"></a><span class="w"> </span><span class="sx">g.hasCandidate</span><span class="w"> </span><span class="sx">= false</span> <a id="__codelineno-3-58" name="__codelineno-3-58" href="#__codelineno-3-58"></a><span class="w"> </span><span class="n">g</span><span class="p">.</span><span class="n">hasCandidate</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="kp">false</span>
<a id="__codelineno-3-59" name="__codelineno-3-59" href="#__codelineno-3-59"></a><span class="w"> </span><span class="sx">return</span> <a id="__codelineno-3-59" name="__codelineno-3-59" href="#__codelineno-3-59"></a><span class="w"> </span><span class="k">return</span>
<a id="__codelineno-3-60" name="__codelineno-3-60" href="#__codelineno-3-60"></a><span class="w"> </span><span class="sx">g.peerFound.complete(stream)</span> <a id="__codelineno-3-60" name="__codelineno-3-60" href="#__codelineno-3-60"></a><span class="w"> </span><span class="n">g</span><span class="p">.</span><span class="n">peerFound</span><span class="p">.</span><span class="n">complete</span><span class="p">(</span><span class="n">stream</span><span class="p">)</span>
<a id="__codelineno-3-61" name="__codelineno-3-61" href="#__codelineno-3-61"></a><span class="sx"> # We</span><span class="w"> </span><span class="sx">are</span><span class="w"> </span><span class="sx">&quot;player</span><span class="w"> </span><span class="sx">2&quot;</span> <a id="__codelineno-3-61" name="__codelineno-3-61" href="#__codelineno-3-61"></a><span class="w"> </span><span class="c"># We are &quot;player 2&quot;</span>
<a id="__codelineno-3-62" name="__codelineno-3-62" href="#__codelineno-3-62"></a><span class="sx"> swap(g.localPlayer</span>,<span class="w"> </span><span class="sx">g.remotePlayer)</span> <a id="__codelineno-3-62" name="__codelineno-3-62" href="#__codelineno-3-62"></a><span class="w"> </span><span class="n">swap</span><span class="p">(</span><span class="n">g</span><span class="p">.</span><span class="n">localPlayer</span><span class="p">,</span><span class="w"> </span><span class="n">g</span><span class="p">.</span><span class="n">remotePlayer</span><span class="p">)</span>
<a id="__codelineno-3-63" name="__codelineno-3-63" href="#__codelineno-3-63"></a><span class="sx"> except</span><span class="w"> </span><span class="sx">CatchableError</span><span class="w"> </span><span class="sx">as</span><span class="w"> </span><span class="sx">exc</span>: <a id="__codelineno-3-63" name="__codelineno-3-63" href="#__codelineno-3-63"></a><span class="w"> </span><span class="k">except</span><span class="w"> </span><span class="n">CatchableError</span><span class="w"> </span><span class="k">as</span><span class="w"> </span><span class="n">exc</span><span class="p">:</span>
<a id="__codelineno-3-64" name="__codelineno-3-64" href="#__codelineno-3-64"></a><span class="w"> </span><span class="sx">discard</span> <a id="__codelineno-3-64" name="__codelineno-3-64" href="#__codelineno-3-64"></a><span class="w"> </span><span class="k">discard</span>
<a id="__codelineno-3-65" name="__codelineno-3-65" href="#__codelineno-3-65"></a><span class="w"> </span>, <a id="__codelineno-3-65" name="__codelineno-3-65" href="#__codelineno-3-65"></a><span class="w"> </span><span class="p">,</span>
<a id="__codelineno-3-66" name="__codelineno-3-66" href="#__codelineno-3-66"></a><span class="w"> </span><span class="sx">)</span> <a id="__codelineno-3-66" name="__codelineno-3-66" href="#__codelineno-3-66"></a><span class="w"> </span><span class="p">)</span>
<a id="__codelineno-3-67" name="__codelineno-3-67" href="#__codelineno-3-67"></a> <a id="__codelineno-3-67" name="__codelineno-3-67" href="#__codelineno-3-67"></a>
<a id="__codelineno-3-68" name="__codelineno-3-68" href="#__codelineno-3-68"></a><span class="sx"> await</span><span class="w"> </span><span class="sx">switch.start()</span> <a id="__codelineno-3-68" name="__codelineno-3-68" href="#__codelineno-3-68"></a><span class="w"> </span><span class="n">await</span><span class="w"> </span><span class="n">switch</span><span class="p">.</span><span class="n">start</span><span class="p">()</span>
<a id="__codelineno-3-69" name="__codelineno-3-69" href="#__codelineno-3-69"></a><span class="sx"> defer</span>: <a id="__codelineno-3-69" name="__codelineno-3-69" href="#__codelineno-3-69"></a><span class="w"> </span><span class="k">defer</span><span class="p">:</span>
<a id="__codelineno-3-70" name="__codelineno-3-70" href="#__codelineno-3-70"></a><span class="w"> </span><span class="sx">await</span><span class="w"> </span><span class="sx">switch.stop()</span> <a id="__codelineno-3-70" name="__codelineno-3-70" href="#__codelineno-3-70"></a><span class="w"> </span><span class="n">await</span><span class="w"> </span><span class="n">switch</span><span class="p">.</span><span class="n">stop</span><span class="p">()</span>
<a id="__codelineno-3-71" name="__codelineno-3-71" href="#__codelineno-3-71"></a> <a id="__codelineno-3-71" name="__codelineno-3-71" href="#__codelineno-3-71"></a>
<a id="__codelineno-3-72" name="__codelineno-3-72" href="#__codelineno-3-72"></a><span class="sx"> # As</span><span class="w"> </span><span class="sx">explained</span><span class="w"> </span><span class="sx">in</span><span class="w"> </span><span class="sx">the</span><span class="w"> </span><span class="sx">last</span><span class="w"> </span><span class="sx">tutorial</span>,<span class="w"> </span><span class="sx">we</span><span class="w"> </span><span class="sx">need</span><span class="w"> </span><span class="sx">a</span><span class="w"> </span><span class="sx">bootnode</span><span class="w"> </span><span class="sx">to</span><span class="w"> </span><span class="sx">be</span><span class="w"> </span><span class="sx">able</span> <a id="__codelineno-3-72" name="__codelineno-3-72" href="#__codelineno-3-72"></a><span class="w"> </span><span class="c"># As explained in the last tutorial, we need a bootnode to be able</span>
<a id="__codelineno-3-73" name="__codelineno-3-73" href="#__codelineno-3-73"></a><span class="w"> </span><span class="sx"># to</span><span class="w"> </span><span class="sx">find</span><span class="w"> </span><span class="sx">peers. We</span><span class="w"> </span><span class="sx">could</span><span class="w"> </span><span class="sx">use</span><span class="w"> </span><span class="sx">any</span><span class="w"> </span><span class="sx">libp2p</span><span class="w"> </span><span class="sx">running</span><span class="w"> </span><span class="sx">rendezvous</span><span class="w"> </span><span class="sx">(or</span><span class="w"> </span><span class="sx">any</span> <a id="__codelineno-3-73" name="__codelineno-3-73" href="#__codelineno-3-73"></a><span class="w"> </span><span class="c"># to find peers. We could use any libp2p running rendezvous (or any</span>
<a id="__codelineno-3-74" name="__codelineno-3-74" href="#__codelineno-3-74"></a><span class="w"> </span><span class="sx"># node</span><span class="w"> </span><span class="sx">running</span><span class="w"> </span><span class="sx">tron). We</span><span class="w"> </span><span class="sx">will</span><span class="w"> </span><span class="sx">take</span><span class="w"> </span><span class="sx">it&#39;s</span><span class="w"> </span><span class="sx">MultiAddress</span><span class="w"> </span><span class="sx">from</span><span class="w"> </span><span class="sx">the</span><span class="w"> </span><span class="sx">command</span> <a id="__codelineno-3-74" name="__codelineno-3-74" href="#__codelineno-3-74"></a><span class="w"> </span><span class="c"># node running tron). We will take it&#39;s MultiAddress from the command</span>
<a id="__codelineno-3-75" name="__codelineno-3-75" href="#__codelineno-3-75"></a><span class="w"> </span><span class="sx"># line</span><span class="w"> </span><span class="sx">parameters</span> <a id="__codelineno-3-75" name="__codelineno-3-75" href="#__codelineno-3-75"></a><span class="w"> </span><span class="c"># line parameters</span>
<a id="__codelineno-3-76" name="__codelineno-3-76" href="#__codelineno-3-76"></a><span class="w"> </span><span class="sx">if</span><span class="w"> </span><span class="sx">paramCount() &gt; 0</span>: <a id="__codelineno-3-76" name="__codelineno-3-76" href="#__codelineno-3-76"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="n">paramCount</span><span class="p">()</span><span class="w"> </span><span class="o">&gt;</span><span class="w"> </span><span class="mi">0</span><span class="p">:</span>
<a id="__codelineno-3-77" name="__codelineno-3-77" href="#__codelineno-3-77"></a><span class="w"> </span><span class="sx">let</span><span class="w"> </span><span class="sx">(peerId</span>,<span class="w"> </span><span class="sx">multiAddress) = paramStr(1).parseFullAddress().tryGet()</span> <a id="__codelineno-3-77" name="__codelineno-3-77" href="#__codelineno-3-77"></a><span class="w"> </span><span class="k">let</span><span class="w"> </span><span class="p">(</span><span class="n">peerId</span><span class="p">,</span><span class="w"> </span><span class="n">multiAddress</span><span class="p">)</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">paramStr</span><span class="p">(</span><span class="mi">1</span><span class="p">).</span><span class="n">parseFullAddress</span><span class="p">().</span><span class="n">tryGet</span><span class="p">()</span>
<a id="__codelineno-3-78" name="__codelineno-3-78" href="#__codelineno-3-78"></a><span class="sx"> await</span><span class="w"> </span><span class="sx">switch.connect(peerId</span>,<span class="w"> </span><span class="sx">@[multiAddress])</span> <a id="__codelineno-3-78" name="__codelineno-3-78" href="#__codelineno-3-78"></a><span class="w"> </span><span class="n">await</span><span class="w"> </span><span class="n">switch</span><span class="p">.</span><span class="n">connect</span><span class="p">(</span><span class="n">peerId</span><span class="p">,</span><span class="w"> </span><span class="o">@[</span><span class="n">multiAddress</span><span class="o">]</span><span class="p">)</span>
<a id="__codelineno-3-79" name="__codelineno-3-79" href="#__codelineno-3-79"></a><span class="sx"> else</span>: <a id="__codelineno-3-79" name="__codelineno-3-79" href="#__codelineno-3-79"></a><span class="w"> </span><span class="k">else</span><span class="p">:</span>
<a id="__codelineno-3-80" name="__codelineno-3-80" href="#__codelineno-3-80"></a><span class="w"> </span><span class="sx">echo</span><span class="w"> </span><span class="sx">&quot;No</span><span class="w"> </span><span class="sx">bootnode</span><span class="w"> </span><span class="sx">provided</span>,<span class="w"> </span><span class="sx">listening</span><span class="w"> </span><span class="sx">on</span>:<span class="w"> </span><span class="sx">&quot;, switch.peerInfo.fullAddrs.tryGet()</span> <a id="__codelineno-3-80" name="__codelineno-3-80" href="#__codelineno-3-80"></a><span class="w"> </span><span class="n">echo</span><span class="w"> </span><span class="s">&quot;No bootnode provided, listening on: &quot;</span><span class="p">,</span><span class="w"> </span><span class="n">switch</span><span class="p">.</span><span class="n">peerInfo</span><span class="p">.</span><span class="n">fullAddrs</span><span class="p">.</span><span class="n">tryGet</span><span class="p">()</span>
<a id="__codelineno-3-81" name="__codelineno-3-81" href="#__codelineno-3-81"></a> <a id="__codelineno-3-81" name="__codelineno-3-81" href="#__codelineno-3-81"></a>
<a id="__codelineno-3-82" name="__codelineno-3-82" href="#__codelineno-3-82"></a><span class="sx"> # Discover</span><span class="w"> </span><span class="sx">peers</span><span class="w"> </span><span class="sx">from</span><span class="w"> </span><span class="sx">the</span><span class="w"> </span><span class="sx">bootnode</span>,<span class="w"> </span><span class="sx">and</span><span class="w"> </span><span class="sx">connect</span><span class="w"> </span><span class="sx">to</span><span class="w"> </span><span class="sx">them</span> <a id="__codelineno-3-82" name="__codelineno-3-82" href="#__codelineno-3-82"></a><span class="w"> </span><span class="c"># Discover peers from the bootnode, and connect to them</span>
<a id="__codelineno-3-83" name="__codelineno-3-83" href="#__codelineno-3-83"></a><span class="w"> </span><span class="sx">dm.advertise(RdvNamespace(&quot;tron&quot;))</span> <a id="__codelineno-3-83" name="__codelineno-3-83" href="#__codelineno-3-83"></a><span class="w"> </span><span class="n">dm</span><span class="p">.</span><span class="n">advertise</span><span class="p">(</span><span class="n">RdvNamespace</span><span class="p">(</span><span class="s">&quot;tron&quot;</span><span class="p">))</span>
<a id="__codelineno-3-84" name="__codelineno-3-84" href="#__codelineno-3-84"></a><span class="sx"> let</span><span class="w"> </span><span class="sx">discoveryQuery</span><span class="w"> </span><span class="sx">= dm.request(RdvNamespace(&quot;tron&quot;))</span> <a id="__codelineno-3-84" name="__codelineno-3-84" href="#__codelineno-3-84"></a><span class="w"> </span><span class="k">let</span><span class="w"> </span><span class="n">discoveryQuery</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">dm</span><span class="p">.</span><span class="n">request</span><span class="p">(</span><span class="n">RdvNamespace</span><span class="p">(</span><span class="s">&quot;tron&quot;</span><span class="p">))</span>
<a id="__codelineno-3-85" name="__codelineno-3-85" href="#__codelineno-3-85"></a><span class="sx"> discoveryQuery.forEach</span>: <a id="__codelineno-3-85" name="__codelineno-3-85" href="#__codelineno-3-85"></a><span class="w"> </span><span class="n">discoveryQuery</span><span class="p">.</span><span class="n">forEach</span><span class="p">:</span>
<a id="__codelineno-3-86" name="__codelineno-3-86" href="#__codelineno-3-86"></a><span class="w"> </span><span class="sx">try</span>: <a id="__codelineno-3-86" name="__codelineno-3-86" href="#__codelineno-3-86"></a><span class="w"> </span><span class="k">try</span><span class="p">:</span>
<a id="__codelineno-3-87" name="__codelineno-3-87" href="#__codelineno-3-87"></a><span class="w"> </span><span class="sx">await</span><span class="w"> </span><span class="sx">switch.connect(peer[PeerId], peer.getAll(MultiAddress))</span> <a id="__codelineno-3-87" name="__codelineno-3-87" href="#__codelineno-3-87"></a><span class="w"> </span><span class="n">await</span><span class="w"> </span><span class="n">switch</span><span class="p">.</span><span class="n">connect</span><span class="p">(</span><span class="n">peer</span><span class="o">[</span><span class="n">PeerId</span><span class="o">]</span><span class="p">,</span><span class="w"> </span><span class="n">peer</span><span class="p">.</span><span class="n">getAll</span><span class="p">(</span><span class="n">MultiAddress</span><span class="p">))</span>
<a id="__codelineno-3-88" name="__codelineno-3-88" href="#__codelineno-3-88"></a><span class="sx"> except</span><span class="w"> </span><span class="sx">CatchableError</span><span class="w"> </span><span class="sx">as</span><span class="w"> </span><span class="sx">exc</span>: <a id="__codelineno-3-88" name="__codelineno-3-88" href="#__codelineno-3-88"></a><span class="w"> </span><span class="k">except</span><span class="w"> </span><span class="n">CatchableError</span><span class="w"> </span><span class="k">as</span><span class="w"> </span><span class="n">exc</span><span class="p">:</span>
<a id="__codelineno-3-89" name="__codelineno-3-89" href="#__codelineno-3-89"></a><span class="w"> </span><span class="sx">echo</span><span class="w"> </span><span class="sx">&quot;Failed</span><span class="w"> </span><span class="sx">to</span><span class="w"> </span><span class="sx">dial</span><span class="w"> </span><span class="sx">a</span><span class="w"> </span><span class="sx">peer</span>:<span class="w"> </span><span class="sx">&quot;, exc.msg</span> <a id="__codelineno-3-89" name="__codelineno-3-89" href="#__codelineno-3-89"></a><span class="w"> </span><span class="n">echo</span><span class="w"> </span><span class="s">&quot;Failed to dial a peer: &quot;</span><span class="p">,</span><span class="w"> </span><span class="n">exc</span><span class="p">.</span><span class="n">msg</span>
<a id="__codelineno-3-90" name="__codelineno-3-90" href="#__codelineno-3-90"></a> <a id="__codelineno-3-90" name="__codelineno-3-90" href="#__codelineno-3-90"></a>
<a id="__codelineno-3-91" name="__codelineno-3-91" href="#__codelineno-3-91"></a><span class="w"> </span><span class="sx"># We</span><span class="w"> </span><span class="sx">will</span><span class="w"> </span><span class="sx">try</span><span class="w"> </span><span class="sx">to</span><span class="w"> </span><span class="sx">publish</span><span class="w"> </span><span class="sx">our</span><span class="w"> </span><span class="sx">address</span><span class="w"> </span><span class="sx">multiple</span><span class="w"> </span><span class="sx">times</span>,<span class="w"> </span><span class="sx">in</span><span class="w"> </span><span class="sx">case</span> <a id="__codelineno-3-91" name="__codelineno-3-91" href="#__codelineno-3-91"></a><span class="w"> </span><span class="c"># We will try to publish our address multiple times, in case</span>
<a id="__codelineno-3-92" name="__codelineno-3-92" href="#__codelineno-3-92"></a><span class="w"> </span><span class="sx"># it</span><span class="w"> </span><span class="sx">takes</span><span class="w"> </span><span class="sx">time</span><span class="w"> </span><span class="sx">to</span><span class="w"> </span><span class="sx">establish</span><span class="w"> </span><span class="sx">connections</span><span class="w"> </span><span class="sx">with</span><span class="w"> </span><span class="sx">other</span><span class="w"> </span><span class="sx">GossipSub</span><span class="w"> </span><span class="sx">peers</span> <a id="__codelineno-3-92" name="__codelineno-3-92" href="#__codelineno-3-92"></a><span class="w"> </span><span class="c"># it takes time to establish connections with other GossipSub peers</span>
<a id="__codelineno-3-93" name="__codelineno-3-93" href="#__codelineno-3-93"></a><span class="w"> </span><span class="sx">var</span><span class="w"> </span><span class="sx">published</span><span class="w"> </span><span class="sx">= false</span> <a id="__codelineno-3-93" name="__codelineno-3-93" href="#__codelineno-3-93"></a><span class="w"> </span><span class="kd">var</span><span class="w"> </span><span class="n">published</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="kp">false</span>
<a id="__codelineno-3-94" name="__codelineno-3-94" href="#__codelineno-3-94"></a><span class="w"> </span><span class="sx">while</span><span class="w"> </span><span class="sx">not</span><span class="w"> </span><span class="sx">published</span>: <a id="__codelineno-3-94" name="__codelineno-3-94" href="#__codelineno-3-94"></a><span class="w"> </span><span class="k">while</span><span class="w"> </span><span class="ow">not</span><span class="w"> </span><span class="n">published</span><span class="p">:</span>
<a id="__codelineno-3-95" name="__codelineno-3-95" href="#__codelineno-3-95"></a><span class="w"> </span><span class="sx">await</span><span class="w"> </span><span class="sx">sleepAsync(500.milliseconds)</span> <a id="__codelineno-3-95" name="__codelineno-3-95" href="#__codelineno-3-95"></a><span class="w"> </span><span class="n">await</span><span class="w"> </span><span class="n">sleepAsync</span><span class="p">(</span><span class="mf">500.</span><span class="n">milliseconds</span><span class="p">)</span>
<a id="__codelineno-3-96" name="__codelineno-3-96" href="#__codelineno-3-96"></a><span class="sx"> for</span><span class="w"> </span><span class="sx">fullAddr</span><span class="w"> </span><span class="sx">in</span><span class="w"> </span><span class="sx">switch.peerInfo.fullAddrs.tryGet():</span> <a id="__codelineno-3-96" name="__codelineno-3-96" href="#__codelineno-3-96"></a><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="n">fullAddr</span><span class="w"> </span><span class="ow">in</span><span class="w"> </span><span class="n">switch</span><span class="p">.</span><span class="n">peerInfo</span><span class="p">.</span><span class="n">fullAddrs</span><span class="p">.</span><span class="n">tryGet</span><span class="p">():</span>
<a id="__codelineno-3-97" name="__codelineno-3-97" href="#__codelineno-3-97"></a><span class="sx"> if</span><span class="w"> </span><span class="sx">(await</span><span class="w"> </span><span class="sx">gossip.publish(&quot;/tron/matchmaking&quot;, fullAddr.bytes)) == 0</span>: <a id="__codelineno-3-97" name="__codelineno-3-97" href="#__codelineno-3-97"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">await</span><span class="w"> </span><span class="n">gossip</span><span class="p">.</span><span class="n">publish</span><span class="p">(</span><span class="s">&quot;/tron/matchmaking&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">fullAddr</span><span class="p">.</span><span class="n">bytes</span><span class="p">))</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="mi">0</span><span class="p">:</span>
<a id="__codelineno-3-98" name="__codelineno-3-98" href="#__codelineno-3-98"></a><span class="w"> </span><span class="sx">published</span><span class="w"> </span><span class="sx">= false</span> <a id="__codelineno-3-98" name="__codelineno-3-98" href="#__codelineno-3-98"></a><span class="w"> </span><span class="n">published</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="kp">false</span>
<a id="__codelineno-3-99" name="__codelineno-3-99" href="#__codelineno-3-99"></a><span class="w"> </span><span class="sx">break</span> <a id="__codelineno-3-99" name="__codelineno-3-99" href="#__codelineno-3-99"></a><span class="w"> </span><span class="k">break</span>
<a id="__codelineno-3-100" name="__codelineno-3-100" href="#__codelineno-3-100"></a><span class="w"> </span><span class="sx">published</span><span class="w"> </span><span class="sx">= true</span> <a id="__codelineno-3-100" name="__codelineno-3-100" href="#__codelineno-3-100"></a><span class="w"> </span><span class="n">published</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="kp">true</span>
<a id="__codelineno-3-101" name="__codelineno-3-101" href="#__codelineno-3-101"></a> <a id="__codelineno-3-101" name="__codelineno-3-101" href="#__codelineno-3-101"></a>
<a id="__codelineno-3-102" name="__codelineno-3-102" href="#__codelineno-3-102"></a><span class="w"> </span><span class="sx">discoveryQuery.stop()</span> <a id="__codelineno-3-102" name="__codelineno-3-102" href="#__codelineno-3-102"></a><span class="w"> </span><span class="n">discoveryQuery</span><span class="p">.</span><span class="n">stop</span><span class="p">()</span>
<a id="__codelineno-3-103" name="__codelineno-3-103" href="#__codelineno-3-103"></a> <a id="__codelineno-3-103" name="__codelineno-3-103" href="#__codelineno-3-103"></a>
<a id="__codelineno-3-104" name="__codelineno-3-104" href="#__codelineno-3-104"></a><span class="sx"> # We</span><span class="w"> </span><span class="sx">now</span><span class="w"> </span><span class="sx">wait</span><span class="w"> </span><span class="sx">for</span><span class="w"> </span><span class="sx">someone</span><span class="w"> </span><span class="sx">to</span><span class="w"> </span><span class="sx">connect</span><span class="w"> </span><span class="sx">to</span><span class="w"> </span><span class="sx">us</span><span class="w"> </span><span class="sx">(or</span><span class="w"> </span><span class="sx">for</span><span class="w"> </span><span class="sx">us</span><span class="w"> </span><span class="sx">to</span><span class="w"> </span><span class="sx">connect</span><span class="w"> </span><span class="sx">to</span><span class="w"> </span><span class="sx">someone)</span> <a id="__codelineno-3-104" name="__codelineno-3-104" href="#__codelineno-3-104"></a><span class="w"> </span><span class="c"># We now wait for someone to connect to us (or for us to connect to someone)</span>
<a id="__codelineno-3-105" name="__codelineno-3-105" href="#__codelineno-3-105"></a><span class="sx"> let</span><span class="w"> </span><span class="sx">peerConn</span><span class="w"> </span><span class="sx">= await</span><span class="w"> </span><span class="sx">g.peerFound</span> <a id="__codelineno-3-105" name="__codelineno-3-105" href="#__codelineno-3-105"></a><span class="w"> </span><span class="k">let</span><span class="w"> </span><span class="n">peerConn</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">await</span><span class="w"> </span><span class="n">g</span><span class="p">.</span><span class="n">peerFound</span>
<a id="__codelineno-3-106" name="__codelineno-3-106" href="#__codelineno-3-106"></a><span class="w"> </span><span class="sx">defer</span>: <a id="__codelineno-3-106" name="__codelineno-3-106" href="#__codelineno-3-106"></a><span class="w"> </span><span class="k">defer</span><span class="p">:</span>
<a id="__codelineno-3-107" name="__codelineno-3-107" href="#__codelineno-3-107"></a><span class="w"> </span><span class="sx">await</span><span class="w"> </span><span class="sx">peerConn.closeWithEof()</span> <a id="__codelineno-3-107" name="__codelineno-3-107" href="#__codelineno-3-107"></a><span class="w"> </span><span class="n">await</span><span class="w"> </span><span class="n">peerConn</span><span class="p">.</span><span class="n">closeWithEof</span><span class="p">()</span>
<a id="__codelineno-3-108" name="__codelineno-3-108" href="#__codelineno-3-108"></a> <a id="__codelineno-3-108" name="__codelineno-3-108" href="#__codelineno-3-108"></a>
<a id="__codelineno-3-109" name="__codelineno-3-109" href="#__codelineno-3-109"></a><span class="sx"> await</span><span class="w"> </span><span class="sx">g.mainLoop(peerConn)</span> <a id="__codelineno-3-109" name="__codelineno-3-109" href="#__codelineno-3-109"></a><span class="w"> </span><span class="n">await</span><span class="w"> </span><span class="n">g</span><span class="p">.</span><span class="n">mainLoop</span><span class="p">(</span><span class="n">peerConn</span><span class="p">)</span>
<a id="__codelineno-3-110" name="__codelineno-3-110" href="#__codelineno-3-110"></a> <a id="__codelineno-3-110" name="__codelineno-3-110" href="#__codelineno-3-110"></a>
<a id="__codelineno-3-111" name="__codelineno-3-111" href="#__codelineno-3-111"></a><span class="sx">let</span> <a id="__codelineno-3-111" name="__codelineno-3-111" href="#__codelineno-3-111"></a><span class="k">let</span>
<a id="__codelineno-3-112" name="__codelineno-3-112" href="#__codelineno-3-112"></a><span class="w"> </span><span class="sx">game</span><span class="w"> </span><span class="sx">= Game.new()</span> <a id="__codelineno-3-112" name="__codelineno-3-112" href="#__codelineno-3-112"></a><span class="w"> </span><span class="n">game</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">Game</span><span class="p">.</span><span class="n">new</span><span class="p">()</span>
<a id="__codelineno-3-113" name="__codelineno-3-113" href="#__codelineno-3-113"></a><span class="sx"> netFut</span><span class="w"> </span><span class="sx">= networking(game)</span> <a id="__codelineno-3-113" name="__codelineno-3-113" href="#__codelineno-3-113"></a><span class="w"> </span><span class="n">netFut</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">networking</span><span class="p">(</span><span class="n">game</span><span class="p">)</span>
<a id="__codelineno-3-114" name="__codelineno-3-114" href="#__codelineno-3-114"></a><span class="sx">nico.init(&quot;Status&quot;, &quot;Tron&quot;)</span> <a id="__codelineno-3-114" name="__codelineno-3-114" href="#__codelineno-3-114"></a><span class="n">nico</span><span class="p">.</span><span class="n">init</span><span class="p">(</span><span class="s">&quot;Status&quot;</span><span class="p">,</span><span class="w"> </span><span class="s">&quot;Tron&quot;</span><span class="p">)</span>
<a id="__codelineno-3-115" name="__codelineno-3-115" href="#__codelineno-3-115"></a><span class="sx">nico.createWindow(&quot;Tron&quot;, mapSize</span><span class="w"> </span><span class="sx">* 4</span>,<span class="w"> </span><span class="sx">mapSize</span><span class="w"> </span><span class="sx">* 4</span>,<span class="w"> </span><span class="sx">4</span>,<span class="w"> </span><span class="sx">false)</span> <a id="__codelineno-3-115" name="__codelineno-3-115" href="#__codelineno-3-115"></a><span class="n">nico</span><span class="p">.</span><span class="n">createWindow</span><span class="p">(</span><span class="s">&quot;Tron&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">mapSize</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="mi">4</span><span class="p">,</span><span class="w"> </span><span class="n">mapSize</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="mi">4</span><span class="p">,</span><span class="w"> </span><span class="mi">4</span><span class="p">,</span><span class="w"> </span><span class="kp">false</span><span class="p">)</span>
<a id="__codelineno-3-116" name="__codelineno-3-116" href="#__codelineno-3-116"></a><span class="sx">nico.run(</span> <a id="__codelineno-3-116" name="__codelineno-3-116" href="#__codelineno-3-116"></a><span class="n">nico</span><span class="p">.</span><span class="n">run</span><span class="p">(</span>
<a id="__codelineno-3-117" name="__codelineno-3-117" href="#__codelineno-3-117"></a><span class="sx"> proc() =</span> <a id="__codelineno-3-117" name="__codelineno-3-117" href="#__codelineno-3-117"></a><span class="w"> </span><span class="n">proc</span><span class="p">()</span><span class="w"> </span><span class="o">=</span>
<a id="__codelineno-3-118" name="__codelineno-3-118" href="#__codelineno-3-118"></a><span class="sx"> discard</span> <a id="__codelineno-3-118" name="__codelineno-3-118" href="#__codelineno-3-118"></a><span class="w"> </span><span class="k">discard</span>
<a id="__codelineno-3-119" name="__codelineno-3-119" href="#__codelineno-3-119"></a><span class="w"> </span>, <a id="__codelineno-3-119" name="__codelineno-3-119" href="#__codelineno-3-119"></a><span class="w"> </span><span class="p">,</span>
<a id="__codelineno-3-120" name="__codelineno-3-120" href="#__codelineno-3-120"></a><span class="w"> </span><span class="sx">proc(dt</span>:<span class="w"> </span><span class="sx">float32) =</span> <a id="__codelineno-3-120" name="__codelineno-3-120" href="#__codelineno-3-120"></a><span class="w"> </span><span class="n">proc</span><span class="p">(</span><span class="n">dt</span><span class="p">:</span><span class="w"> </span><span class="nb">float32</span><span class="p">)</span><span class="w"> </span><span class="o">=</span>
<a id="__codelineno-3-121" name="__codelineno-3-121" href="#__codelineno-3-121"></a><span class="sx"> game.update(dt)</span> <a id="__codelineno-3-121" name="__codelineno-3-121" href="#__codelineno-3-121"></a><span class="w"> </span><span class="n">game</span><span class="p">.</span><span class="n">update</span><span class="p">(</span><span class="n">dt</span><span class="p">)</span>
<a id="__codelineno-3-122" name="__codelineno-3-122" href="#__codelineno-3-122"></a><span class="sx"> ,</span> <a id="__codelineno-3-122" name="__codelineno-3-122" href="#__codelineno-3-122"></a><span class="w"> </span><span class="p">,</span>
<a id="__codelineno-3-123" name="__codelineno-3-123" href="#__codelineno-3-123"></a><span class="sx"> proc() =</span> <a id="__codelineno-3-123" name="__codelineno-3-123" href="#__codelineno-3-123"></a><span class="w"> </span><span class="n">proc</span><span class="p">()</span><span class="w"> </span><span class="o">=</span>
<a id="__codelineno-3-124" name="__codelineno-3-124" href="#__codelineno-3-124"></a><span class="sx"> game.draw()</span> <a id="__codelineno-3-124" name="__codelineno-3-124" href="#__codelineno-3-124"></a><span class="w"> </span><span class="n">game</span><span class="p">.</span><span class="n">draw</span><span class="p">()</span>
<a id="__codelineno-3-125" name="__codelineno-3-125" href="#__codelineno-3-125"></a><span class="sx"> ,</span> <a id="__codelineno-3-125" name="__codelineno-3-125" href="#__codelineno-3-125"></a><span class="w"> </span><span class="p">,</span>
<a id="__codelineno-3-126" name="__codelineno-3-126" href="#__codelineno-3-126"></a><span class="sx">)</span> <a id="__codelineno-3-126" name="__codelineno-3-126" href="#__codelineno-3-126"></a><span class="p">)</span>
<a id="__codelineno-3-127" name="__codelineno-3-127" href="#__codelineno-3-127"></a><span class="sx">waitFor(netFut.cancelAndWait())</span> <a id="__codelineno-3-127" name="__codelineno-3-127" href="#__codelineno-3-127"></a><span class="n">waitFor</span><span class="p">(</span><span class="n">netFut</span><span class="p">.</span><span class="n">cancelAndWait</span><span class="p">())</span>
</code></pre></div> </code></pre></div>
And that's it! If you want to run this code locally, the simplest way is to use the And that's it! If you want to run this code locally, the simplest way is to use the
first node as a boot node for the second one. But you can also use any rendezvous node</p> first node as a boot node for the second one. But you can also use any rendezvous node</p>