1-语雀顶端.jpg

    在上一篇文章《Swarm的存储原理(上)》中,我们讲到了“块的分布式不可变存储”与“内容寻址块”,那么在这篇文章,我们将继续讲到Swarm存储原理的剩下几点。 Swarm的区块有两种类型,第一种就是内容寻址块,而第二种就是今天要讲的“单一拥有者区块”。


    • 三、单一拥有者区块
    1. 使用单个所有者块,用户可以将任意数据分配给一个地址,并用他们的数字签名证明块的完整性。地址计算为标识符和所有者的哈希值。块内容以由标识符、有效载荷和证明标识符和有效载荷关联的签名组成的结构呈现(见图 1)。<br />• 内容:

    – 标识符 – 32 字节任意标识符; – 签名 – 65 字节 (r,s, v)表示 EC 签名(32+32+1 字节); – 跨度 – uint64块跨度的 8 字节小端二进制; – 负载 – 最多 4096 字节的常规块数据。

    • 地址– 标识符+ 所有者帐户的Keccak256 哈希值。

    image.png
    图 1:单一所有者块。块内容由头和最多 4KB 的有效负载组成。最后一个头字段是 8 字节的跨度,就像在内容寻址块中一样。前两个标头字段提供完整性的单一所有者证明:标识符和签署标识符的签名以及跨度和有效负载的 BMT 哈希。地址是 id 和签名者帐户的哈希值。

    使用以下过程检查单个所有者块的有效性:

    1. 将块内容反序列化为标识符、签名和有效载荷的字段。
    2. 构造由标识符和有效载荷的 BMT 哈希组成的预期纯文本。
    3. 使用纯文本从签名中恢复所有者的地址。
    4. 根据块地址检查标识符和所有者(预期地址)的哈希值。
    1. 单一拥有者块提供将部分地址空间虚拟划分为与单一拥有者相关联的子空间。检查它们的有效性实际上是验证所有者是否具有对具有正确标识符的地址的写访问权限的身份验证。<br />正如有效载荷的跨度和长度所建议的那样,单个所有者块可以封装常规内容寻址块。任何人都可以简单地将常规块重新分配给标识符指定的子空间中的地址。<br />应该注意的是,单个所有者块的完整性概念比内容寻址块的情况要弱一些:毕竟,原则上,可以将任何有效载荷分配给标识符并对其进行签名。尽管如此,鉴于块只能由单个所有者(签名所需的私钥的)创建,因此期望唯一性保证是合理的,因为我们希望节点希望遵守应用程序协议以获得所需的结果。但是,如果私钥的所有者使用相同的标识符对两个不同的有效负载进行签名并将两个块上传到 Swarm,则网络的行为是不可预测的。可以在第 (3) 层采取措施来缓解这种情况,稍后将详细讨论。
    2. 对于两种类型的块,完整性与无冲突散列摘要相关联,从单个所有者和由签名证明的任意标识符或直接从内容派生而来。这证明通过签名或内容地址将 DISC 首字母缩略词解析为数据完整性是合理的。

    四、块加密

    1. **块应该默认加密**,除了客户对机密性的需求之外,加密还有两个更重要的作用。<br />(1) 通过加密混淆块内容提供了一定程度的似是而非的否认;全面使用它可以使这种防御更加强大。<br />(2) 选择任意加密密钥的能力以及均匀分布的特性提供了可预测的挖掘块的方式,即生成相同内容的加密变体,以便得到的块地址满足某些约束,例如离特定地址更近或更远。这是用于 (1) 价格套利和 (2) 邮票的有效使用的重要属性。

    块加密

    在 7.3.4 中正式规定(见图2)。小于 4 KB 的块用随机字节填充(从块加密种子生成)。完整的块明文使用基于 XOR 的分组密码进行加密和解密,该密码以相应的对称密钥为种子。为了不通过引入额外的加密原语来增加攻击面,选择的分组密码在计数器模式下使用 Keccak256,即将密钥与每个连续 32 字节段的计数器散列在一起。为了允许有选择地披露作为加密文件一部分的单个段,但不泄漏文件其余部分的信息,我们添加了一个额外的散列步骤,以导出块中某个段的加密密钥。该方案在 (EVM) 中实施起来既简单又便宜,适合用于限制加密 Swarm 内容明文的智能合约。

    image.png

    图2:Swarm 中的块加密。使用修改的反模式分组密码的对称加密,明文输入是用随机字节填充到 4 KB 的内容,跨度字节也被加密,就好像它们是有效载荷的延续一样。

    1. 编码块跨度的前置元数据也被加密,就好像它是块的延续一样,即使用计数器 128。加密的块内容使用 BMT 散列摘要进行散列,就像未加密的一样。块被加密的事实可以从跨度值猜测出来,但除此之外,在网络层,加密块的行为与未加密的块完全相同。<br /> 单个所有者块也可以加密,这只是意味着它们包装了一个加密的常规块。因此,它们的有效载荷和跨度反映了上述块内容加密,用标识符签名的哈希是加密的跨度和有效载荷的 BMT 哈希,即与包装块的相同。

    五、复制冗余

    1. 拥有一种弹性的数据请求方式很重要。为了实现这一点,Swarm 实施了纵深防御的方法。在请求由于转发问题而失败的情况下,可以与另一个对等方重试,或者为了防止这些情况发生,节点可以立即启动并发检索请求。但是,如果所有存储块的最后一个节点都从网络中退出,则此类回退选项不可用。因此,冗余对于确保数据可用性非常重要。如果最近的节点是所请求数据的唯一存储者并且它退出网络,则无法检索内容。这个基本场景是通过确保每组最近邻居保存与其中任何一个最接近的每个块的副本来处理的,复制块的存储并因此提供数据冗余。

    最近邻域的大小

    1. 如果 Kademlia 连接是在存储节点上定义的,那么在具有 Kademlia 拓扑的网络中存在深度 d,使得(1)每个小于 d 的邻近顺序 bin 包含至少 k 个存储节点,以及(2)所有具有邻近的存储节点更高的顺序实际上是连接的对等点。为了确保数据冗余,我们可以在这个定义中添加一个标准,即(3)由 d 定义的最近邻域必须至少包含 r 个对等点。<br /> 让我们将邻域大小 NHSx(d) 定义为由节点 x 的深度 d 定义的邻域的基数。然后,如果存在深度 d,则节点具有冗余因子为 r Kademlia 连接,使得(1)每个小于 d 的邻近顺序 bin 包含至少 k 个存储节点(k bin 密度参数),以及(2 ) 所有,邻近顺序为 d 或更高的存储节点实际上是连接的对等节点,并且 (3) NHSx(d) r。然后我们可以取最高深度 d,满足(1)和(2)。这样的 d 保证存在,并且 Hive 协议始终能够引导它。随着我们减少 d0,不同邻域的数量成比例地增长,所以对于任何冗余参数不大于网络大小 r N = NHSx(0),将有一个最高的 0 < dr d 0 使得 NHSx(dr) r。因此,始终可以实现冗余的 Kademlia 连接。<br /> 对于特定的冗余,全连接邻域的区域定义了责任区域。责任区的邻近顺序边界定义了节点的责任半径。如果块地址落在节点的职责范围内,则说存储节点负责(存储)块。在这一点上显示邻域及其结构已经很有指导意义,参见图 13

    冗余可检索性

    1. 如果一个块是可恢复的,并且即使在任何负责它的 r 个节点离开网络后仍然如此,则称该块具有度为 r 的冗余可恢复性。迄今为止提出的需要单个最近节点来保存内容的幼稚方法可以解释为零度可检索性。如果其职责范围内的节点完全复制它们的内容,那么 Swarm DISC 中的每个块都可以冗余检索,度数为 r。让我们取最接近块 c 的节点 x。由于它具有冗余 r Kademlia 连接,因此有 r + 1 个节点负责完全连接并复制内容的邻域中的块。在 r 个负责节点退出后,只剩下一个节点仍然拥有该块。但是,如果在 r 个节点离开时保持 Kademlia 连接,则该节点将继续可被网络中的任何其他节点访问,因此该块仍可检索。现在,为了让网络确保所有块都可以在度 r 下冗余检索,包含由于网络重组而形成的新邻居的节点必须通过重新同步它们的内容来响应,以满足协议的复制标准。这称为最终一致性的保证。

    image.png

    图 3:最近的邻居。顶部:每个 PO 定义一个邻域,节点的邻域深度(黑色圆圈)定义为最高的 PO,使得邻域至少有 R=4 个节点(冗余参数),并且所有较浅的 bin 都是非空的。底部:一个不对称的社区。橙色节点的最近邻居包括黑色节点,但反过来不包括。

    资源限制

    1. 让我们假设 (1) 沿着稳定节点中继请求的转发策略和 (2) 最近邻域(r 个存储节点)中的每个节点存储其地址在其职责范围内的所有块的存储策略.只要这些假设成立,每个块都是可检索的,即使r 个存储节点同时离线。对于(2),我们仍然需要假设最近邻集中的每个节点都可以存储每个块。然而,实际上,所有节点都有资源限制。随着时间的推移,上传到 Swarm 的不同块的总量将无限增加。除非总存储容量稳步增加,否则我们应该期望 Swarm 中的节点只能存储块的子集。一些节点将达到其存储容量的限制,因此面临是通过同步停止接受新块还是通过删除一些现有块来腾出空间的决定。<br /> 从本地存储清除块的过程称为垃圾收集。指示选择哪些块进行垃圾收集的过程称为垃圾收集策略。对于利润最大化的节点,它认为最好对预测未来利润最低的块进行垃圾收集,并且为了最大化利润,希望节点能够正确预测。因此,为了考虑这些容量约束,我们将引入块值的概念并使用最小值约束修改我们的定义:<br />在 Swarm DISC 中,任何时候都有一个块值 v,这样每个值大于 v 的块都是可检索的,并且最终(同步后)可以冗余检索度数为 r。<br /> 该值理想地对应于保留上传者需要指示的块的相对重要性。为了让存储节点尊重它,该值还应与块的盈利能力保持一致,因此在上传的定价中表示。