decl_storage!
是一个“过程宏”,用于存储数据以使其在后续块中可用。
它表示,如果用户能够在double_map
中设置第一个密钥对,那么我们将无法信任该密钥对,因此必须使用诸如{ {1}},以防止“所有存储项目的其他值都受到损害”。
然后继续说,如果用户能够在blake2_256
中的第二个密钥对中设置,那么我们将无法信任该密钥对,因此我们必须使用诸如double_map
之类的加密哈希器来防止“具有相同第一个密钥的存储中的其他项目受到破坏”。
关于第一个密钥对,为什么说这只是为了防止“所有存储项目的其他值都受到破坏” ? blake2_256
是否还用于防止第一个键对本身受到损害(而不仅仅是“其他值”)?
答案 0 :(得分:1)
假设module1.someValue
的哈希为0x12345678
module2.doubleMapValue.firstKey(value1)
的哈希为0x1234
module2.doubleMapValue.secondKey(value2)
的哈希为0x5678
这意味着module2.doubleMapValue.fullKey(value1, value2)
和module1.someValue
具有相同的哈希值。即这些值存储在同一位置。
如果用户能够同时控制module2.doubleMapValue
的两个键并找出value1
和value2
的值,那么他将大胆地覆盖module1.someValue
的值并导致安全问题。
这就是为什么如果值由用户控制,则双映射的key1的哈希函数需要为加密哈希的原因。否则,用户可能可以制作value1
,使其与所有其他模块的存储发生冲突,从而损害它们。
在用户不控制key2的情况下,double map提供了所有具有hash(key1)前缀功能的清晰键,这些键也可能被劫持,从而引起麻烦。