3

我正在考虑实现一个 DHT,其中数据项通过将后继地址添加到存储的值来链接,如果每个节点可以具有以下三种有序状态之一:空 -> 数据 -> 数据和后继地址将所有对等方获得一致且正确的顺序?或者这里有可能永久分叉吗?

4

1 回答 1

4

原则上,在节点的一些限制和支持下是可能的。

要处理多个版本,您需要值版本控制。为了可靠地增加它们而不会发生冲突,您需要一个发起者。为确保只有一个发起者,您必须对数据进行签名。签名数据通常存储在从公钥派生的密钥下。因此,搜索节点要么必须以某种方式获取公钥,要么您将需要另一种间接方式来将人类可读的密钥解析为公钥。

DHT.put("keyword", Pubkey)
DHT.get("keyword") => List<Pubkey>

DHT.put(Pubkey, Tuple<Value, ForwardPointer, VersionNumber>, Pubkey, Signature)
DHT.get(Pubkey) => List<Tuple<Tuple<Value, ForwardPointer, VersionNumber>, Signature>>

请注意,第一个参数将始终被散列。另请注意,API 是不对称的,返回列表并为目标节点添加其他参数以进行处理和验证。

即存储节点必须做更多的工作,而不仅仅是“哑键值存储”

编辑:在您的特定情况下,您可能可以跳过版本号并使用前向指针的缺失/存在作为隐式版本增量。


原则上,您可以在 DHT 之上实现任何数据结构。您所需要的只是存储和指向其他键的指针。例如,一个列表既可以实现为改变其前向指针的可变节点,也可以实现为不可变节点+一个可变头指针。

对于一些更快的遍历排序树或跳过列表也可能值得考虑。

于 2015-01-21T12:44:35.930 回答