<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
    <title>Athena&#x27;s Parthenon - Rust</title>
    <subtitle>Athena&#x27;s Parthenon</subtitle>
    <link rel="self" type="application/atom+xml" href="https://parthen.online/topics/rust/atom.xml"/>
    <link rel="alternate" type="text/html" href="https://parthen.online"/>
    <generator uri="https://www.getzola.org/">Zola</generator>
    <updated>2026-05-15T00:00:00+00:00</updated>
    <id>https://parthen.online/topics/rust/atom.xml</id>
    <entry xml:lang="en">
        <title>Rust Language Model Usage Policy (Suggested)</title>
        <published>2026-05-15T00:00:00+00:00</published>
        <updated>2026-05-15T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Athena
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://parthen.online/notes/rust-llm-rfc/"/>
        <id>https://parthen.online/notes/rust-llm-rfc/</id>
        
        <content type="html" xml:base="https://parthen.online/notes/rust-llm-rfc/">&lt;p&gt;The following is a draft I wrote with what I would like to see in favor of the policy
laid out in &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;rust-lang&#x2F;rust-forge&#x2F;pull&#x2F;1040&quot;&gt;github&#x2F;rust-lang&#x2F;rust-forge#1040&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;overview&quot;&gt;Overview&lt;&#x2F;h2&gt;
&lt;p&gt;This RFC proposes a policy regarding the contribution of content generated by
language models (a.k.a. LLMs, chatbots, or agents, including but not limited to
Claude, ChatGPT, DeepSeek and others) to rust-lang&#x2F;rust. This policy was written
with the aim of being concise and clearly understandable, so that there is a
minimum of confusion as to how the policy applies to a given situation. First,
we will state the policy, consider enforcement, and give a brief overview of the
reasoning behind it.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;the-policy&quot;&gt;The Policy&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;Content generated by a language model may not be contributed to rust-lang&#x2F;rust.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;&quot;Lenguage model&quot; here means any program or service which outputs text in
response to a generic natural language directive or completes substantial
portions of an incomplete document or code unit. Note that dedicated translation
and grammar assistance tools are not covered by this description, though in this
case we ask that you disclose usage of these tools.&lt;&#x2F;p&gt;
&lt;p&gt;&quot;Contributed&quot; here means submitted as code or documentation as part of commits,
commit messages, PR descriptions, issue descriptions, or comments on PRs or
issues.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;enforcement&quot;&gt;Enforcement&lt;&#x2F;h2&gt;
&lt;p&gt;Verification of &quot;LLM generated content&quot; is up to moderation. Do not make public
accusations of language-model contributed content; if you have concerns report
it to the mods and move on. Each contributor is resonsible for ensuring the
content they contribute follows this policy, in the same way that they must
be sure that they do not submit content from, e.g. proprietary code from an
employer, and in a similar way good faith should generally be assumed.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;reasoning&quot;&gt;Reasoning&lt;&#x2F;h2&gt;
&lt;p&gt;This policy was written to be clear and concise while rectifying issues present
in other policies, notably overreach. There is no way in which this policy
could dicatate private usage of language models by contributors; it would be
unenforceable if nothing else.&lt;&#x2F;p&gt;
&lt;p&gt;Language model generated content is disallowed because current implementations
of such technology carry:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;Severe and well-documented ethical concerns around their production
and operation, especially with regards to their environmental impact, use of
copyrighted material, abusive work practices, psychological effect on users,
and bias. In order to maintain a welcoming community for all in accordance
with the Rust Code of Conduct, particularly those who have been directly
harmed by the production or operation of these technologies, we disallow
language model generated content.&lt;&#x2F;li&gt;
&lt;li&gt;Deep uncertainty with regard to copyright status of output. In order to
protect the Rust project as a whole, we disallow language model generated
content.&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Java&#x27;s Functional Interfaces for Rust&#x2F;UniFFI</title>
        <published>2026-04-26T00:00:00+00:00</published>
        <updated>2026-04-26T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Athena
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://parthen.online/notes/rust-uniffi-functional-interface/"/>
        <id>https://parthen.online/notes/rust-uniffi-functional-interface/</id>
        
        <content type="html" xml:base="https://parthen.online/notes/rust-uniffi-functional-interface/">&lt;h2 id=&quot;functional-interfaces&quot;&gt;Functional Interfaces&lt;&#x2F;h2&gt;
