基于上述优点,我们设计了DHT的数据存储系统,在Chain33 P2P 网络中,我们实现了分布式存储,对于每一个区块只保存在部分节点上。我们把整个体统抽象出两种空间:资源空间和节点空间。资源空间就是所有节点保存的资源集合,节点空间就是所有节点的集合。对所有资源和节点分别进行编号,如把资源名称或内容用 Hash 函数变成一个数值(这也是 DHT 常用的一种方法),这样,每个资源就有对应的一个 ID,每个节点也有一个 ID,资源 ID 和节点 ID 之间建立起一种映射关系,比如,将资源 n 的所有索引信息存放到节点 n 上,那要搜索资源 n 时,只要找到节点 n 即可,从而就可以避免泛洪广播,能更快速而又准确地路由和定位数据。当然,在实际应用中,资源 ID 和节点 ID 之间是无法做到一一对应的,但因为 ID 都是数字,就存在大小关系或偏序关系等,基于这些关系就能建立两者的映射关系。这就是 DHT 的核心思想。DHT 算法在资源编号和节点编号上就是使用了分布式哈希表,使得资源空间和节点空间的编号有唯一性、均匀分布式等较好的性质,能够适合结构化分布式网络的要求。
由于每个节点需要针对本地持有的数据定期发出数据保存通知,因此通知消息的数量与本地数据数量成正比关系。如果节点持有数据数目变少,那么数据保存通知的消息数量也会变少。由此提出一种区块数据归档操作,将连续的 N 个区块打包成一个更大的归档数据,该归档数据作为一个整体存储于某些节点上。数据归档之后新节点同步历史区块时可以一次定位到1000个区块,而不需要每个区块都在全网进行一次路由查询,提高同步效率。