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">
<url>
<loc>https://status-im.github.io/nim-libp2p/docs/</loc>
<lastmod>2025-01-14</lastmod>
<lastmod>2025-01-15</lastmod>
</url>
<url>
<loc>https://status-im.github.io/nim-libp2p/docs/circuitrelay/</loc>
<lastmod>2025-01-14</lastmod>
<lastmod>2025-01-15</lastmod>
</url>
<url>
<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>
<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>
<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>
<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>
<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>
<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>
<loc>https://status-im.github.io/nim-libp2p/docs/go-daemon/daemonapi/</loc>
<lastmod>2025-01-14</lastmod>
<lastmod>2025-01-15</lastmod>
</url>
</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
node.gossip.addValidator(
["metrics"],
proc(
topic: string, message: Message
): Future[ValidationResult] {.async: (raises: []).} =
proc(topic: string, message: Message): Future[ValidationResult] {.async.} =
let decoded = MetricList.decode(message.data)
if decoded.isErr:
return ValidationResult.Reject
@ -94,7 +92,7 @@ proc oneNode(node: Node, rng: ref HmacDrbgContext) {.async.} =
if node.hostname == "John":
node.gossip.subscribe(
"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")
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-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-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-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-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-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-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-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-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-14" name="__codelineno-1-14" href="#__codelineno-1-14"></a><span class="w"> </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-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-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-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-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-20" name="__codelineno-1-20" href="#__codelineno-1-20"></a>
<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-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-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-24" name="__codelineno-1-24" href="#__codelineno-1-24"></a><span class="sx"> node.gossip.subscribe(</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-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-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-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-29" name="__codelineno-1-29" href="#__codelineno-1-29"></a><span class="w"> </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-31" name="__codelineno-1-31" href="#__codelineno-1-31"></a><span class="sx"> else</span>:
<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-33" name="__codelineno-1-33" href="#__codelineno-1-33"></a>
<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-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-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-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-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-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-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-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-42" name="__codelineno-1-42" href="#__codelineno-1-42"></a><span class="sx"> )</span>
<a id="__codelineno-1-43" name="__codelineno-1-43" href="#__codelineno-1-43"></a>
<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>
<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="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="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="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="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="p">,</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><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="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="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="c"># peers sending them.</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="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><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="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="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="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="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="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="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="w"> </span><span class="p">,</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><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="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>
<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><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="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="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="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="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="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="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="p">)</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="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><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>
</code></pre></div>
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

View File

@ -194,7 +194,7 @@ proc networking(g: Game) {.async.} =
gossip.subscribe(
"/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,
# try to match anyone broadcasting its address
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-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-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-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-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-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-48" name="__codelineno-3-48" href="#__codelineno-3-48"></a><span class="w"> </span><span class="sx">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-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="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="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="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="k">return</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-51" name="__codelineno-3-51" href="#__codelineno-3-51"></a><span class="w"> </span><span class="sx">try</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-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-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-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="k">let</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="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-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-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-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-59" name="__codelineno-3-59" href="#__codelineno-3-59"></a><span class="w"> </span><span class="sx">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-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-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-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-64" name="__codelineno-3-64" href="#__codelineno-3-64"></a><span class="w"> </span><span class="sx">discard</span>
<a id="__codelineno-3-65" name="__codelineno-3-65" href="#__codelineno-3-65"></a><span class="w"> </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-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="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="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="k">return</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="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="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="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="k">discard</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="p">)</span>
<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-69" name="__codelineno-3-69" href="#__codelineno-3-69"></a><span class="sx"> defer</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-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="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="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-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-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-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-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-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-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-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-79" name="__codelineno-3-79" href="#__codelineno-3-79"></a><span class="sx"> else</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-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="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="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="c"># line parameters</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="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="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="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="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-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-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-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-85" name="__codelineno-3-85" href="#__codelineno-3-85"></a><span class="sx"> discoveryQuery.forEach</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-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-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-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-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="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="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="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="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="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="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="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-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-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-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-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-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-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-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-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-99" name="__codelineno-3-99" href="#__codelineno-3-99"></a><span class="w"> </span><span class="sx">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-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="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="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="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="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="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="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="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="k">break</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-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-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-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-106" name="__codelineno-3-106" href="#__codelineno-3-106"></a><span class="w"> </span><span class="sx">defer</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-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="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="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="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-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-111" name="__codelineno-3-111" href="#__codelineno-3-111"></a><span class="sx">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-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-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-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-116" name="__codelineno-3-116" href="#__codelineno-3-116"></a><span class="sx">nico.run(</span>
<a id="__codelineno-3-117" name="__codelineno-3-117" href="#__codelineno-3-117"></a><span class="sx"> proc() =</span>
<a id="__codelineno-3-118" name="__codelineno-3-118" href="#__codelineno-3-118"></a><span class="sx"> discard</span>
<a id="__codelineno-3-119" name="__codelineno-3-119" href="#__codelineno-3-119"></a><span class="w"> </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-121" name="__codelineno-3-121" href="#__codelineno-3-121"></a><span class="sx"> game.update(dt)</span>
<a id="__codelineno-3-122" name="__codelineno-3-122" href="#__codelineno-3-122"></a><span class="sx"> ,</span>
<a id="__codelineno-3-123" name="__codelineno-3-123" href="#__codelineno-3-123"></a><span class="sx"> proc() =</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-125" name="__codelineno-3-125" href="#__codelineno-3-125"></a><span class="sx"> ,</span>
<a id="__codelineno-3-126" name="__codelineno-3-126" href="#__codelineno-3-126"></a><span class="sx">)</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-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="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="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="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="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="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="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="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><span class="p">,</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="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="w"> </span><span class="p">,</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="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="w"> </span><span class="p">,</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="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>
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>