为什么我应该散列 Near Protocol Unordered_Map 中的密钥?

Why should I hash keys in the NearProtocol UnorderedMap?

在 Near NFT 示例中,为什么键在 account_gives_access Unordered_Map 哈希中? https://github.com/near-examples/NFT/blame/master/contracts/rust/src/lib.rs

pub struct NonFungibleTokenBasic {
    pub token_to_account: UnorderedMap<TokenId, AccountId>,
    pub account_gives_access: UnorderedMap<AccountIdHash, UnorderedSet<AccountIdHash>>, 
    pub owner_id: AccountId,
}

UnorderedMap 类型使用 trie。攻击者可以通过以下方式使 trie 失衡 反复将键推到 trie 上,从而推动一侧的深度 尝试深入。这会降低 trie 查找下面名称的性能 攻击者的。

缓解攻击的一种方法是存储密钥的哈希值。哈希将是 在可能的值之间平均分配。攻击者仍然可以执行 攻击,但生成特定的哈希值很难,所以一些协议说。

另一种缓解攻击的方法是使用 LookupMap,它使用 AVL 树,它会自动重新平衡它的树。

这次袭击没有太大威胁。攻击者能做的最坏的事情是 通过重复支付存储成本来惩罚小范围的键值 将极其有限的键值范围推到 trie 的更下方。因此,大概 不值得支付散列密钥的费用。

然而,对于存储大量键、散列键或LookupMap的树,可能仍然 值得考虑,因为很可能会导致不平衡的 trie。

回顾一下,我们回顾了以下之间的成本比较:

  • 在存储和检索到 UnorderedMap
  • 之前散列每个键
  • 允许上述“攻击”
  • 使用 LookupMap 而不是 UnorderedMap

感谢@MikePurvis 的解释。