decl_storage!
是一个“程序宏”,用于存储数据以使其在后续 block 中可用。
它表示如果用户能够在 double_map
中设置第一个 key 对,那么我们就不能信任该 key 对,因此我们必须使用加密哈希器例如 blake2_256
以防止“所有存储项的其他值受到损害”。
接着说,如果用户能够在double_map
中设置第二个 key 对,那么我们就不能信任该 key 对,所以我们必须使用加密哈希器(例如 blake2_256
)来防止“存储中具有相同第一个 key 的其他项目被泄露”。
关于第一 key 对,为什么说只是为了防止“所有存储项的其他值被泄露”? blake2_256
不是也用于防止第一个 key 对本身被泄露(而不仅仅是“其他值”)吗?
最佳答案
假设 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
的值并导致安全问题。
这就是为什么如果值由用户控制,则 double map 的 key1 的哈希函数需要是加密哈希函数。否则,用户可能能够制作value1
,使其与所有其他模块的存储发生冲突,从而损害它们。
如果用户无法控制 key2,double map 提供了清除所有带有 hash(key1) 前缀的键的功能,该功能也可能被劫持造成麻烦。
关于hash - 为什么在使用 decl_storage 时 `blake2_256` 无法防止 StorageDoubleMap 中的 "first key pair"受到损害?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56237091/