为什么使用bcl2_256在使用decl_storage时不能防止StorageDoubleMap中的“第一个密钥对”受到损害?

时间:2019-05-21 11:15:37

标签: hash rust substrate

decl_storage!是一个“过程宏”,用于存储数据以使其在后续块中可用。

它表示,如果用户能够在double_map中设置第一个密钥对,那么我们将无法信任该密钥对,因此必须使用诸如{ {1}},以防止“所有存储项目的其他值都受到损害”。

然后继续说,如果用户能够在blake2_256中的第二个密钥对中设置,那么我们将无法信任该密钥对,因此我们必须使用诸如double_map之类的加密哈希器来防止“具有相同第一个密钥的存储中的其他项目受到破坏”。

关于第一个密钥对,为什么说这只是为了防止“所有存储项目的其他值都受到破坏” blake2_256是否还用于防止第一个键对本身受到损害(而不仅仅是“其他值”)?

1 个答案:

答案 0 :(得分:1)

假设module1.someValue的哈希为0x12345678

module2.doubleMapValue.firstKey(value1)

哈希为0x1234

module2.doubleMapValue.secondKey(value2)

哈希为0x5678

这意味着module2.doubleMapValue.fullKey(value1, value2)module1.someValue具有相同的哈希值。即这些值存储在同一位置。

如果用户能够同时控制module2.doubleMapValue的两个键并找出value1value2的值,那么他将大胆地覆盖module1.someValue的值并导致安全问题。

这就是为什么如果值由用户控制,则双映射的key1的哈希函数需要为加密哈希的原因。否则,用户可能可以制作value1,使其与所有其他模块的存储发生冲突,从而损害它们。

在用户不控制key2的情况下,double map提供了所有具有hash(key1)前缀功能的清晰键,这些键也可能被劫持,从而引起麻烦。