跳到主要内容

TON 分布式哈希表(DHT)服务

实现:

概览

类 Kademlia 的分布式哈希表(DHT)在 TON 的网络部分扮演着至关重要的角色,用于定位网络中的其他节点。

TON DHT 的键是简单的 256 位整数。在大多数情况下,它们是作为 TL-序列化对象的 SHA256 计算得出。

这些 256 位键所分配的值本质上是长度有限的任意字节串。这样的字节串的解释由相应键的原像决定; 通常情况下,查找键的节点和存储键的节点都知道这一点。

在最简单的情况下,键代表某个节点的 ADNL 地址,值可以是其 IP 地址和端口。

TON DHT 的键值映射保存在 DHT 节点上。

DHT 节点

每个 DHT 节点都有一个 256 位的 DHT 地址。与 ADNL 地址不同,DHT 地址不应该太频繁地更改,否则其他节点将无法定位它们正在寻找的键。

预计键 K 的值将存储在与 K 最近的 S 个 Kademlia 节点上。

Kademlia 距离 = 256 位键 XOR 256 位 DHT 节点地址(与地理位置无关)。

S 是一个小参数,例如 S = 7,用于提高 DHT 的可靠性(如果我们只在一个节点上保存键,即最接近 K 的那个,如果那个单个节点离线,那个键的值将会丢失)。

Kademlia 路由表

任何参与 DHT 的节点通常都会维护一个 Kademlia 路由表。

它包含编号从 0 到 255 的 256 个桶。第 i 个桶将包含一些已知节点的信息(固定数量的“最佳”节点和可能的一些额外候选节点),这些节点与节点的地址 a 的 Kademlia 距离在 2^i2^(i+1) − 1 之间。

这些信息包括它们的 DHT 地址、IP 地址和 UDP 端口,以及一些可用性信息,例如最后一次 ping 的时间和延迟。

当 Kademlia 节点因某些查询而了解到任何其他 Kademlia 节点时,它会将其放入其路由表的适当的桶中,首先将其作为候选者。然后,如果该桶中的一些“最佳”节点故障(例如,长时间不响应 ping 查询),它们可以被这些候选者中的一些替换。通过这种方式,Kademlia 路由表保持着填充状态。

键值对

可以在 TON DHT 中添加和更新键值对。

“更新规则”可能有所不同。在某些情况下,它们简单地允许用新值替换旧值,前提是新值是由所有者/创建者签名(签名必须作为值的一部分保留,以便稍后由其他节点在获取此键的值后进行检查)。 在其他情况下,旧值以某种方式影响新值。例如,它可以包含一个序列号,只有当新序列号更大时(为了防止重放攻击)才覆盖旧值。

TON DHT 不仅用于存储 ADNL 节点的 IP 地址,还用于其他目的 - 它可以存储特定 TON 存储种子的节点地址列表、包含在覆盖子网络中的节点地址列表、TON 服务的 ADNL 地址或 TON 区块链账户的 ADNL 地址等。

信息

更多关于 TON DHT 的信息,请参阅 DHT 这篇文章,或阅读 TON 白皮书 的第 3.2 章。