&lt;p&gt;UniFFI has good support for callback interfaces, allowing calling code to supply its own logic
to be called from Rust. How to make this work on the other-language side was relatively obvious
to me: you just implement the interface. However, how to make this smooth in Rust took a moment to
figure out, so I figured I&#x27;d make a note.&lt;&#x2F;p&gt;
&lt;p&gt;A UniFFI callback interface looks (using the proc macros) like this:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #EBDBB2); background-color: light-dark(#FFFFFF, #1D2021);&quot;&gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;[&lt;&#x2F;span&gt;&lt;span&gt;uniffi&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #8EC07C);&quot;&gt;::&lt;&#x2F;span&gt;&lt;span&gt;export&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span&gt;callback_interface&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #FB4934);&quot;&gt;pub&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #FE8019);&quot;&gt; trait&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #FABD2F);&quot;&gt; MyCallback&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #8EC07C);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #FABD2F);&quot;&gt; Send&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #8EC07C);&quot;&gt; +&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #FABD2F);&quot;&gt; Sync&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #FB4934);&quot;&gt;    fn&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #FABD2F);&quot;&gt; consume&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #8EC07C);&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #83A598);&quot;&gt;self&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #83A598);&quot;&gt; value&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #8EC07C);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #FABD2F);&quot;&gt; MyValue&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;(where &lt;code&gt;MyValue&lt;&#x2F;code&gt; has &lt;code&gt;#[uniffi::export]&lt;&#x2F;code&gt; as well)&lt;&#x2F;p&gt;
&lt;p&gt;and some function which takes it (boxed, because we can&#x27;t know the implementing type at compile
time, so it&#x27;s gotta be a &lt;code&gt;dyn&lt;&#x2F;code&gt; rather than being able to use a generic&#x2F;&lt;code&gt;impl Trait&lt;&#x2F;code&gt;) like so:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #EBDBB2); background-color: light-dark(#FFFFFF, #1D2021);&quot;&gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;[&lt;&#x2F;span&gt;&lt;span&gt;uniffi&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #8EC07C);&quot;&gt;::&lt;&#x2F;span&gt;&lt;span&gt;export&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #FB4934);&quot;&gt;pub&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #FB4934);&quot;&gt; fn&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #FABD2F);&quot;&gt; do_it&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #83A598);&quot;&gt;doer&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #8EC07C);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #FABD2F);&quot;&gt; Box&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #FB4934);&quot;&gt;dyn&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #FABD2F);&quot;&gt; MyCallback&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#24292E, #83A598);&quot;&gt;  doer&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #8EC07C);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #FABD2F);&quot;&gt;consume&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #83A598);&quot;&gt;some_value&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Which is all well and good. But using this from Rust is a bit of a pain - there&#x27;s just one method,
so it should be possible to just yunk in a closure. But if you wanna do that you gotta tell Rust
that&#x27;s okay, it doesn&#x27;t infer it like Java&#x27;s functional interfaces. Here&#x27;s how you do that:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #EBDBB2); background-color: light-dark(#FFFFFF, #1D2021);&quot;&gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #FB4934);&quot;&gt;impl&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #FABD2F);&quot;&gt;T&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #FABD2F);&quot;&gt; MyCallback&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #FB4934);&quot;&gt; for&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #FABD2F);&quot;&gt; T&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #FB4934);&quot;&gt;where&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #FABD2F);&quot;&gt;    T&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #8EC07C);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #FABD2F);&quot;&gt; Fn&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #FABD2F);&quot;&gt;MyValue&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #8EC07C);&quot;&gt; -&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt; (&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #8EC07C);&quot;&gt; +&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #FABD2F);&quot;&gt; Send&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #8EC07C);&quot;&gt; +&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #FABD2F);&quot;&gt; Sync&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #FB4934);&quot;&gt;  fn&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #FABD2F);&quot;&gt; consume&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #8EC07C);&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #83A598);&quot;&gt;self&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #83A598);&quot;&gt; value&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #8EC07C);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #FABD2F);&quot;&gt; MyValue&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#005CC5, #83A598);&quot;&gt;    self&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #83A598);&quot;&gt;value&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;  }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Getting the syntax right on this took a sec but it&#x27;s fairly self-explanatory if you&#x27;re used to Rust.
I also went down a road of trying to use &lt;code&gt;impl From&lt;&#x2F;code&gt;, which doesn&#x27;t really work out (try it
yourself if you want to know why). Anyway, now you can call &lt;code&gt;do_it&lt;&#x2F;code&gt; from Rust and give it a boxed,
but otherwise plain, closure:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #EBDBB2); background-color: light-dark(#FFFFFF, #1D2021);&quot;&gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #FABD2F);&quot;&gt;do_it&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #FABD2F);&quot;&gt;Box&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #8EC07C);&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #FABD2F);&quot;&gt;new&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #FB4934);&quot;&gt;|&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #83A598);&quot;&gt;_it&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #FB4934);&quot;&gt;|&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt; {&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Veilid DHT Usage</title>
        <published>2026-03-27T00:00:00+00:00</published>
        <updated>2026-05-11T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Athena
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://parthen.online/notes/veilid-dht-example/"/>
        <id>https://parthen.online/notes/veilid-dht-example/</id>
        
        <content type="html" xml:base="https://parthen.online/notes/veilid-dht-example/">&lt;p&gt;&lt;em&gt;Written for &lt;code&gt;veilid_core&lt;&#x2F;code&gt; version 0.5.3.&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;This page walks through a unit test I wrote to check my own understanding of
