Kademlia 假设每个节点都分配了一个与其网络地址不同的 Swarm 地址。通过计算前缀位(prefix bits)的数值中两个 Swarm 地址的共同值,我们可以定义它们的接近度。彼此最接近的节点们将形成一个完全连通的邻域(neighbourhood)。此外,每个节点连接到来自每个离散邻近类(discrete proximity class)的多个对等节点。
由此产生的拓扑结构保证了中继(relaying)在每次信息跃迁中至少将消息向其预期目的地移近一步。这种技术使消息能够在任意两个节点之间路由,即使这两个节点之间不保持直接连接。传递消息所需的跃迁数上限是节点总数的对数,这样即便在一个极其庞大的网络中,也能确保任意两个节点始终能够相互联系。 块和存储Swarm 中的标准存储单元称为块(chunk)。块最多由 4 千字节的数据组成,并且附有一个地址。由于块的地址与节点的地址来自同一地址空间,因此可以计算它们的接近度。Swarm 的存储方案声明每个块都由节点存储,其地址接近块本身的地址。 为了方便数据的保密性,块可以在填充到 4 千字节后进行加密,使得没有密钥的人无法将其与其它随机数据进行区分。即使对于未加密的块,节点运营者也无法轻易确定每个块来自于哪些内容。由于 Swarm 节点无法自己选择存储、加密哪些数据块,这种来源的模糊性以及元数据的无法泄露都为它们提供了有效的保护,使它们免于承担与其所存储内容相关的责任。 为了将块插入到 Swarm 中,节点通过同步推送协议(push-sync protocol)将区块进行转送,直到到达它所属的邻域。然后,块的存储确认函将沿着相同的路径被传回。想要检索一个块,只需使用检索协议,将具有块地址的请求路由到相关邻域。如果途中的任何节点在其本地存有相应的块,则会将其以响应的形式发回。 节点们使用同步回送协议(pull-sync protocol)持续同步其块存储。这保证了每个邻域都冗余地存储属于其邻域的全部块。这种冗余增加了数据传输的弹性,在某邻域中的一些节点无法访问的情况下也能维持块的可用性。同步协议还确保邻域的存储内容在节点离线和新节点加入网络时能够保持一致。 (责任编辑:admin) |