我知道(理论上)数据是如何存储在 DHT 中的。但是,我不确定如何更新与密钥关联的数据。这可能吗?此外,如何在 DHT 中处理冲突。
2 回答
DHT 简单地定义put(key,value)
和get(key)
操作,各种 DHT 算法的核心围绕如何定位负责特定密钥的节点。
这些节点对已经存储的值的传入put
请求执行的操作很大程度上取决于 DHT 网络的目的和实现,而不是算法本身。
例如,一个节点可能会选择给所有传入的值加上时间戳,并返回带有多个单独的时间戳问题的列表。或者它可能会返回还包含每个值的源地址的列表。或者他们可能只是覆盖存储的值。
如果密钥与值或源 ID 中的签名之间存在某种关系或类似的东西,您可以将足够的智能放入节点中以加密方式验证数据,从而允许它们通过替换为每个密钥保留单个规范值旧数据。
在 bittorrent 的 DHT 的情况下,你不会想要那个。许多不同的 bittorrent 对等点向来自不同源地址的单个密钥宣布它们的存在。因此,节点实际上存储了唯一的<key,IP,port>
元组,<IP,port>
可以将其视为值。这意味着它将在每次查找时返回 IP 和端口列表。由于 DHT 将有多个节点负责一个密钥,因此您实际上将有K(桶大小)节点响应不同的列表。
TL;DR:它依赖于实现
有可能的。我研究了糕点 dht。可以更改存储在给定密钥下的数据,但糕点开发人员建议不要这样做,因为它可能会产生令人讨厌的副作用,主要是复制存储在其他节点上的已更改数据。(请参阅 freepastrys 主页上的常见问题解答)。
但是,我不确定它会如何影响其他 dhts,例如和弦或挂毯。
关于冲突,我也只有糕点的经验。如果您尝试将数据存储在已使用的键下,则会引发异常。