how to use the Veilid DHT. This is just about the simplest possible usage in
demonstrating a put and a get, none of the fancy watch stuff. Walking through
section by section:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #EBDBB2); background-color: light-dark(#FFFFFF, #1D2021);&quot;&gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;[&lt;&#x2F;span&gt;&lt;span&gt;tokio&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #8EC07C);&quot;&gt;::&lt;&#x2F;span&gt;&lt;span&gt;test&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #FB4934);&quot;&gt;async&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #FB4934);&quot;&gt; fn&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #FABD2F);&quot;&gt; basic_dht_write_and_get&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #FE8019);&quot;&gt;    let&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #83A598);&quot;&gt; done&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #8EC07C);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #FABD2F);&quot;&gt; CancellationToken&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #8EC07C);&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #FABD2F);&quot;&gt;new&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #FE8019);&quot;&gt;    let&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #83A598);&quot;&gt; alice_done&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #8EC07C);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #83A598);&quot;&gt; done&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #8EC07C);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #FABD2F);&quot;&gt;child_token&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #FE8019);&quot;&gt;    let&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt; (&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #83A598);&quot;&gt;dht_key_in&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #83A598);&quot;&gt; dht_key_out&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #8EC07C);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #FABD2F);&quot;&gt; tokio&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #8EC07C);&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #FABD2F);&quot;&gt;sync&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #8EC07C);&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #FABD2F);&quot;&gt;oneshot&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #8EC07C);&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #FABD2F);&quot;&gt;channel&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #FE8019);&quot;&gt;    let&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #83A598);&quot;&gt; alice_task&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #8EC07C);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #FABD2F);&quot;&gt; tokio&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #8EC07C);&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #FABD2F);&quot;&gt;spawn&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #FB4934);&quot;&gt;async&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #FB4934);&quot;&gt; move&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The &lt;code&gt;CancellationToken&lt;&#x2F;code&gt; and associated &lt;code&gt;child_token&lt;&#x2F;code&gt; are from &lt;code&gt;tokio_util&lt;&#x2F;code&gt;
and is coincidental; it could be replaced with another oneshot channel if so
desired. The &lt;code&gt;oneshot&lt;&#x2F;code&gt; channel is used to communicate the DHT record key from
Alice to Bob. Each Alice and Bob are assigned individual Tokio tasks to ensure
that they are otherwise isolated and allow them to connect to the Veilid network
concurrently.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #EBDBB2); background-color: light-dark(#FFFFFF, #1D2021);&quot;&gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #FE8019);&quot;&gt;        let&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #83A598);&quot;&gt; alice&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #8EC07C);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #FABD2F);&quot;&gt; create_and_attach_veilid_node&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#032F62, #A89984);&quot;&gt;                        &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #B8BB26);&quot;&gt;alice&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #A89984);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #8EC07C);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #FABD2F);&quot;&gt;to_string&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #FABD2F);&quot;&gt;                        Arc&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #8EC07C);&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #FABD2F);&quot;&gt;new&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #FB4934);&quot;&gt;|&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #83A598);&quot;&gt;_update&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #FB4934);&quot;&gt;|&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt; (&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;                    )&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #8EC07C);&quot;&gt;            .&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #FB4934);&quot;&gt;await&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #8EC07C);&quot;&gt;            .&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #FABD2F);&quot;&gt;expect&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #A89984);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #B8BB26);&quot;&gt;failed to start alice node&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #A89984);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #FABD2F);&quot;&gt;        println!&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #A89984);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #B8BB26);&quot;&gt;alice ready&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #A89984);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Each Alice and Bob get their own Veilid node in their own namespace. This is
a fairly easy way to do integration tests as far as I can tell, without having
to actually spin up separate processes to create multiple nodes. It &lt;em&gt;is&lt;&#x2F;em&gt; fairly
expensive though, so if you wanna do this in tests for an actual application you
should probably share those nodes among tests.&lt;&#x2F;p&gt;
&lt;p&gt;I&#x27;ve omitted the definition of &lt;code&gt;create_and_attach_node&lt;&#x2F;code&gt; for
brevity; it calls &lt;code&gt;veilid_core::api_startup&lt;&#x2F;code&gt; and spin-waits until
&lt;code&gt;veilid_api.get_state().attachment.public_internet_ready&lt;&#x2F;code&gt; is &lt;code&gt;true&lt;&#x2F;code&gt;. A real
applicaton would definitely want to be more sophisticated here, but it works
for tests.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #EBDBB2); background-color: light-dark(#FFFFFF, #1D2021);&quot;&gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #FE8019);&quot;&gt;        let&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #83A598);&quot;&gt; crypto_step&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #8EC07C);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #83A598);&quot;&gt; alice&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #8EC07C);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #FABD2F);&quot;&gt;crypto&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #8EC07C);&quot;&gt;            .&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #FABD2F);&quot;&gt;expect&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #A89984);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #B8BB26);&quot;&gt;failed to get alice&amp;#39;s cryptosystem&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #A89984);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #FE8019);&quot;&gt;        let&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #83A598);&quot;&gt; cryptosystem&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #8EC07C);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #83A598);&quot;&gt; crypto_step&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #8EC07C);&quot;&gt;            .&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #FABD2F);&quot;&gt;get&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #D3869B);&quot;&gt;CRYPTO_KIND_VLD0&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #8EC07C);&quot;&gt;            .&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #FABD2F);&quot;&gt;expect&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #A89984);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #B8BB26);&quot;&gt;failed to get alice&amp;#39;s vld0 cryptosystem&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #A89984);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #FE8019);&quot;&gt;        let&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #83A598);&quot;&gt; alice_record_keypair&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #8EC07C);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #83A598);&quot;&gt; cryptosystem&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #8EC07C);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #FABD2F);&quot;&gt;generate_keypair&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #FE8019);&quot;&gt;        let&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #83A598);&quot;&gt; alice_rc&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #8EC07C);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #83A598);&quot;&gt; alice&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #8EC07C);&quot;&gt;            .&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #FABD2F);&quot;&gt;routing_context&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #8EC07C);&quot;&gt;            .&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #FABD2F);&quot;&gt;expect&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #A89984);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #B8BB26);&quot;&gt;failed to get alice&amp;#39;s routing context&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #A89984);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #FE8019);&quot;&gt;        let&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #83A598);&quot;&gt; dht_record&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #8EC07C);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #83A598);&quot;&gt; alice_rc&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #8EC07C);&quot;&gt;            .&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #FABD2F);&quot;&gt;create_dht_record&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#005CC5, #D3869B);&quot;&gt;                CRYPTO_KIND_VLD0&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #FABD2F);&quot;&gt;                veilid_core&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #8EC07C);&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #FABD2F);&quot;&gt;DHTSchema&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #8EC07C);&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #D3869B);&quot;&gt;DFLT&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #FABD2F);&quot;&gt;                    DHTSchemaDFLT&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #8EC07C);&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #FABD2F);&quot;&gt;new&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #D3869B);&quot;&gt;6&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #8EC07C);&quot;&gt;                        .&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #FABD2F);&quot;&gt;expect&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #A89984);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #B8BB26);&quot;&gt;failed to make alice&amp;#39;s schema&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #A89984);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;                )&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #FABD2F);&quot;&gt;                Some&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #83A598);&quot;&gt;alice_record_keypair&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;            )&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #8EC07C);&quot;&gt;            .&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #FB4934);&quot;&gt;await&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #FABD2F);&quot;&gt;        assert!&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #83A598);&quot;&gt;dht_record&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #8EC07C);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #FABD2F);&quot;&gt;is_ok&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #FABD2F);&quot;&gt;        println!&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #A89984);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #B8BB26);&quot;&gt;dht record created&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #A89984);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Here I create the owning &lt;code&gt;KeyPair&lt;&#x2F;code&gt; manually because I wanted to make sure I knew
how that pathway works. It&#x27;s a huge pain in the butt to get a &lt;code&gt;CryptoSystem&lt;&#x2F;code&gt;
reference (and even then it&#x27;s some weird guard type) and the compiler complains
for reasons I haven&#x27;t taken the time to grok without &lt;code&gt;crypto_step&lt;&#x2F;code&gt; being an
intermediate variable. Anyway, once we get ahold of the cryptosystem it&#x27;s quite
straightforward to make a keypair and turn it into a DHT record.&lt;&#x2F;p&gt;
&lt;p&gt;This gets you a &lt;code&gt;RecordKey&lt;&#x2F;code&gt; which includes a &lt;code&gt;SharedSecret&lt;&#x2F;code&gt;, which
is transparently used to encrypt &amp;amp; decrypt the value data. You
can get a &lt;code&gt;RecordKey&lt;&#x2F;code&gt; without one of those, if you like, by using
&lt;code&gt;VeilidAPI.get_dht_record_key&lt;&#x2F;code&gt;, which deterministically generates a &lt;code&gt;RecordKey&lt;&#x2F;code&gt;
from the public key of the owner &lt;code&gt;KeyPair&lt;&#x2F;code&gt;, the schema, and (optionally) a
&lt;code&gt;SharedSecret&lt;&#x2F;code&gt;, but does &lt;em&gt;not&lt;&#x2F;em&gt; open or create an actual DHT record, just the key
used to identify the record. In order to do this, you will need to create the
record, then close it, and re-open it using a &lt;code&gt;RecordKey&lt;&#x2F;code&gt; created via
&lt;code&gt;get_dht_record_key&lt;&#x2F;code&gt; using the key (or not) of your choice.&lt;&#x2F;p&gt;
&lt;p&gt;I used a DFLT schema (meaning only the owner can write to it, as opposed to
SMPL which means subkeys can be delegated to other writer keypairs) with an
arbitrarily chosen 6 subkeys. As far as I can tell, with a DFLT schema, subkeys
are just a way to organize the data stored in the DHT record, though each has
a maximum size considerably smaller than the overall DHT record size limit, so
multiple subkeys &lt;em&gt;must&lt;&#x2F;em&gt; be used in order to store the maximum amount of data in
each DHT record.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #EBDBB2); background-color: light-dark(#FFFFFF, #1D2021);&quot;&gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #FE8019);&quot;&gt;        let&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #83A598);&quot;&gt; record_key&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #8EC07C);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #83A598);&quot;&gt; dht_record&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #8EC07C);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #FABD2F);&quot;&gt;unwrap&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #8EC07C);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #FABD2F);&quot;&gt;key&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #FABD2F);&quot;&gt;        println!&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #A89984);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #B8BB26);&quot;&gt;record enc key&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #A89984);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #FE8019);&quot;&gt;        let&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #83A598);&quot;&gt; value_set_result&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #8EC07C);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #83A598);&quot;&gt; alice_rc&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #8EC07C);&quot;&gt;            .&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #FABD2F);&quot;&gt;set_dht_value&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#24292E, #83A598);&quot;&gt;                record_key&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #8EC07C);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #FABD2F);&quot;&gt;clone&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#005CC5, #D3869B);&quot;&gt;                0&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #FABD2F);&quot;&gt;                vec!&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #D3869B);&quot;&gt;42&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #D3869B);&quot;&gt; 42&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #D3869B);&quot;&gt; 42&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;]&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #FABD2F);&quot;&gt;                None&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;            )&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #8EC07C);&quot;&gt;            .&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #FB4934);&quot;&gt;await&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #FABD2F);&quot;&gt;        assert!&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #83A598);&quot;&gt;value_set_result&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #8EC07C);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #FABD2F);&quot;&gt;is_ok&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #FABD2F);&quot;&gt;        println!&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #A89984);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #B8BB26);&quot;&gt;dht value set&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #A89984);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;And once we have the record, we can set a DHT value, in this case an array of
&lt;code&gt;42&lt;&#x2F;code&gt; three times in a row to subkey &lt;code&gt;0&lt;&#x2F;code&gt;. Easy enough.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #EBDBB2); background-color: light-dark(#FFFFFF, #1D2021);&quot;&gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #FE8019);&quot;&gt;        let&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #83A598);&quot;&gt; send_result&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #8EC07C);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #83A598);&quot;&gt; dht_key_in&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #8EC07C);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #FABD2F);&quot;&gt;send&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #83A598);&quot;&gt;record_key&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #FABD2F);&quot;&gt;        assert!&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #83A598);&quot;&gt;send_result&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #8EC07C);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #FABD2F);&quot;&gt;is_ok&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #FABD2F);&quot;&gt;        tokio&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #8EC07C);&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #FABD2F);&quot;&gt;select!&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#24292E, #83A598);&quot;&gt;            _&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #8EC07C);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #83A598);&quot;&gt; alice_done&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #8EC07C);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #FABD2F);&quot;&gt;cancelled&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #8EC07C);&quot;&gt; =&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#24292E, #83A598);&quot;&gt;                alice&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #8EC07C);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #FABD2F);&quot;&gt;shutdown&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #8EC07C);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #FB4934);&quot;&gt;await&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;            }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;        }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;    }&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Here we send the record key to bob and commence waiting for notice that we&#x27;ve
concluded our business and should terminate Alice&#x27;s node. I don&#x27;t know how long
the DHT record would be available if Alice&#x27;s node just went offline immediately
after publishing the value; possibly some amount of time but I have heard the
devs say the DHT isn&#x27;t intended for storage even though some caching may happen.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #EBDBB2); background-color: light-dark(#FFFFFF, #1D2021);&quot;&gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #FE8019);&quot;&gt;    let&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #83A598);&quot;&gt; bob_task&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #8EC07C);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #FABD2F);&quot;&gt; tokio&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #8EC07C);&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #FABD2F);&quot;&gt;spawn&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #FB4934);&quot;&gt;async&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #FB4934);&quot;&gt; move&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #FE8019);&quot;&gt;        let&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #83A598);&quot;&gt; bob&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #8EC07C);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #FABD2F);&quot;&gt; create_and_attach_veilid_node&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#032F62, #A89984);&quot;&gt;                      &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #B8BB26);&quot;&gt;bob&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #A89984);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #8EC07C);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #FABD2F);&quot;&gt;to_string&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #FABD2F);&quot;&gt;                      Arc&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #8EC07C);&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #FABD2F);&quot;&gt;new&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #FB4934);&quot;&gt;|&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #83A598);&quot;&gt;_update&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #FB4934);&quot;&gt;|&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt; (&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;                  )&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #8EC07C);&quot;&gt;            .&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #FB4934);&quot;&gt;await&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #8EC07C);&quot;&gt;            .&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #FABD2F);&quot;&gt;expect&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #A89984);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #B8BB26);&quot;&gt;failed to start bob node&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #A89984);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #FE8019);&quot;&gt;        let&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #83A598);&quot;&gt; bob_rc&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #8EC07C);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #83A598);&quot;&gt; bob&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #8EC07C);&quot;&gt;            .&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #FABD2F);&quot;&gt;routing_context&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #8EC07C);&quot;&gt;            .&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #FABD2F);&quot;&gt;expect&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #A89984);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #B8BB26);&quot;&gt;failed to get bob&amp;#39;s routing context&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #A89984);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #FABD2F);&quot;&gt;        println!&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #A89984);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #B8BB26);&quot;&gt;awaiting from record key from alice&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #A89984);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #FE8019);&quot;&gt;        let&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #83A598);&quot;&gt; record_key&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #8EC07C);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #83A598);&quot;&gt; dht_key_out&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #8EC07C);&quot;&gt;            .&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #FB4934);&quot;&gt;await&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #8EC07C);&quot;&gt;            .&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #FABD2F);&quot;&gt;expect&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #A89984);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #B8BB26);&quot;&gt;failed to get record from from alice&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #A89984);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Over in Bob&#x27;s task, start up Bob&#x27;s node and wait for the DHT record key, just like it says.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #EBDBB2); background-color: light-dark(#FFFFFF, #1D2021);&quot;&gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #FE8019);&quot;&gt;        let&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #83A598);&quot;&gt; opened_dht_rec&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #8EC07C);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #83A598);&quot;&gt; bob_rc&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #8EC07C);&quot;&gt;            .&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #FABD2F);&quot;&gt;open_dht_record&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #83A598);&quot;&gt;record_key&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #8EC07C);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #FABD2F);&quot;&gt;clone&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #FABD2F);&quot;&gt; None&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #8EC07C);&quot;&gt;            .&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #FB4934);&quot;&gt;await&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #FABD2F);&quot;&gt;        println!&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #A89984);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #B8BB26);&quot;&gt;opened dht value&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #A89984);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #FABD2F);&quot;&gt;        assert!&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #83A598);&quot;&gt;opened_dht_rec&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #8EC07C);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #FABD2F);&quot;&gt;is_ok&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #FE8019);&quot;&gt;        let&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #83A598);&quot;&gt; value_result&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #8EC07C);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #83A598);&quot;&gt; bob_rc&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #8EC07C);&quot;&gt;            .&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #FABD2F);&quot;&gt;get_dht_value&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #83A598);&quot;&gt;record_key&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #D3869B);&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #D3869B);&quot;&gt; true&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #8EC07C);&quot;&gt;            .&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #FB4934);&quot;&gt;await&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #FABD2F);&quot;&gt;        println!&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #A89984);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #B8BB26);&quot;&gt;got dht value&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #A89984);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #FABD2F);&quot;&gt;        assert!&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #83A598);&quot;&gt;value_result&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #8EC07C);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #FABD2F);&quot;&gt;is_ok&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #FABD2F);&quot;&gt;        assert_eq!&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #83A598);&quot;&gt;value_result&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #8EC07C);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #FABD2F);&quot;&gt;unwrap&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #8EC07C);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #FABD2F);&quot;&gt;unwrap&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #8EC07C);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #FABD2F);&quot;&gt;data&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #FABD2F);&quot;&gt; vec!&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #D3869B);&quot;&gt;42&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #D3869B);&quot;&gt; 42&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #D3869B);&quot;&gt; 42&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;]&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Note that we must open the value before we try to get any of its subkeys. Trying
to get the value before opening it will result in an error.&lt;&#x2F;p&gt;
&lt;p&gt;The boolean (&lt;code&gt;true&lt;&#x2F;code&gt;, in this case) passed to &lt;code&gt;get_dht_value&lt;&#x2F;code&gt; is used to indicate
whether the value must be refreshed from the network - it &lt;em&gt;may&lt;&#x2F;em&gt; be fetched from
the network even if &lt;code&gt;false&lt;&#x2F;code&gt; is given here, but the network &lt;em&gt;will&lt;&#x2F;em&gt; be checked if
&lt;code&gt;true&lt;&#x2F;code&gt; is given.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #EBDBB2); background-color: light-dark(#FFFFFF, #1D2021);&quot;&gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#24292E, #83A598);&quot;&gt;        done&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #8EC07C);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #FABD2F);&quot;&gt;cancel&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#24292E, #83A598);&quot;&gt;        bob&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #8EC07C);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #FABD2F);&quot;&gt;shutdown&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #8EC07C);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #FB4934);&quot;&gt;await&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;    }&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #FE8019);&quot;&gt;    let&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt; (&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #83A598);&quot;&gt;alice_result&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #83A598);&quot;&gt; bob_result&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #8EC07C);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #FABD2F);&quot;&gt; join!&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #83A598);&quot;&gt;bob_task&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #83A598);&quot;&gt; alice_task&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #FABD2F);&quot;&gt;    assert!&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #83A598);&quot;&gt;alice_result&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #8EC07C);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #FABD2F);&quot;&gt;is_ok&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #FABD2F);&quot;&gt;    assert!&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #83A598);&quot;&gt;bob_result&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #8EC07C);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #FABD2F);&quot;&gt;is_ok&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#24292E, #A89984);&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;And then send the signal that everything is done, shut down bob&#x27;s node, and
(back in the main task) wait for both Alice and Bob&#x27;s task to finish (using
&lt;code&gt;join!&lt;&#x2F;code&gt; from the &lt;code&gt;futures&lt;&#x2F;code&gt; crate) before finishing out the test.&lt;&#x2F;p&gt;
</content>
        
    </entry>
</feed>
