DHT messages these messages can be either wrapped in a LIDM message or sent anonymously over a path This document is currently out of date (probably) find introduction message (FIM) variant 1: recursively find an IS by SA { A: "F", I: 0 or 1 if iterative request, S: "<32 bytes SA>", T: transaction_id_uint64, V: 0 } variant 2: recursively find many IS in a tag { A: "F", E: "", I: 0 or 1 if iterative request, N: "<16 bytes topic tag>", T: transaction_id_uint64, V: 0 } exclude adding service addresses in E if present got introduction message (GIM) sent in reply to FIM and PIM { A: "G", I: [IS, IS, IS, ...], T: transaction_id_uint64, V: 0, } The I value MUST NOT contain more than 8 IS. The I value is either 1 or 0 IS long for PIM and FIM variant 1. publish introduction message (PIM) publish one IS to the DHT. version 0 uses the SA of the IS as the keyspace location. in the future the location will be determined by the dht kdf which uses a shared random source to obfuscate keyspace location. R is currently set to 0 by the sender. { A: "I", I: IS, R: r_counter, S: optional member 0 for immediate store otherwise non zero, T: transaction_id_uint64, V: 0 } if R is greater than 0, do a random walk, otherwise if we are closer to the SA of the IS than anyone else we know in the DHT store the IS for later lookup. As of protocol version 0, R is always 0. If S is provided store the IS for later lookup unconditionally, decrement S by 1 and forward to dht peer who is next closest to the SA of the IS. If S is greater than 3, don't store and discard this message. find router contact message (FRCM) find a router by long term RC.k public key { A: "R", E: 0 or 1 if exploritory lookup, I: 0 or 1 if iterative lookup, K: "<32 byte public key of router>", T: transaction_id_uint64, V: 0 } TODO: document me got router contact message (GRCM) R is a list containing a single RC if found or is an empty list if not found sent in reply to FRCM only { A: "S", R: [RC], T: transaction_id_uint64, V: 0 } in response to an exploritory FRCM if the target router is not found the form { A: "S", N: [list, of, router, publickeys, near, target], R: [], T: transaction_id_uint64, V: 0 }