DHT(kademlia)是否能够可靠地存储价值链?
Is a DHT (kademlia) able to reliably store chains of values?
我正在考虑实现一个 DHT,其中数据项通过将后继地址添加到存储的值来链接,如果每个节点都可以具有以下三种有序状态之一:空 -> 数据 -> 数据和后继地址将所有同行得到一致和正确的顺序?还是永久分叉是可能的?
原则上,在节点的一些限制和支持下这是可能的。
要处理多个版本,您需要值版本控制。为了可靠地增加它们而不会发生冲突,您需要一个发起者。为确保单一发起者,您必须对数据进行签名。
签名数据通常存储在从 public 密钥派生的密钥下。因此,搜索节点要么必须以某种方式获取 public 键,要么您将需要另一种间接方式将人类可读的键解析为 public 键。
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 是非对称的,返回列表并添加额外参数供目标节点处理和验证。
即存储节点必须做的工作比 "dumb key-value storage"
多一点
编辑:在您的特定情况下,您可以跳过版本号并使用前向指针的 absence/presence 作为隐式版本增量。
原则上,您可以在 DHT 之上实现任何数据结构。您所需要的只是存储和指向其他键的指针。例如。一个列表既可以实现为可变节点,改变它们的前向指针,也可以实现为不可变节点 + 一个可变头指针。
对于一些更快的遍历排序树或跳过列表也可能值得考虑。
我正在考虑实现一个 DHT,其中数据项通过将后继地址添加到存储的值来链接,如果每个节点都可以具有以下三种有序状态之一:空 -> 数据 -> 数据和后继地址将所有同行得到一致和正确的顺序?还是永久分叉是可能的?
原则上,在节点的一些限制和支持下这是可能的。
要处理多个版本,您需要值版本控制。为了可靠地增加它们而不会发生冲突,您需要一个发起者。为确保单一发起者,您必须对数据进行签名。 签名数据通常存储在从 public 密钥派生的密钥下。因此,搜索节点要么必须以某种方式获取 public 键,要么您将需要另一种间接方式将人类可读的键解析为 public 键。
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 是非对称的,返回列表并添加额外参数供目标节点处理和验证。
即存储节点必须做的工作比 "dumb key-value storage"
多一点编辑:在您的特定情况下,您可以跳过版本号并使用前向指针的 absence/presence 作为隐式版本增量。
原则上,您可以在 DHT 之上实现任何数据结构。您所需要的只是存储和指向其他键的指针。例如。一个列表既可以实现为可变节点,改变它们的前向指针,也可以实现为不可变节点 + 一个可变头指针。
对于一些更快的遍历排序树或跳过列表也可能值得考虑。